C Environment Init Bare Metal ARM GCC

时间:2013-07-07 00:15:09

标签: c++ gcc arm bare-metal

我正在尝试让一个C ++项目在cortex-m0处理器上运行(nRF51822是特定的)。我正在使用codesourcery lite g ++ 2013.05.23。我正在使用随代码源(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() {
}

谢谢!

1 个答案:

答案 0 :(得分:2)

很抱歉让每个人都烦恼,弄明白了这个问题。堆栈指针很糟糕。堆栈顶部应该已设置为0x20040000,实际上设置为0x02040000。我只是惊讶于代码在没有错误的情况下做到了。

再次感谢。