Псевдоним 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")));

Это приводит к: ошибке: '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 или .

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

9
задан Brian McFarland 4 October 2011 в 15:04
поделиться