我使用 GCC-ARM-Embedded 和 FreeRTOS。
FreeRTOS具有的功能vTaskSwitchContext()
仅在某些情况下使用
内联汇编代码。
问题是:当我使用LTO时,GCC不考虑内联汇编代码并认为该函数没有被使用,因此将其删除。然后链接器会失败,因为无法解析内联汇编代码中的函数调用。
我会申请__attribute__((used))
但我不想接触 FreeRTOS 代码(它是由 STM32CubeMX 生成的)。
我尝试将其放入我的代码中,但实际上 GCC 足够聪明,不允许它工作:
if(false)
vTaskSwitchContext();
有没有办法在不同的源文件中或通过参数告诉 GCC 这个函数不应该被删除?
Example
// file1.c
void vTaskSwitchContext( void )
{
...
}
// file2.c
void xPortPendSVHandler( void )
{
__asm volatile
(
...
" isb \n"
" bl vTaskSwitchContext \n"
" mov r0, #0 \n"
...
);
}
尝试从标记为单独的函数调用该函数used
.
void dummyFunction(void) __attribute__((used));
// Never called.
void dummyFunction(void) {
vTaskSwitchContext();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)