我正在尝试让一个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() {
}
谢谢!
答案 0 :(得分:2)
很抱歉让每个人都烦恼,弄明白了这个问题。堆栈指针很糟糕。堆栈顶部应该已设置为0x20040000,实际上设置为0x02040000。我只是惊讶于代码在没有错误的情况下做到了。
再次感谢。