Я работаю с GCC-ARM-Embedded и FreeRTOS. FreeRTOS имеет функцию vTaskSwitchContext()
, которая используется только в некотором встроенном коде на ассемблере.
Проблема в том, что когда я использую LTO, GCC не учитывает встроенный ассемблерный код и считает, что функция не используется, поэтому удаляет ее. Затем компоновщик дает сбой, потому что вызов функции во встроенном коде ассемблера не может быть разрешен.
Я бы применил __attribute__((used))
, но не хочу трогать код FreeRTOS (он сгенерирован STM32CubeMX).
Я попытался поместить это в свой код, но на самом деле GCC достаточно умен, чтобы не позволить этому работать:
if(false)
vTaskSwitchContext();
Есть ли способ сообщить GCC в другом исходном файле или через параметр, что эту функцию не следует удалять?
Пример
// file1.c
void vTaskSwitchContext( void )
{
...
}
// file2.c
void xPortPendSVHandler( void )
{
__asm volatile
(
...
" isb \n"
" bl vTaskSwitchContext \n"
" mov r0, #0 \n"
...
);
}