2008-12-27 54 views
12

是否可以关闭特定功能的优化? 我的一个朋友有问题,gcc优化使一些(我不知道)μ控制器代码不起作用。 我们知道它是哪些功能,但我们不知道代码本身的线索,所以最简单和最安全的方法可能是将其关闭以用于整个功能。关闭gcc中特定功能的优化4.2.2

不幸的是http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html显示有一个优化函数属性/编译指示,但它需要gcc 4.4,我们没有。

在此先感谢

+2

为什么不修复代码而不是尝试解决警告? – 2008-12-28 07:59:27

+0

GCC 4.3.2是当前最新版本的GA版本,所以没有GCC 4.4并不奇怪。您提供的信息很有趣 - 谢谢。 – 2008-12-29 20:09:49

回答

12

如果编译指示不适用于您,请尝试将该函数拆分为它自己的文件,然后在没有设置优化标志的情况下编译该文件。

3

我不能肯定地说,但据我所知,没有这样的可能性。但是,优化不应该改变明确定义的代码的语义。这里唯一可能发生的事情是变量被内联,或者读/写的顺序被改变。

第一个,也可能是两个问题都可以通过将变量声明为volatile来解决,因此向编译器显示,编译器不应仅根据程序流程对其内容进行假设。

+0

我认为这一点,它只是将它作为一个函数属性或类似的东西。谢谢 – 2008-12-27 16:51:56

7

你可以把这个函数放在一个单独的文件中,然后编译这个文件而不进行优化,但更好的解决方案是找出代码的错误并修复它。

使用gcc启用优化时出现的最常见错误之一是严格别名。确保所有警告已启用,并查看是否有任何警告可帮助您找出问题所在。如果您无法弄清楚,请尝试将问题简化为一个小而完整的程序并将其发布到此处。

4

将函数放在自己的文件中,我不认为有任何方法可以使用早期版本的GCC关闭功能级别的函数优化。但不是关闭这个函数的优化,你可以尝试在整个程序中选择关闭某些类型的优化。虽然你已经发现了这个特定函数中的一个错误,但这可能表明存在其他未发现的错误。

正如其他人指出的,这可能是罪魁祸首是关于'strict aliasing'的优化。尽管从长远来看,您可能应该修复有问题的代码,在短时间内,您可以在命令行中添加'-fno-strict-aliasing'来玩游戏。在-O2及以上版本中,编译器对指针之间的交互作出了某些假设。增加这个选项告诉它不要做这些假设。

如果此操作失败,并且由于某些原因代码无法修复,您可以尝试禁用其他optimization options

5

迄今为止的答案忽略了原始问题中的关键词,它们是“微控制器代码”。在编写代码时禁用 优化是非常常见的 - 积极的优化器将“优化” 副作用是驱动控制器。这是与应用程序 编码不同的世界。对于通常编程空间中的应用程序,为了避免将卡农总结(请参见维基百科) 优化为虚无,我来到这里查看 的相同信息。因此,我们不要假设生成不同程序行为的优化级别 的更改自动成为错误代码的标志。 聪明地使用volatile关键字可能会掩盖某些事物,在某些情况下,应该生成实际的汇编语言并检查它。 (我相信这个 仍然可以用-S切换到gcc来完成)。让我们记住C的意图是成为一种便携式汇编程序,而不是一种COBOL。

戴夫

3

我知道这是一个旧的职位。 OP给出的GCC页面实际上是这样说的: 为了防止这样的调用被优化掉,把asm(“”);在函数中。 我想这是一个简单的解决方法。只要把它弄出来,希望它可以帮助其他像我一样的人 。

2

对于仍在使用旧版本gcc的人: 较新版本的gcc解决了这个问题。我已经在gcc-4.5.1中成功使用了它。 Goodluck。