C 环境初始化裸机 ARM GCC

     2023-02-19     81

关键词:

【中文标题】C 环境初始化裸机 ARM GCC【英文标题】:C Environment Init Bare Metal ARM GCC 【发布时间】:2013-07-04 16:45:20 【问题描述】:

我正在尝试让 C++ 项目在 cortex-m0 处理器上运行(具体来说是 nRF51822)。我正在使用 codesourcery lite g++ 2013.05.23。我正在使用 codesourcery (newlib) 和 CS3 c init 例程 __cs3_start_c 附带的 clib。我重写了 __cs3_restart 和 __cs3_start_asm 函数。

我可以使用 clib _init 函数,它是从 __libc_init_array 之类的东西调用的。当我在地址00012388 处执行指令时,处理器出现故障。

由于这条指令是pop,我立即怀疑堆栈指针无效;但是,在故障之前捕获的寄存器值表明并非如此。任何想法为什么处理器出现故障?如何初始化 C++ 环境以便开始运行代码?

_init:
00012384:  _init+0                push r3, r4, r5, r6, r7, lr
00012386:  _init+2                nop ; (mov r8, r8)
00012388:  _init+4                pop r3, r4, r5, r6, r7
0001238a:  _init+6                pop r3
0001238c:  _init+8                mov lr, r3
0001238e:  _init+10               bx lr

注册值:

Register       Val: Hex     Val: Dec
r0             0x20008d8    33556696
r1             0x123c0  74688
r2             0xa68    2664
r3             0x2001340    33559360
r4             0x0  0
r5             0x12390  74640
r6             0x0  0
r7             0x12c90  76944
r8             0xffffffff   4294967295
r9             0xffffffff   4294967295
r10            0xffffffff   4294967295
r11            0xffffffff   4294967295
r12            0xffffffff   4294967295
sp             0x2003fb8    0x2003fb8
lr             0xff89   65417
pc             0x12388  0x12388 <_init+4>
xpsr           0x41000003   1090519043
MSP            0x2003fb8    33570744
PSP            0xfffffffc   4294967292
PRIMASK        0x0  0
BASEPRI        0x0  0
FAULTMASK      0x0  0
CONTROL        0x0  0

我正在尝试编译的代码如下我没有任何静态分配的类,所以我不太明白为什么这段代码甚至会运行。

Main.cpp
volatile int i = 4;
volatile int j = 0;
volatile int k;
int main(void)

    for(;j< i; j++)
     
    k = k +2;
    

TestClass * tc = new TestClass(3);
while(1);


Testclass.h
class TestClass 
public:
    int i;
    TestClass(int num);
    virtual ~TestClass();
;

TestClass.cpp
TestClass::TestClass(int num) 
    this->i = num;


TestClass::~TestClass() 

谢谢!

【问题讨论】:

C++ 代码在哪里?您是否有任何需要在启动时初始化的变量(即全局变量)?如果是这样,其中一个可能是罪魁祸首。 执行 int main() while(1) ; 为你工作? 【参考方案1】:

抱歉给大家添麻烦了,问题解决了。堆栈指针坏了。堆栈的顶部应该设置为 0x20040000,它实际上设置为 0x02040000。我只是很惊讶代码做到了没有错误。

再次感谢。

【讨论】:

arm裸机开发:c语言点亮led(代码片段)

...:C语言点亮LED一、硬件平台:二、汇编搭建C开发环境2.1STM32启动代码2.2I.MUX启动代码三、C语言驱动程序四、实验现象ARM裸机开发:C语言点亮LED一、硬件平台:正点原子I.MX6U阿尔法开发板二、汇编搭建C开发环境使... 查看详情

arm裸机开发篇1:cortex-a7开发环境搭建

写在前面:本文章为《ARMCortex-A7裸机开发篇》系列中的一篇,全系列总计11篇。笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。针对FS-MP1A开发板,除了Cortex-A7裸机开发篇外,还包括其他多... 查看详情

s3c2440——实现裸机的简易printf函数

...tf函数,但是,那是IDE帮我们做了一些事情。刚开始在ARM9裸机上自己写printf的实现的时候,包含对应头文件也会提示vsprintf函数找不到,查询很多资料之后,发现使用arm-linux-ld就是找不到对应的库函数,换成arm-linux-gcc使用,arm-li... 查看详情

在ubuntu下,安装arm-linux-gcc交叉编译器,环境变量也都设置好了

arm-linux-gcc-v执行成功,但执行arm-linux-gcc时却出现arm-linux-gcc:noinputfiles,什么原因啊?求教各位大虾参考技术Anoinputfiles,不就是没有输入文件嘛。难道是你在执行这条命令时没有加上源码文件??或者这个文件不再当前目录下?... 查看详情

arm裸机开发:i.mx6u启动方式

...#xff1a;二、启动方式选择2.1串行下载2.2内部BOOT模式2.3BOOTROM初始化内容2.4内部BOOT启动设备三、镜像烧写3.1IVT+Bootdata存放内容:3.2DCD数据ARM裸机开发:I.MX6U启动方式一、硬件平台:正点原子I.MX6U阿尔法开发板二、启 查看详情

完整的嵌入式学习路线是怎样的?

...成了几个层次,分层浏览。第一层目录:0.基础预科1.ARM裸机全集2.uboot和linux内核移植3.linux驱动开发4.C语言专题精讲篇5.linux应用编程和网络编程6.阶段项目篇说明:第一层目录中共有6个部分,共同构成了嵌入式核心课程。每个部... 查看详情

arm(imx6u)裸机c语言版本led驱动实验(代码片段)

参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译作者:一只青木呀发布时间:2020-08-1111:20:17网址:https://blog.csdn.net/weixin_45309916/article/details/107930284目录0.简介①、汇编文件②、C语言文件1.汇 查看详情

为 64 位 arm 设计选择 gcc 编译器

...述】:我一直在32位iMX6qSABRE-SD板(ARMCortex-A9)上进行一些裸机编程。我使用“arm-none-eabi”作为工具链。现在,我想将我编写的所有代码移植到64位armCortex-A57(R-CarM3板)。我将如何为此任务选择编译器 查看详情

arm(imx6u)裸机c语言蜂鸣器驱动实验(代码片段)

参考:Linux之ARM(IMX6U)裸机C语言蜂鸣器驱动实验–驱动编写,编译作者:一只青木呀发布时间:2020-08-1614:47:23网址:https://blog.csdn.net/weixin_45309916/article/details/108032168目录1、有源蜂鸣器简介2、硬件原理分析3... 查看详情

gcc和arm-linux-gcc是啥关系?区别是啥?

...。arm-linux-gcc是什么意思?就是告诉你的编译器,我编写的环境是linux,但是我希望生成的可执行程序是在arm上面跑的。这就是交叉编译。编写环境和执行环境分离的一种手段。参考技术Agcc编译出来的程序在本地执行arm-linux-gcc编译... 查看详情

转载:4412环境搭建:arm-linux-gcc:没有那个文件或目录

4412环境搭建:arm-linux-gcc:没有那个文件或目录2014年10月15日 ? 环境搭建 ?共993字?字号 小 中 大 ? 评论11条 ?阅读6,125次最近弄了个4412的板子(友善之臂的Tiny4412增强版),准备搞搞android,开发服务... 查看详情

mac上怎么切换gcc的版本

...有-C而且是大写,后边有个空格也要注意。4、配置下编译环境路径在控制台下输入gedit/root/.bashrc等一会出来文本编辑器后在文件最后(最后一行)加上下面代码。exportPATH=/usr/local/arm/4.3.2/bin:$PATH保存关闭后,注销当前用户,用root... 查看详情

如何安装arm-linux-gcc

对于嵌入式linux的来说,建立开发环境是开发的第一步,arm-linux-gcc是基于arm架构的linux平台交叉编译工具。工具原料:linux+下载arm-linux-gcc-4.4.3.tar.gz安装包。安装arm-linux-gcc方法如下:一、下载arm-linux-gcc-4.4.3.tar.gz安装包。二、打... 查看详情

ubuntu交叉编译(gcc-linaro-arm-linux-gnueabihf)环境搭建(代码片段)

转载,原链接为:https://www.cnblogs.com/flyinggod/p/9468612.html 1.下载gcc-linaro-arm-linux-gnueabihf-4.9.tar.gz下载地址参考:http://blog.csdn.net/lg1259156776/article/details/522813232.解压, 查看详情

exynos4412交叉编译环境搭建(代码片段)

Exynos4412交叉编译环境搭建交叉编译:在PC机(x86平台)上开发程序,在ARM板上运行,提高开发、编译速度。环境:Tiny4412SDK1506开发板需要软件:arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz检测系统是否已经安装有交叉编译环境:#arm-linux-gcc-vba... 查看详情

gcc和arm-linux-gcc是啥关系?区别是啥?

...arm-linux-gcc是什么意思?就是告诉你的编译器,我编写的环境是linux,但是我希望生成的可执行程序是在arm上面跑的。这就是交叉编译。编写环境和执行环境分离的一种手段。参考技术Agcc是在linux下编译时用的命令,编译出来的程... 查看详情

arm(imx6u)裸机官方sdk移植(代码片段)

参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译作者:一只青木呀发布时间:2020-08-1111:20:17网址:https://blog.csdn.net/weixin_45309916/article/details/107930284目录1、I.MX6ULL官方SDK包简介2、 查看详情

linux下,gcc环境,c语言,使用opencl, 如何做一个有button的界面?

...想怎么实现,是在字符界面?图形界面。什么软件库支持环境?Xorg图形环境下,GTK和QT都可以方便实现。自己写实现库直接调用xorg的功能也可以,不过xorg的功能很简单,自己写图形库会累死,但是依赖环境很小。字符界面,你... 查看详情