Я работаю с 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")));
Это приводит к: ошибке: 'SVC_Handler' псевдоним неопределенного символа 'vPortSVCHandler '
Оказывается, согласно документации GCC здесь http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html , чтобы использовать псевдоним
атрибут, вы не можете присвоить символу псевдоним вне единицы перевода. Поэтому я решил попробовать extern
символ в main.c следующим образом:
extern void vPortSVCHandler( void ) __attribute__ (( naked ));
void SVC_Handler(void) __attribute__ ((alias ("vPortSVCHandler")));
Это вызывает ту же ошибку. Любые предложения ???
Я действительно хотел бы избежать изменения какой-либо из библиотек. Я знаю, что могу написать функцию SVC_Handler
, которая просто вызывает vPortSVCHandler
, но это может добавить ненужные накладные расходы на ISR (возможно, в зависимости от настроек оптимизации). Примечание. В примерах FreeRTOS это достигается с помощью настраиваемого файла запуска.Я ищу способ сделать это из моего скрипта компоновщика C или .