热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

有关于IAR-430(5.20.1(5.20.1.50215)版本)工具中Debug与Release在编译时的一些区别!!

各位前辈大家好!!本人参加工作有一年多的时间了,在八个多月前自己主动要求加入到了一个项目组中(当时主要是想不能总在公司打酱油了,需要多向公司各位前辈们学习,实践动手积累些经验)。我们这个组中,
    各位前辈大家好!!本人参加工作有一年多的时间了,在八个多月前自己主动要求加入到了一个项目组中(当时主要是想不能总在公司打酱油了,需要多向公司各位前辈们学习,实践动手积累些经验)。我们这个组中,硬件设计的有两个人,其中一位有近十年的工作经验了,另外也是一位参加工作有两年多的师兄了,而我跟另外一位同到公司工作的同事则协助一位早到公司一年的研究生师兄做软件方面的设计(因为师兄人特别热心而且很谦虚所以我们工作上面也都很积极主动的配合,并且师兄也要求我们同时参与到项目的软件设计之中,所以尽管我俩都很菜但我们依然得到了正式开发自己的代码的机会了...)。而又由于我们所设计的产品是需要干电池供电且工作时间要求是最少三年以上了,所以最后硬件方面选择了TI的低功耗处理芯片MSP430,于是我们三人一起学习MSP430F247型的单片机(我上大学那会只是在学校学习过51,所以对于430这个也相当于是入门级别的!),从初学到现在已经是发布了两款产品并且也都全部实现功能与达到大部分性能了(当然,性能可能还是需要到现场实际使用过后才会更好的体现或者说是发现缺陷以便于后期的维护和改进等),不过现在在开发同一系列的另外一款更低功耗的产品中,我们仍然遇到了许多之前所未考虑过的问题,而其中最主要的莫过于还是如何降低功耗。
    由于设计的产品之中涉及到了大量的运算,我们起初是没有考虑到浮点运算的耗时问题的(毕竟我们之前没有做过这方面的工作,只是认为单片机时钟频率[8M我们是在平衡了频率与工作时间的基础上选择使用这个时钟频率的!]还不算慢就忽略了这最重要的全速运行时的耗时问题,直到这几天我们需要降低更多功耗的时候才发现了这个问题),当时用示波器一测发现整个数据处理部分居然占用了近35mS的运算时间,占据了整个设备功耗很大部分,于是我们开始注重这个数据处理的问题,最后也是在公司几位前辈的指点之下采用了浮点转换整型再采用硬件乘法器(这个硬件乘法器是编译器自动调用优化的处理结果,我们并没有在程序中调用硬件乘法器,不过确实是降低了运行的时间降低了功耗,并且现在这款产品的低功耗部分也已经满足设计要求了!!)最后移位运算得到最终结果的方法将运算时间一下就降低了许多。
    按说既然已经满足了实际需求了就可以不再需要去想太多了的,不过由于我们最初在使用IAR工具调试程序的时候发现其中Debug与Release编译得到最终代码大小是有不同的(采用Release比Debug要小些[我的代码是4450 bytes 而用Debug则是4830 bytes]),通过上网查了许多资料但是也还没有找到一个很好的有关于这两者在编译处理时产生代码区别(或者说两者编译效率之间区别!我上网查过了许多的资料,大都只是简单教如何设置、如何将Release编译产生错误设置修改成没有错误之类的方法或者说明,但是并没有太多关于其编译之间的差别的,我在想假如了解清楚之后是否还会将我的代码精简优化以达到更低的功耗标准),而网上也有许多都提到说这两者在编译处理方面有不同,所以我想了解下这方面的知识点,也算是积累些这方面的经验知识!
    还望各位大虾、前辈们不吝赐教为谢!!!
   (由于本人还比较菜,所以上面贴中有些观点不对之处尽请指正,我也会虚心接受大家的意见和建议!)

7 个解决方案

#1


(1) 其实debug模式和release模式如果所有设置包括link file都是相同的话,生成的代码代码大小是一样的。
(2) debug模式下,你可以加入一些调试信息,如将一些内部信息用串口输出,或者用一些IO口临时输出一些信息,或者不启动看门狗,主要是为了调试方便,可以通过系统默认的宏NDEBUG(release模式下,IAR的设置里面自动加入了这个宏)来进行条件编译。正常release程序时,这些调试的功能都是不要的。
(3) debug模式下,一般优化选项位OFF,不进行优化,方便调试。Release时,可以选择不同的优化等级和优化选项。
(4) 正是由于上面2和3的区别,生成的代码是不一样的。

#2


   感谢楼上的回帖!根据你的解释是不是就是说两种模式下其实所生成的有效代码(或者说是正常的实现功能的代码)是一致的呢!假如说是一致的,那么为何之前我在网上查到的一些资料中所说的Debug模式下编译通过但切换到Realease模式下就出现编译错误(这是否意味着Realease模式下编译就更加严格了?),当然网上也有许多人给出了将Realease模式配置修改为跟Debug模式下一致,但是这种方式虽然是让程序能够在Realease模式下也编译通过了,可这种Realease同Debug又有什么区别了!!?
   还有就是Realease模式同Debug模式在“工程-->选项-->Linker-->Output-->Format”中的设置是有区别的,也就是楼上所谈到的第二、三点(不过楼上相对还是做了些补充!!呵呵呵)吧!
   不知道我的理解是否正确?
    望指教...

#3


帮顶

#4


我想到的1楼都说了。
我没有仔细对比过,但是发布版是没有调试信息的。
部分硬件如果使用了发布版貌似就有不能再用jtag进入了,而要用isp清flash后才能再次启用调试功能

#5


所谓的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 

#6


To jobszheng5
  “部分硬件如果使用了发布版貌似就有不能再用jtag进入了,而要用isp清flash后才能再次启用调试功能"

  我这边也尝试过在使用了发布版确实就有不能再用jtag进入了,当在Release 模式下仿真调试的,IAR提示出错,说了几种的可能性,我考虑主要还是下载格式的问题(我觉得应该是需要下载.d43文件结果由于在Release 模式下的输出文件为.txt所以无法执行Debug!!),至于你所说的先用isp清flash我没尝试过(但是我使用了FET-Pro430直接清掉了flash但是执行仿真的效果是一样的,不知道是不是要使用你所说的用isp清掉之后才能仿真调试!)。不过我认为是不是在Release 模式下就不能够进入jtag下调试了吧!?主要是由于IAR工具提示的几种可能我都排除过发现格式的可能性很大(两种模式下的输出格式这项配置不一样所以我这么想,当然也不清楚你的方法是否可行!)。
   感谢你的回帖!!呵呵呵...

#7


To liangboone
   仍然,我要感谢下liangboone,你所给出的英文帮助我已经仔细阅读了,说得还是比较明白的,根据这个解释我觉得你给出的说明也是比较正确的,具体的我会在以后的应用之中慢慢体会的!!

推荐阅读
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 在分析Android的Audio系统时,我们对mpAudioPolicy->get_input进行了详细探讨,发现其背后涉及的机制相当复杂。本文将详细介绍这一过程及其背后的实现细节。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文深入探讨了MDK链接脚本的应用与优化技巧。首先,文章介绍了链接脚本的基本概念及其在嵌入式系统开发中的重要性。接着,通过具体实例详细分析了链接脚本的结构和功能,特别是在程序在FLASH中运行时,如何优化链接脚本以提高系统性能。此外,文章还讨论了无需将程序加载到SRAM中的技术细节,为开发者提供了实用的参考和指导。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 该问题可能由守护进程配置不当引起,例如未识别的JVM选项或内存分配不足。建议检查并调整JVM参数,确保为对象堆预留足够的内存空间(至少1572864KB)。此外,还可以优化应用程序的内存使用,减少不必要的内存消耗。 ... [详细]
author-avatar
桃Z夭夭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有