各位前辈大家好!!本人参加工作有一年多的时间了,在八个多月前自己主动要求加入到了一个项目组中(当时主要是想不能总在公司打酱油了,需要多向公司各位前辈们学习,实践动手积累些经验)。我们这个组中,硬件设计的有两个人,其中一位有近十年的工作经验了,另外也是一位参加工作有两年多的师兄了,而我跟另外一位同到公司工作的同事则协助一位早到公司一年的研究生师兄做软件方面的设计(因为师兄人特别热心而且很谦虚所以我们工作上面也都很积极主动的配合,并且师兄也要求我们同时参与到项目的软件设计之中,所以尽管我俩都很菜但我们依然得到了正式开发自己的代码的机会了...)。而又由于我们所设计的产品是需要干电池供电且工作时间要求是最少三年以上了,所以最后硬件方面选择了TI的低功耗处理芯片MSP430,于是我们三人一起学习MSP430F247型的单片机(我上大学那会只是在学校学习过51,所以对于430这个也相当于是入门级别的!),从初学到现在已经是发布了两款产品并且也都全部实现功能与达到大部分性能了(当然,性能可能还是需要到现场实际使用过后才会更好的体现或者说是发现缺陷以便于后期的维护和改进等),不过现在在开发同一系列的另外一款更低功耗的产品中,我们仍然遇到了许多之前所未考虑过的问题,而其中最主要的莫过于还是如何降低功耗。
由于设计的产品之中涉及到了大量的运算,我们起初是没有考虑到浮点运算的耗时问题的(毕竟我们之前没有做过这方面的工作,只是认为单片机时钟频率[8M我们是在平衡了频率与工作时间的基础上选择使用这个时钟频率的!]还不算慢就忽略了这最重要的全速运行时的耗时问题,直到这几天我们需要降低更多功耗的时候才发现了这个问题),当时用示波器一测发现整个数据处理部分居然占用了近35mS的运算时间,占据了整个设备功耗很大部分,于是我们开始注重这个数据处理的问题,最后也是在公司几位前辈的指点之下采用了浮点转换整型再采用硬件乘法器(这个硬件乘法器是编译器自动调用优化的处理结果,我们并没有在程序中调用硬件乘法器,不过确实是降低了运行的时间降低了功耗,并且现在这款产品的低功耗部分也已经满足设计要求了!!)最后移位运算得到最终结果的方法将运算时间一下就降低了许多。
按说既然已经满足了实际需求了就可以不再需要去想太多了的,不过由于我们最初在使用IAR工具调试程序的时候发现其中Debug与Release编译得到最终代码大小是有不同的(采用Release比Debug要小些[我的代码是4450 bytes 而用Debug则是4830 bytes]),通过上网查了许多资料但是也还没有找到一个很好的有关于这两者在编译处理时产生代码区别(或者说两者编译效率之间区别!我上网查过了许多的资料,大都只是简单教如何设置、如何将Release编译产生错误设置修改成没有错误之类的方法或者说明,但是并没有太多关于其编译之间的差别的,我在想假如了解清楚之后是否还会将我的代码精简优化以达到更低的功耗标准),而网上也有许多都提到说这两者在编译处理方面有不同,所以我想了解下这方面的知识点,也算是积累些这方面的经验知识!
还望各位大虾、前辈们不吝赐教为谢!!!
(由于本人还比较菜,所以上面贴中有些观点不对之处尽请指正,我也会虚心接受大家的意见和建议!)
------解决方案--------------------
我想到的1楼都说了。
我没有仔细对比过,但是发布版是没有调试信息的。
部分硬件如果使用了发布版貌似就有不能再用jtag进入了,而要用isp清flash后才能再次启用调试功能
------解决方案--------------------
所谓的debug和release只是两种不同的build configurations(编译配置)。
(1) 相同的设置下,个人认为两者生成的有效代码是一致的。
(2) 你说网上说debug下编译ok,release下会出错,可能是因为某些设置不同造成的,我遇到过一种情况,比如release下Stack size和Heap size设置大了,导致总的RAM超过范围。或者release有对应的条件编译代码,代码中出错了,等等。这些根本原因都是由于设置不同造成的。
(3) 设置不同的“编译配置”的目的就是方便开发,否则,如果在调试的同时需要烧录一个正常功能的代码还要去更改程序或者去更改宏定义等等。
(4) debug和release的默认输出格式是有区别的,一个是生成包含调试信息的可以下载的文件,另一个默认的就是烧录文件。
我去找了一下IAR AVR帮助文档中的一段话,你看看:
Often, you need to build several versions of your project. The Embedded Workbench
lets you define multiple build configurations for each project. In a simple case, you
might need just two, called Debug and Release, where the only differences are the
options used for optimization, debug information, and output format. In the Release configuration, the preprocessor symbol NDEBUG is defined, which means the application
will not contain any asserts.
Additional build configurations might be useful, for instance, if you intend to use the application on different target devices. The application is the same, but hardware-related parts of the code differ. Thus, depending on which target device you intend to build for,you can exclude some source files from the build configuration. These build configurations might fulfil these requirements for Project A:
● Project A - Device 1:Release
● Project A - Device 1:Debug
● Project A - Device 2:Release
● Project A - Device 2:Debug