Псевдоним GCC для работы вне модуля перевода -AKA- это даже подходящий инструмент для работы? - PullRequest
8 голосов
/ 04 октября 2011

Я работаю с 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

Ответы [ 4 ]

8 голосов
/ 04 октября 2011

Вы должны быть в состоянии сделать это либо с помощью сценария компоновщика, либо путем передачи соответствующей опции компоновщику, например.для ld --defsym=SVC_Handler=vPortSVCHandler

См. документацию binutils для получения дополнительной информации о параметре ld --defsym и назначениях в сценариях компоновщика

2 голосов
/ 18 февраля 2016

Я думаю, что проблема с псевдонимом состоит в том, что он ожидает объявленную и определенную функцию, поскольку это просто псевдоним. Вы хотите использовать его как предварительное объявление другой функции. У меня есть похожая вещь для такой работы:

void SVC_Handler(void) asm("vPortSVCHandler");

Это переименовывает точку входа SVC_Handler, и если вы не определите ее, она должна найти vPortSVCHandler.

См .: https://gcc.gnu.org/onlinedocs/gcc/Asm-Labels.html

1 голос
/ 08 апреля 2013

Другое решение, которое я почерпнул из одного из примеров FreeRTOS, заключается в добавлении следующего к вашему FreeRTOSConfig.h ...

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names - or at least those used in the unmodified vector table. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

Исходный файл из FreeRTOS / Demo / CORTEX_M0_LPC1114_LPCXpresso / RTOSDemo / Source/FreeRTOSConfig.h, который также интегрирует системные часы CMSIS в конфигурацию.Очень хорошая отправная точка для проекта CMSIS / FreeRTOS.

0 голосов
/ 04 октября 2011

Я почти уверен, что обработчик SVC используется только FreeRTOS при первоначальном запуске, поэтому добавление обработчика исключений косвенного обращения не приведет к снижению производительности (но это ужасно).Лучше всего спросить об этом на форуме FreeRTOS, там обычно хороший ответ.

Надеюсь, это поможет, С наилучшими пожеланиями, Дейв

...