Я хочу реализовать простой способ объявления / определения функций, которые должны быть добавлены в таблицу указателей функций в памяти R / O (программная флэш-память на устройстве AVR с использованием GCC, в частности) во время компиляции, а также иметь указатель функции по умолчанию, который помещается во все неиспользуемые записи. Например, если у меня есть 32 возможных записи, то следующее:
DEFAULTFUNC
void default_handler(...)
{
...
}
FUNC(28)
void handle_foo(...)
{
...
}
поместит указатель на handle_foo
в элемент 28 таблицы функций, а default_handler
в другой 31.
Я смотрел, как avr-libc реализует ISR()
для векторов прерываний, но кажется, что это зависит от некоторого внутреннего поведения GCC, которое я еще не нашел для размещения указателя функции в сегменте .vectors
. Как я могу имитировать это в коде для создания таблицы указателей функций в сегменте .{,rel{,a}.}rodata
, если это необходимо?
BADISR_vect
? (см. nongnu.org/avr-libc/user-manual/group__avr__interrupts. html) - person ouah   schedule 08.11.2013# define BADISR_vect __vector_default
, а потом я потеряюсь в магии GCC. - person Ignacio Vazquez-Abrams   schedule 08.11.2013ISR(BADISR_vect) { /* user code here */ }
. - person ouah   schedule 08.11.2013func_t interrupt_vector [] = {default, default, timer5, default, adc, default ...
. В этом случаеdefault
будет просто именем функции по умолчанию. - person Lundin   schedule 15.08.2017