2013-07-07 2 views
1

cortex-m0 프로세서 (구체적으로는 nRF51822)에서 작동하는 C++ 프로젝트를 얻으려고합니다. 나는 codesourcery lite g ++ 2013.05.23을 사용하고 있습니다. 나는 codesourcery (newlib) 및 CS3 c init 루틴 __cs3_start_c와 함께 제공되는 clib을 사용하고 있습니다. 필자는 __cs3_restart 및 __cs3_start_asm 함수를 다시 작성했습니다.C 환경 Init Bare Metal ARM GCC

__libc_init_array 같은 것으로부터 호출 된 _init 함수까지 도달 할 수 있습니다. 주소 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으로 설정되어 있어야합니다. 나는 그 코드가 잘못하지 않은 한 그것을 만들었다는 사실에 놀랐다.

다시 한번 감사드립니다.