首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止GCC LTO删除功能

防止GCC LTO删除功能
EN

Stack Overflow用户
提问于 2016-07-15 06:56:25
回答 4查看 3.2K关注 0票数 11

我和GCC一起工作-手臂嵌入和FreeRTOS。FreeRTOS具有vTaskSwitchContext()函数,该函数仅用于某些内联汇编程序代码中。

问题是:当我使用LTO时,GCC不考虑内联汇编程序代码,而认为该函数没有使用,因此删除了它。链接器然后失败,因为内联汇编程序代码中的函数调用无法解析。

我会应用__attribute__((used)),但我不想接触FreeRTOS代码(它是由STM32CubeMX生成的)。

我试着把它放在我的代码中,但实际上GCC很聪明,不允许它起作用:

代码语言:javascript
复制
if(false)
    vTaskSwitchContext();

有没有办法告诉GCC在一个不同的源文件中,或者通过参数,这个函数不应该被删除?

示例

代码语言:javascript
复制
// file1.c
void vTaskSwitchContext( void )
{
    ...
}

// file2.c
void xPortPendSVHandler( void )
{
    __asm volatile
    (
    ...
    "   isb                                 \n"
    "   bl vTaskSwitchContext               \n"
    "   mov r0, #0                          \n"
    ...
    );
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-15 07:04:12

尝试从标记为used的单独函数中调用该函数。

代码语言:javascript
复制
void dummyFunction(void) __attribute__((used));

// Never called.
void dummyFunction(void) {
    vTaskSwitchContext();
}
票数 11
EN

Stack Overflow用户

发布于 2018-05-04 10:06:23

您可以将-Wl,--undefined=vTaskSwitchContext添加到LDFLAGS中。

票数 7
EN

Stack Overflow用户

发布于 2019-06-22 16:28:21

出于某种原因,迪特里希提出的解决方案对我无效。我使用的是Infineon的Dave4(基本上是用一个花哨的代码生成插件来开发XMC微控制器),这可能是它没有工作的原因。对我来说,我不得不在vTaskStartScheduler()之后打电话给vTaskStartScheduler()

代码语言:javascript
复制
int main(){

    initializationCode();

    vTaskStartScheduler();

    //Code never reaches here
    vTaskSwitchContext();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38389702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档