作者:桃Z夭夭 | 来源:互联网 | 2023-09-16 09:34
各位前辈大家好!!本人参加工作有一年多的时间了,在八个多月前自己主动要求加入到了一个项目组中(当时主要是想不能总在公司打酱油了,需要多向公司各位前辈们学习,实践动手积累些经验)。我们这个组中,
各位前辈大家好!!本人参加工作有一年多的时间了,在八个多月前自己主动要求加入到了一个项目组中(当时主要是想不能总在公司打酱油了,需要多向公司各位前辈们学习,实践动手积累些经验)。我们这个组中,硬件设计的有两个人,其中一位有近十年的工作经验了,另外也是一位参加工作有两年多的师兄了,而我跟另外一位同到公司工作的同事则协助一位早到公司一年的研究生师兄做软件方面的设计(因为师兄人特别热心而且很谦虚所以我们工作上面也都很积极主动的配合,并且师兄也要求我们同时参与到项目的软件设计之中,所以尽管我俩都很菜但我们依然得到了正式开发自己的代码的机会了...)。而又由于我们所设计的产品是需要干电池供电且工作时间要求是最少三年以上了,所以最后硬件方面选择了TI的低功耗处理芯片MSP430,于是我们三人一起学习MSP430F247型的单片机(我上大学那会只是在学校学习过51,所以对于430这个也相当于是入门级别的!),从初学到现在已经是发布了两款产品并且也都全部实现功能与达到大部分性能了(当然,性能可能还是需要到现场实际使用过后才会更好的体现或者说是发现缺陷以便于后期的维护和改进等),不过现在在开发同一系列的另外一款更低功耗的产品中,我们仍然遇到了许多之前所未考虑过的问题,而其中最主要的莫过于还是如何降低功耗。
由于设计的产品之中涉及到了大量的运算,我们起初是没有考虑到浮点运算的耗时问题的(毕竟我们之前没有做过这方面的工作,只是认为单片机时钟频率[8M我们是在平衡了频率与工作时间的基础上选择使用这个时钟频率的!]还不算慢就忽略了这最重要的全速运行时的耗时问题,直到这几天我们需要降低更多功耗的时候才发现了这个问题),当时用示波器一测发现整个数据处理部分居然占用了近35mS的运算时间,占据了整个设备功耗很大部分,于是我们开始注重这个数据处理的问题,最后也是在公司几位前辈的指点之下采用了浮点转换整型再采用硬件乘法器(这个硬件乘法器是编译器自动调用优化的处理结果,我们并没有在程序中调用硬件乘法器,不过确实是降低了运行的时间降低了功耗,并且现在这款产品的低功耗部分也已经满足设计要求了!!)最后移位运算得到最终结果的方法将运算时间一下就降低了许多。
按说既然已经满足了实际需求了就可以不再需要去想太多了的,不过由于我们最初在使用IAR工具调试程序的时候发现其中Debug与Release编译得到最终代码大小是有不同的(采用Release比Debug要小些[我的代码是4450 bytes 而用Debug则是4830 bytes]),通过上网查了许多资料但是也还没有找到一个很好的有关于这两者在编译处理时产生代码区别(或者说两者编译效率之间区别!我上网查过了许多的资料,大都只是简单教如何设置、如何将Release编译产生错误设置修改成没有错误之类的方法或者说明,但是并没有太多关于其编译之间的差别的,我在想假如了解清楚之后是否还会将我的代码精简优化以达到更低的功耗标准),而网上也有许多都提到说这两者在编译处理方面有不同,所以我想了解下这方面的知识点,也算是积累些这方面的经验知识!
还望各位大虾、前辈们不吝赐教为谢!!!
(由于本人还比较菜,所以上面贴中有些观点不对之处尽请指正,我也会虚心接受大家的意见和建议!)
7 个解决方案
(1) 其实debug模式和release模式如果所有设置包括link file都是相同的话,生成的代码代码大小是一样的。
(2) debug模式下,你可以加入一些调试信息,如将一些内部信息用串口输出,或者用一些IO口临时输出一些信息,或者不启动看门狗,主要是为了调试方便,可以通过系统默认的宏NDEBUG(release模式下,IAR的设置里面自动加入了这个宏)来进行条件编译。正常release程序时,这些调试的功能都是不要的。
(3) debug模式下,一般优化选项位OFF,不进行优化,方便调试。Release时,可以选择不同的优化等级和优化选项。
(4) 正是由于上面2和3的区别,生成的代码是不一样的。
感谢楼上的回帖!根据你的解释是不是就是说两种模式下其实所生成的有效代码(或者说是正常的实现功能的代码)是一致的呢!假如说是一致的,那么为何之前我在网上查到的一些资料中所说的Debug模式下编译通过但切换到Realease模式下就出现编译错误(这是否意味着Realease模式下编译就更加严格了?),当然网上也有许多人给出了将Realease模式配置修改为跟Debug模式下一致,但是这种方式虽然是让程序能够在Realease模式下也编译通过了,可这种Realease同Debug又有什么区别了!!?
还有就是Realease模式同Debug模式在“工程-->选项-->Linker-->Output-->Format”中的设置是有区别的,也就是楼上所谈到的第二、三点(不过楼上相对还是做了些补充!!呵呵呵)吧!
不知道我的理解是否正确?
望指教...
我想到的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
To jobszheng5
“部分硬件如果使用了发布版貌似就有不能再用jtag进入了,而要用isp清flash后才能再次启用调试功能"
我这边也尝试过在使用了发布版确实就有不能再用jtag进入了,当在Release 模式下仿真调试的,IAR提示出错,说了几种的可能性,我考虑主要还是下载格式的问题(我觉得应该是需要下载.d43文件结果由于在Release 模式下的输出文件为.txt所以无法执行Debug!!),至于你所说的先用isp清flash我没尝试过(但是我使用了FET-Pro430直接清掉了flash但是执行仿真的效果是一样的,不知道是不是要使用你所说的用isp清掉之后才能仿真调试!)。不过我认为是不是在Release 模式下就不能够进入jtag下调试了吧!?主要是由于IAR工具提示的几种可能我都排除过发现格式的可能性很大(两种模式下的输出格式这项配置不一样所以我这么想,当然也不清楚你的方法是否可行!)。
感谢你的回帖!!呵呵呵...
To liangboone
仍然,我要感谢下liangboone,你所给出的英文帮助我已经仔细阅读了,说得还是比较明白的,根据这个解释我觉得你给出的说明也是比较正确的,具体的我会在以后的应用之中慢慢体会的!!