Это, как представляется, таблица векторов прерываний для микроконтроллера ARM Cortex M.
одна особенности в ARM Cortex по сравнению с большинством других микроконтроллеров, является то, что он имеет указатель стека, поставленный перед началом программы. Другие MCU, как правило, устанавливают его во время выполнения.
Таким образом, самая первая запись в таблице - это значение, которое должен указывать указатель стека при запуске программы. __STACK_END
, вероятно, является константой, полученной из компоновщика. Листинг (void (*) (void))
превращает его в указатель функции. Кастинг от указателя на int до указателя функции немного сомнителен, но, скорее всего, он будет работать на большинстве встроенных компиляторов C, несмотря на то, что C-стандарт нахмурился.
Остальные записи являются функциональными адресами для прерывания сервисных процедур (функций). То есть, это то же самое, что и указатели на функции. Вы можете инициализировать указатель функции, указав ей имя функции.
Вся векторная таблица поэтому объявлена как массив указателей на функции, где каждая функция имеет подпись void func (void)
. Объявление *const
означает, что сами указатели функций доступны только для чтения. Это означает, что они будут распределены во флэш-памяти, как это необходимо для векторной таблицы. Векторные таблицы обычно выделяются фиксированным зарезервированным адресом во флэш-памяти.
красивее способ, чтобы написать тот же код будет таким:
typedef void (isr_t)(void);
isr_t* const [] = {
(isr_t* const)((uintptr_t)&__STACK_END), // The initial stack pointer
...
uintptr_t
является достаточно большой целочисленный тип, гарантированно иметь возможность содержать адрес, в отличие от unsigned long
.
пытается передать фактический адрес в тип указателя функции ... использовать его позже ... но я запутался в типах там ... –
Это выглядит как [таблица векторов прерываний] (https://en.wikipedia.org/wiki/Interrupt_vector_table). – user694733
Для справок в будущем вы всегда можете попробовать [cdecl] (http://cdecl.ridiculousfish.com/?q=void+%28*+const+rvt%5B%5D%29%28void%29) для подсказки. – Useless