C环境初始化裸机ARM GCC

C Environment Init Bare Metal ARM GCC

本文关键字:ARM GCC 裸机 初始化 环境      更新时间:2023-10-16

我正试图让一个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。我只是感到惊讶的是,代码竟然做到了没有错误的地步。

再次感谢。