2013-07-07 3 views
1

Я пытаюсь получить проект на C++ для работы на процессоре cortex-m0 (конкретный вариант nRF51822). Я использую codeourcery lite g ++ 2013.05.23. Я использую клифф, который поставляется с кодовым кодом (newlib) и подпрограммой CS3 c init __cs3_start_c. Я переписал функции __cs3_restart и __cs3_start_asm.C Environment Init Bare Metal ARM GCC

Я могу дойти до кливера _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. Я просто удивлен, что код сделал это, насколько это возможно, без ошибок.

Еще раз спасибо.

Смежные вопросы