2014-02-19 6 views
0

Я начинаю делать некоторые простые проекты на STM32L152 Cortex-M3 ...Как настроить обработчик исключений для Cortex-M3

Я прочитал, что M3 является Thumb2 только и, таким образом, мы должны держать LSB обработчиков исключений обращается к «1», чтобы оставаться в режиме большого пальца.

.thumb 
.section .startup, "ax" 
exc_vectors: 
     .word top_of_stack 
     .word reset_handler 
     .word NMI_handler 
     .word hardfault_handler 
      . 
      . 
reset_handler: 
      @some code here 

Поскольку инструкции 16-бит или 32-бит, это правильно сказать, что символ «reset_handler» будет иметь адрес с LSB = 0?

Если это так, как обычно, когда/когда/где устанавливается LSB символов обработчиков (reset_handler, NMI_handler и т. Д.) На «1»?

Большое спасибо

ответ

0

Компилятор Си сделает это само по себе, так что вы можете расслабиться.

Ядро Cortex-M3 является 32-разрядным. Вектор 'reset_handler' имеет адрес 0x04. Вы правы, все векторы будут иметь LSB == 0, НО! Если вектор сброса начинается с адреса 0x0B0C, как это:

   ResetISR: 
00000b0c: F7FFBEC4 B.W    _c_int00 
00000b10: 4770  BX 

, то компилятор будет писать внутри векторной таблицы как 0x0B0D, как это:

00000004: 00000B0D ANDEQ 
+0

спасибо, еще 2 вопроса: как будет компилятор C знает, что «ResetISR» - это процедура обработчика исключений (чтобы добавить 1 к адресу)? Кроме того, что, если я использую сборку для написания моей программы запуска и ISR, вместо использования C? Я просто добавляю 1 к адресам обработчиков в векторной таблице? – foob

+0

при создании проекта C будет создан код запуска; он будет содержать векторную таблицу с директивой #pragma, чтобы поместить ее с помощью правил таблицы векторов, а в этом векторе будет указатель на функцию ResetISR. Если вы используете ассемблер, вы просто добавляете 1, это правильно. – kirill

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