新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > DSP编程技巧之28---答疑解惑哪家强之(3)

DSP编程技巧之28---答疑解惑哪家强之(3)

作者:paradoxfx时间:2014-12-01来源:电子产品世界收藏

  19. 编译器的优化选项那么多,有什么通用的模版可以既快速配置优化选项,又能达到较为合适的优化效果?

本文引用地址:http://www.eepw.com.cn/article/266191.htm

  关于编译器的优化选项,我们确实讲了很多(http://www.eepw.com.cn/article/203169.htmhttp://www.eepw.com.cn/article/215180.htm,对很多初学者来说可能面临“选择恐惧症”。所以我们仍然有必要制定一些流程化的方案,方便大家的使用。例如:

  1) 把代码尽可能根据功能划分到多个独立的文件中,这样在优化时可具有更多的级别供选择。这样做不光对优化有好处,对代码的模块化也是有利的。

  2) 使能符号调试功能--symdebug:dwarf或者 -g

  在不启用优化器的情况下,编写、编译和调试代码,这样做的目的是在编译之前首先能保证代码的功能是正确的。

  3) 启用优化功能,并再次验证代码的功能。如果有需要,还得对代码进行一定的调试。

  a) 优化的级别有0,1,2和3等不同级别,对应了不同类型和不同程度的代码优化。

   在启用优化的情况下,必须指定优化级别,否则优化选项会被编译器给忽略,同时显示给你一个警告信息。

   优化级别0 (--opt_level=0 或 -o0)是最低程度的优化。

   优化级别3 (--opt_level=3 或 –o3)是最高程度的优化。

  Ø 考虑从最低的优化级别开始进行验证。

  b) 从编译器版本6.0.1开始,又添加了优化级别4的支持,即(--opt_level=4 或 -o4)

  这个级别的优化针对的是链接之后的代码,它在链接完成之后,从整个应用程序的角度来进行可能的优化,具有进一步提高程序性能的潜力。与所有的优化选项一样,为了实现优化的效果,就需要多付出一定的编译时间,当然这个时间花费与的代码效率相比还是值得的。

  4) 为了调试优化过的代码,需要在使用--opt_level的同时开启符号调试选项-g。这保证了在保持代码调试功能的同时,仍然可以实现最大程度的代码优化。

  老版本的编译器中还可使用-mn选项,它可以在开启符号调试选项的同时提供一定的优化效果,但是此选项如今已经废止,再使用它不能起到任何效果了。

  5) 去掉符号调试选项(-g)

  a) 在已经验证了代码的功能之后,可以移除符号调试选项了。这是因为虽然符号调试选项对代码的效率影响非常小,但是在某些情况下可能会影响到特定代码的执行。例如,编译器在使用某些FPU32指令的情况下,可以对代码进行并行度更高的处理,或者减少NOP空指令的使用,这对应提高代码运行速度是有帮助的;在使用-g选项的情况下,则有可能会妨碍编译器充分发挥这一能力。如果对称不是特别“强迫”的话,也可以干脆不去管它。

  b) 在比较老版本的编译器手册中,建议在此步骤中使用--symdebug:skeletal选项。但是这是个已经废弃的参数,不再建议使用,即使使能了也不会再产生任何效果。

  c) 不开启-ss选项。

  这个选项可以把的表达式生成交叉列表,以注释的形式插入到编译生成的汇编代码中,方便我们查看/阅读生成的汇编代码。这个功能虽然方便了调试,但是显然也妨碍了对代码的优化。

  如果你希望把优化器所做的改动以注释的形式插入到编译生成的汇编代码中的话,则可以在开启了-g选项的前提下,使用-s选项。如果不使用-g,则-s与-ss的效果是相同的。

  20. 为什么开启代码优化之后,程序就无法实现正确的功能了?

   在开启代码优化之后,代码中的一些功能有可能会被编译器改变,例如:

   未初始化的变化会被优化掉;

   未正确使用volatile关键词的变量功能不正常;

   与标准ANSI C的结果有出入

   汇编函数没能正确保存/恢复寄存器的

  所以为了保证程序在代码优化之后仍然能正确地执行我们的意图,一定要认真阅读一下相关编译器选项的使用说明。这其中需要注意的一些典型问题,可以参考http://www.eepw.com.cn/article/255842.htm。

  21. volatile关键字能对我们有什么帮助?

  volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。volatile的使用场合可以包括:

   在中断或者别的任务中会被修改的变量

   可以被硬件改变的外设寄存器的值

   可以被其它处理器所修改的变量的值(用于多核的场合,例如OMAP等)

c++相关文章:c++教程



上一页 1 2 下一页

关键词: DSP CCS C/C++

评论


相关推荐

技术专区

关闭