防止C ++ 11删除无限循环

vsz

本问题所述,C ++ 11优化了无限循环。

但是,在具有单一目的的嵌入式设备中,无穷循环是有意义的,并且实际上经常被使用。while(1);对于看门狗辅助的复位,即使是完全空的也很有用。终止但空循环在嵌入式开发中也很有用。

是否有一种优雅的方法专门告诉编译器在不完全禁用优化的情况下不要删除空循环或无限循环?

乔纳森·莱因哈特(Jonathon Reinhart)

要删除循环的要求之一(如该问题所述)是

  • 不访问或修改易失性对象

所以,

void wait_forever(void)
{
    volatile int i = 1;
    while (i) ;
}

应该可以解决问题,尽管我当然会通过查看使用您的特定工具链生成的程序的反汇编来验证这一点。

像这样的函数也将是GCCnoreturn属性的理想候选者

void wait_forever(void) __attribute__ ((noreturn));

void wait_forever(void)
{
    volatile int i = 1;
    while (i) ;
}

int main(void)
{
    if (something_bad_happened)
        wait_forever();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章