Я работаю с 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 или моего скрипта компоновщика.
- Версия компилятора: gcc версия 4.5.2 (Sourcery G ++ Lite 2011.03-42)
- Цель: arm-none-eabi