для встроенного устройства, у меня есть файл, содержащий массив с указателями на функцию, хранящих обработчик прерываний, определяет, что, как (я не могу изменить его):переопределить слабую функцию А с функцией В
typedef void (*const ISRFunction)(void);
__attribute__((weak)) void ISR0(void){ for(;;); }
__attribute__((weak)) void ISR1(void){ for(;;); }
...
__attribute__((weak)) void ISR78(void){ for(;;); }
...
ISRFunction __vector_table[0x79] =
{
(ISRFunction)&ISR0,
(ISRFunction)&ISR1,
...
(ISRFunction)&ISR78,
...
}
I есть второй файл, который определяет некоторые функции, которые я не могу изменить. Этот файл, как:
void blinkLed(void)
{ ... }
Наконец, у меня есть главный исходный файл, с main
функции и конфигурации устройства. На прерывании 78, я хотел бы моргнуть во главе. Итак, я пишу сильную функцию ISR78
так:
void ISR78(void)
{
blinkLed();
}
Интересно, есть ли решение отменить слабую функцию ISR78
непосредственно blinkLed
, т.е. хранящий адрес blinkLed
внутри __vector_table
без изменения или переименовать функцию?
РЕДАКТИРОВАТЬ:
Я использую GNU GCC 4.9.3 и связанного с линкера (ГНУ Л.Д. 2.24.0). Я могу изменить main.c
и Makefile, связанные проецировать
Некоторые компиляторы (не знают о ваших) поддерживают псевдонимы символов, которые могут быть чем-то интересным. – user694733
Кроме того, вы должны быть очень конкретны в отношении типов функций: 'void func (void)' (без аргументов) и 'void func()' (неопределенное количество аргументов) - это разные типы. Используйте 'void' всегда для функций без аргументов, чтобы избежать проблем. – user694733
@ user694733 спасибо за совет, я позабочусь об этом – Garf365