我使用 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"
...
);
}