在嵌入式软件中使用断言的一点想法

嵌入式软件中的断言应该分成三个级别,而不是仅有启用和关闭两种。1启用断言并打印可读信息、2启用断言并打印代码地址、3关闭断言。



原文:http://blog.csdn.net/zoomdy/article/details/46289867

mingdu.zheng at gmail dot com


矛盾

断言可以帮助开发人员在软件开发过程中比较容易地发现软件缺陷。典型的做法是在开发过程中启用断言,而在最终发布时关闭断言。

对于嵌入式软件而言,可能在软件开发的后期就不得不关闭断言,因为嵌入式系统的内存资源是非常有限的,而启用断言会占用相当可观的ROM资源,当嵌入式软件开发进行到后期时,所有的功能代码集成以后这些功能代码基本上用光了ROM资源,已经没有ROM资源可以启用断言(除非在开发时使用的是比最终发布的硬件具有更多ROM资源的硬件)。

还有人建议永远都不要关闭断言,即使是发布的版本也不要关闭断言。对于C/C++这样的仅有极少运行时检查特性的语言而言,断言还是一种简单有效的运行时检查机制。另外,少量的软件缺陷可能仍然残留在系统中,断言仍然可以检测出这些残留的缺陷并报告。发布时关闭断言,当发现问题时重新启用断言进行检查,这样的做法对于时间相关的代码而言可能是不可重现的,因为启用断言后程序的执行时间是与关闭断言时不相同的。这是建议总是保留断言的另一个原因,为了执行时间上的一致性。

一方面,嵌入式系统的ROM资源是有限的,增加ROM资源意味着增加成本;另一方面,断言应该尽可能地保留以便能检测错误。嵌入式系统开发过程总是充斥着矛盾。

解决办法

解决这个矛盾的办法是减少断言所占用的ROM资源量。断言宏通常会打印一些可读信息,例如产生断言的文件名和行号以及断言条件等,这些可读信息可以非常快速地帮助开发人员定位发生断言的位置。这些可读信息基本上是字符串常量,占用大量ROM资源的正是这些字符串常量。如果用代码地址来代替这些可读字符串,那么就可以节省大量的ROM资源,代价是开发人员必须通过一些工具(例如addr2line)来定位产生问题的代码,而不是直观地看到问题所在之处。

由此可见,断言应该分成三个级别,而不是仅有启用和关闭两种。

  1. 启用断言并打印可读信息,可读信息可以帮助开发人员快速定位问题,因此有条件打印可读信息的情况下还是应该打印可读信息,这可以提高开发效率的。
  2. 启动断言并打印代码地址,在发布版本中以及ROM资源十分紧张的情况下使用这种方式,一方面可以继续检测错误,另一方面尽可能节省资源。
  3. 关闭断言。
时间: 2024-10-03 09:23:14

在嵌入式软件中使用断言的一点想法的相关文章

关于UED前端开发的一点想法

5.2 关于UED前端开发的一点想法 5.2.1 目前UED前端代码是一个页面对应一个JS文件,更有甚者一个JS文件的代码会超过万行,这样的代码试想该如何维护?如果在从事前端开发的时候避免这种尴尬的局面,我想最好的方式就是分而治之, 如果分而治之?首先解析页面的一般思路,初始化(init) 事件绑定(event)页面读值(getData)页面写值(setData)重置页面(resetData)页面展示(setView)页面校验(checkData)页面异步加载 (ajax),页面测试(test)

多应用统一开发平台的一点想法

几年工作下来,发现有一个问题一直困扰着我们: 随着项目的越来越完善,功能越来越丰富,单一一个应用已经不能够支撑开发人员的需要.于是我们就需要根据业务分拆成几个相对独立的应用来满足多个开发团队的需求.但是这样也造成了一些问题,多个应用需要公用的基础代码维护起来越来越复杂,导致种种问题.也有很多种方式来解决,比如公共代码放置单独的地方,这样有带来的自动化部署方面的困难.在此,鄙人提出一种解决方法,即多应用统一开发平台的概念.在此以rails应用为例. 标准的rails应用结构如下: Gemfile

对当前网络路由的一点想法

五一小长假,和朋友开车去了浙江,发现了"基于目的地的最短距离算法"的弊端,也许就是这个算法导致了高速公路在某个时间段的定期规律性拥堵!从嘉定出发,G1501一路畅通,但是一旦转到G60沪昆高速,瞬间拥堵起来,实际上,早在G1501上时,就有公告牌,说沪昆高速有施工,可是大家还是全部转到了沪昆高速,留下S19/G15成了被抛弃的摆设...知道原因是什么吗?很简单,因为沪昆高速那条路最近!人们太相信导航,很少有人没事研究地图,所以很多人都上了当,当然这并不包括我.很多导航都是根据Dijks

Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法

原文:Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法 很多朋友做安装包的时候,所打包的软件需要.NET Framework之类的环境,他们会检测系统是否已经安装了.NET,如果没有,则调用.NET安装包来安装.但是.NET安装完是需要重启动的,一般来说,我们都推荐使用/q/norestart的静默安装函数来使重启动推迟到安装结束时,使用如下:LaunchAppAndWait(SUPPORTDIR^"dotNetFx40_Full_x

[转载]对iOS开发中内存管理的一点总结与理解

对iOS开发中内存管理的一点总结与理解 做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作的理解是衡量一个程序员成熟与否的一个标准.好了,闲话不说,下面进入正题. 众所周知,ObjectiveC的内存管理引用的一种叫做“引用计数“ (Reference Count)的操作方式,简单的理解就是系统为每一个创建出来的对象,(这里要注意,只是对象,NSObject的子类,基本类型没有‘引用计数’)

java中的断言

断言:也就是所谓的assertion,是jdk1.4后加入的新功能. 它主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据不是你程序所预期的数据,程序就提出警告或退出. 当软件正式发布后,可以取消断言部分的代码.java中使用assert作为断言的一个关键字,这就可以看出java对断言还是很重视的,因为如果不是很重要的话,直接开发个类就可以了,没必要新定义一个关键字. 语法1:assert expression;                //expression代表一

关于标签系统的又一点想法。

前段时间,写过一篇<关于标签系统的一点想法.>.但其实没有谈到里面的内容,是有一部分来自与刘鑫老师的聊天,当时他给了我许多肯定,也是让我觉得记录下来很有必要的原因. 前一篇里没有提到,我跟刘老师谈到一个更加深入一点的.关于标签系统的想法.主要原因是因为我尚不肯定这是否也属于标签系统.直到最近disylee 送了一本标签 : 标记系统设计实践给我,里面的一个小节让我为自己的想法找到了理论依据. 很不错的一本书,没有让我失望,解答了我心中的一些困惑.书有点啰嗦,但也正因为此显得"系统&q

spring mvc中使用freemark的一点心得

参考文档: FreeMarker标签与使用 连接http://blog.csdn.net/nengyu/article/details/6829244 jsp的第一次运行,就要运行servlet,如果开发时频繁的修改jsp,会导致开发速度比较慢;(每改一次,要重新编译一次); 编译过后,模板的速度也要比jsp快. 具体的freemark页面上的使用:见http://blog.csdn.net/nengyu/article/details/6829244 spring mvc中使用freemark

对创业团队的一点想法

本人 没有强大的技术,没有广阔的人脉,没有超前的远见,只因在创业团队中待过一年,有了一些想法,即记录下来.这里对给我这次机会的公司表示感谢!这里说提互联网及软件方向的创业团队. 1. 不宜过早制度化 当然,对于打卡这样的制度并不排斥.但是对于对上百人团队的管理方法,不宜过早产生.比如详细区分不同部门,部门与部门有专门负责人.做一次软件发布要层层审批,经过同意后,再到发布,已经又有很多问题修复了. 部门与部门之间建立负责人,本意是为了不让沟通变的混乱,但创业团队,每个部门又能有多少人,本来只是找某