C Environment Init Bare Metal ARM GCC

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

Я могу добраться до клипа _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() {
}

Спасибо!

1

Решение

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector