Среда C Инициализация Bare Metal ARM GCC

Я пытаюсь заставить проект C++ работать на процессоре cortex-m0 (точнее, nRF51822). Я использую codesourcery lite g++ 2013.05.23. Я использую clib, поставляемый с исходным кодом (newlib), и процедуру инициализации CS3 c __cs3_start_c. Я переписал функции __cs3_restart и __cs3_start_asm.

Я могу дойти до функции clib _init, которая вызывается из чего-то вроде __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() {
}

Спасибо!


person Jake Kason    schedule 07.07.2013    source источник
comment
Где код С++? Есть ли у вас какие-либо переменные, требующие инициализации при запуске (например, глобальные переменные)? Если так, то один из них может быть виновником.   -  person Captain Obvlious    schedule 07.07.2013
comment
int main() { while(1) {}; } работать на вас?   -  person old_timer    schedule 07.07.2013


Ответы (1)


Извините за беспокойство, разобрался с проблемой. Указатель стека был плохим. Вершина стека должна была быть установлена ​​на 0x20040000, на самом деле она была установлена ​​на 0x02040000. Я просто удивлен, что код дошел до такой степени без ошибок.

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

person Jake Kason    schedule 08.07.2013