我和GCC一起工作-手臂嵌入和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"
...
);
}发布于 2016-07-15 07:04:12
尝试从标记为used的单独函数中调用该函数。
void dummyFunction(void) __attribute__((used));
// Never called.
void dummyFunction(void) {
vTaskSwitchContext();
}发布于 2018-05-04 10:06:23
您可以将-Wl,--undefined=vTaskSwitchContext添加到LDFLAGS中。
发布于 2019-06-22 16:28:21
出于某种原因,迪特里希提出的解决方案对我无效。我使用的是Infineon的Dave4(基本上是用一个花哨的代码生成插件来开发XMC微控制器),这可能是它没有工作的原因。对我来说,我不得不在vTaskStartScheduler()之后打电话给vTaskStartScheduler()
int main(){
initializationCode();
vTaskStartScheduler();
//Code never reaches here
vTaskSwitchContext();
}https://stackoverflow.com/questions/38389702
复制相似问题