Псевдоним GCC для работы вне модуля перевода -AKA- это даже подходящий инструмент для работы?
Я работаю с FreeRTOS на STM32 (Cortex-M3) и использую библиотеку CMSIS из ST для начальной загрузки.
Библиотека CMSIS определяет слабый символSVC_Handler
в файле запуска ".s". Он должен быть где-то переопределен, чтобы получить ваш ISR в таблице векторов прерываний. FreeRTOS определяетvPortSVCHandler
, который является ISR, я хочу обработать прерывание SVC.
Я хотел бы «склеить» их вместе, используя мой код приложения (т.е. без модификации FreeRTOS или исходного кода CMSIS). Я думал, что псевдоним будет правильным инструментом для работы, поэтому я попробовал это (в отдельном исходном файле, main.c):
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
Это приводит к:error: 'SVC_Handler' aliased to undefined symbol 'vPortSVCHandler'
Оказывается, согласно документации GCC здесьhttp://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html, чтобы использоватьalias
атрибут, вы не можете использовать псевдоним символа вне единицы перевода. Так что я подумал, что попробуюextern
символ в main.c примерно так:
extern void vPortSVCHandler( void ) __attribute__ (( naked ));
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
Это генерирует ту же ошибку. Какие-либо предложения???
Я действительно хотел бы избежать модификации любой из библиотек. Я знаю, что мог бы написать функциюSVC_Handler
это просто звонкиvPortSVCHandler
, но это может добавить ненужные накладные расходы на ISR (возможно, в зависимости от настроек оптимизации). Примечание. Примеры FreeRTOS позволяют сделать это с помощью специального файла запуска. Я ищу способ сделать это из Cили же мой скрипт компоновщика.