2011-02-01 2 views
2

Я строю кросс-компиляцию инструмента для чипа Stortaris LM3S8962 cortex-m3. Записанное мной тестовое приложение C++ будет выполняться в течение некоторого времени, а затем - с ошибкой. Неисправность возникнет, когда я попытаюсь получить доступ к аппаратным устройствам с отображением памяти. В настоящее время моя рабочая гипотеза заключается в том, что я пропускаю некоторые основные инициализации чипа в моей последовательности запуска.Зачем cortex-m3 сбросить адрес 0 в gdb?

Что я хотел бы понять, почему выполнение в gdb будет остановлено, а счетчик программ будет установлен на 0? У меня есть векторная таблица в 0x0, но первое значение - указатель стека. Должен ли я оказаться в одном из обработчиков ошибок, которые я указываю в таблице векторов?

(gdb) 
187  UARTSend((unsigned char *)secret, 2); 
(gdb) cont 

Continuing. 

lm3s.cpu -- clearing lockup after double fault 


Program received signal SIGINT, Interrupt. 
0x00000000 in g_pfnVectors() 

(gdb) info registers 
r0    0x1  1 
r1    0x32  50 
r2    0xffffffff  4294967295 
r3    0x0  0 
r4    0x74518808  1951500296 
r5    0xc24c0551  3259762001 
r6    0x42052dac  1107635628 
r7    0x20007230  536900144 
r8    0xf85444a9  4166272169 
r9    0xc450591b  3293600027 
r10   0xd8812546  3632342342 
r11   0xb8420815  3091335189 
r12   0x3  3 
sp    0x200071f0  0x200071f0 
lr    0xfffffff1  4294967281 
pc    0x1  0x1 <g_pfnVectors+1> 
fps   0x0  0 
cpsr   0x60000023  1610612771 

Цепь основы основана на gcc, gdb, openocd.

+0

не уверен, что компьютер равен нулю | 1, но посмотрите на этот реестр ссылок, это очень интересно. Я немного ржав на большом пальце2, обычный ARM с загрузкой инструкций с ручками будет проходить и инициализировать все указатели стека, хорошо ли вы инициализировали указатели стека или указатель стека подразумевает режим системы/пользователя? вы можете попробовать изменить все регистры ссылок. или если вы можете прочитать psr из gdb, прочитайте это и узнайте, в каком режиме вы находитесь. –

ответ

4

GDB счастливо дал вам некоторые подсказки:

очистки блокировочных после двойной ошибки

Вашего процессора был в запертой состояния. Это означает, что он не смог запустить обработчик прерываний «Hard Fault» (возможно, в его векторе есть 0).

Обычно я получаю их, когда забыл «прогнать» перифер, результирующая ошибка шины сначала перерастает в «Жесткая ошибка», а затем в состояние «заблокировано». Следует упомянуть в руководстве вашего MCU, кстати.

+0

Прошло некоторое время с тех пор, как я задал этот вопрос, но я думаю, что вы правы. Я, кажется, помню, что причиной была ошибка шины, потому что я не инициализировал UART. Хорошо, что вы нашли время, чтобы добавить информацию в общедоступную запись. – mikelong

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