C环境初始化裸机ARM GCC
C Environment Init Bare Metal ARM GCC
我正试图让一个C++项目在cortex-m0
处理器(具体来说是nRF51822
)上运行。我正在使用codesourcery lite g++2013.05.23。我使用的是codesourcery(newlib)附带的clib和CS3cinit例程__CS3_start_c。我已经重写了__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() {
}
谢谢!
很抱歉打扰大家,解决了问题。堆栈指针不正确。堆栈的顶部本应设置为0x20040000,实际设置为0x02040000。我只是感到惊讶的是,代码竟然做到了没有错误的地步。
再次感谢。
相关文章:
- 使用 arm-none-eabi-gcc、newlib 和 cmake 连接 C/C++ STM32 项目
- 在类模板上使用 arm gcc 编译期间的隔离错误
- ARM GCC:冲突的 CPU 架构
- GCC ARM 交叉编译,像未定义的引用"__cxa_end_catch@CXXABI_1.3"这样的错误表示什么?
- 如何使用 arm-linux-gcc 交叉编译 gmock
- 在独立(裸金属)项目上使用std::tuple with arm none eabi gcc
- g++arm none eabi从4.9升级到gcc 8.2.生成的二进制文件不再适合闪存
- 如何在基于ARM的设备上正确构建GCC
- “__cpp”和 gcc 内联 ARM 汇编器
- GCC arm-none-eabi (Codesourcery) and C++ Exceptions
- 如何在Crosstools NG中以跨本地的方式使用candian来在arm板上获得gcc
- -l在arm none eabi gcc中的用法
- 如何阻止gcc在较新的ARM cpu上发出swap{b}
- 在Eclipse IDE中为OS X中的C/C++开发人员Mars设置gcc(嵌入gcc-arm)
- 链接使用 arm-none-eabi-g++ 成功,但不能使用 arm-none-eabi-gcc
- 如何在gcc的特定部分中放置一组变量,arm是否有类似#pragma default_variable_attribut
- Stringization char '#' 在 arm-linux-androideabi-gcc 上使用 c/c++ 宏
- 我可以用X64为ARM构建gcc吗
- C环境初始化裸机ARM GCC
- 使用ARM GCC编译列表迭代器时的模板编译时错误