是否可以关闭特定功能的优化?我的一个朋友有一个问题,gcc优化使一些(我不知道)μ控制器代码不起作用.我们知道它是哪些函数,但是我们对代码本身没有任何线索,所以最简单和最安全的方法可能就是为整个函数关闭它.
遗憾的是http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html显示有一个优化函数属性/ pragma,但它需要gcc 4.4,这是我们没有的.
提前致谢
如果pragma对您不起作用,请尝试将该函数拆分为自己的文件,然后在未设置优化标志的情况下编译该文件.
您可以将该函数放在一个单独的文件中并在没有优化的情况下编译该文件,但更好的解决方案是找出代码的错误并修复它.
使用gcc启用优化时出现的最常见错误之一是严格别名.确保所有警告都已启用,并查看是否有任何警告可能有助于您找出问题所在.如果您无法弄清楚,请尝试将问题减少到一个小而完整的程序并在此处发布.
如果没有将函数放在自己的文件中,我认为没有办法使用早期版本的GCC关闭函数级别的函数优化.但是,您可以尝试在整个程序中选择关闭某些类型的优化,而不是关闭此功能的优化.虽然您已经确定了此特定功能中的错误,但这可能表明存在其他未发现的错误.
正如其他人指出的那样,罪魁祸首可能是对"严格别名"的优化.从长远来看,您可能应该修复有问题的代码,在短期内您可以将"-fno-strict-aliasing"添加到命令行.在-O2及以上,编译器对指针之间的交互作出某些假设.添加此选项会告诉它不要做出这些假设.
如果此操作失败,并且由于某种原因无法修复代码,则可以尝试禁用其他 优化选项.
到目前为止,答案忽略了原始问题中的关键词,即"微控制器代码".编写此类代码以禁用优化时非常常见 - 积极优化器将"优化"整个语句,其副作用是驱动控制器.这是与应用程序编码不同的世界.对于在通常的编程空间中的应用程序,我来到这里寻找相同的信息,以避免将Kahan求和(见维基百科)的例程优化为虚无.因此,我们不要假设生成不同程序行为的优化级别的更改自动成为错误代码的标志.可以通过巧妙地使用volatile关键字来克服某些事情,在某些情况下,应该生成实际的汇编语言并检查它.(我相信这仍然可以通过-S切换到gcc来完成).让我们记住,C是一种便携式汇编程序,而不是一种COBOL.
戴夫