![](/img/trans.png)
[英]Difference between the GNU ARM Embedded Toolchain and normal gcc/g++ with bare metal ARM architecture
[英]C Environment Init Bare Metal ARM GCC
我正在嘗試讓一個C ++項目在cortex-m0
處理器(具體來說是nRF51822
)上工作。 我正在使用codesourcery lite g ++ 2013.05.23。 我正在使用代碼源(newlib)和CS3 c初始化例程__cs3_start_c隨附的clib。 我已經重寫了__cs3_restart和__cs3_start_asm函數。
我可以深入到clib _init
函數,該函數從__libc_init_array
東西__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。 我很驚訝代碼達到了它沒有錯誤的程度。
再次感謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.