1

我正在尝试让 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. 当我在 address 执行指令时00012388,处理器出现故障。

由于这条指令是 a 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() {
}

谢谢!

4

1 回答 1

2

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

再次感谢。

于 2013-07-08T03:08:30.103 回答