Псевдоним 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или же мой скрипт компоновщика.

Версия компилятора: версия gcc 4.5.2 (Sourcery G ++ Lite 2011.03-42)Цель: рука-нет-eabi

Ответы на вопрос(4)

Ваш ответ на вопрос