C-код для перемещения таблицы векторов - PullRequest
0 голосов
/ 27 июня 2018

У меня есть следующие строки кода

#define SCB_VTOR            SCB_VTOR_REG(SystemControl_BASE_PTR)
#define SCB_VTOR_REG(base)                       ((base)->VTOR)
/* VTOR Bit Fields */
#define SCB_VTOR_TBLOFF_MASK                     0xFFFFFF80u
#define SCB_VTOR_TBLOFF_SHIFT                    7
#define SCB_VTOR_TBLOFF(x)                       (((uint32_t)(((uint32_t)(x))<<SCB_VTOR_TBLOFF_SHIFT))&SCB_VTOR_TBLOFF_MASK)



extern uint32_t __vector_table[];
SCB_VTOR = (uint32_t)__vector_table;  

в моем файле main.c.

и моя __vector_table в разделе прерываний файла описания компоновщика выглядит следующим образом:

MEMORY
{
  m_interrupts  (rx) : ORIGIN = 0x00002000, LENGTH = 0xC0   /*192 Bytes*/
  ....
  ....
  ....
  ....

 .interrupts :
  {
    __vector_table = .;             
    . = ALIGN(4);
    KEEP(*(.vectortable)) /* Startup code */
    . = ALIGN(4);
  } > m_interrupts

Когда приходит прерывание, так как я загрузил регистр SCB_VTOR по адресу __vector_table, он будет указывать на текущее местоположение таблицы векторов справа ?? Что означает SCB_VTOR = (uint32_t)__vector_table; Указывает ли мой SCB_VTOR на адресную строку 0x00002000 строку кода? Заранее спасибо

1 Ответ

0 голосов
/ 27 июня 2018

__vector_table содержит адрес, когда он был включен в скрипт компоновщика (__vector_table = .; означает получить значение текущего адреса, то есть, если предыдущие разделы занимают 8 КБ, __vector_table будет содержать следующий адрес) .

Да, SCB_VTOR содержит адрес 0x00002000, учитывая, что раздел interrupts помечается звездочкой в ​​0x00002000, и, согласно сценарию компоновщика, первое, что нужно сделать, это получить адрес.

Имейте в виду, что некоторые CPU / MCU имеют фиксированную таблицу векторов, и она начинается в определенном регистре.

...