2013-07-07 93 views
1

我想獲得一個C++項目工作在cortex-m0處理器(nRF51822是具體的)。我正在使用codesourcery lite g ++ 2013.05.23。我使用codeourcery(newlib)和CS3 c init例程__cs3_start_c附帶的clib。我已經重寫了__cs3_restart和__cs3_start_asm函數。C環境Init裸機金屬ARM GCC

我可以得到儘可能多的clib _init函數,它從__libc_init_array之類的東西中調用。當我在地址00處執行指令時,處理器發生故障。

由於此指令是pop,我立即懷疑堆棧指針無效;然而,在故障之前捕獲的寄存器值指示了否則。任何想法爲什麼處理器是錯誤的?我能做些什麼來初始化C++環境,以便我可以開始運行代碼?

_init: 
00: _init+0    push {r3, r4, r5, r6, r7, lr} 
00: _init+2    nop ; (mov r8, r8) 
00: _init+4    pop {r3, r4, r5, r6, r7} 
00a: _init+6    pop {r3} 
00c: _init+8    mov lr, r3 
00e: _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

C++代碼在哪裏?你有沒有需要在啓動時初始化的變量(即全局變量)?如果他們其中之一可能是罪魁禍首。 –

+0

int main(){while(1){}; }爲你工作? –

回答

2

對不起,麻煩大家,想通了這個問題。堆棧指針很糟糕。堆棧的頂部應該被設置爲0x20040000,它實際上被設置爲0x02040000。我只是感到驚訝,代碼使它儘可能沒有錯誤。

再次感謝。