C语言中的ASSERT(断语)宏是嵌入式软件开发人员能够运用的最好的调试东西之一。尽管ASSERT功能强大,但我很少看到它被施行,并且在一些运用它的事例中,它的施行要么是有瑕疵的要么是不正确的。以下一些技巧将不仅能够协助说明在何时、何地运用ASSERT,并且还能说明怎样开端正确运用它。
技巧1:记住ASSERT的界说
对许多开发人员来说,断语是一个令人困惑的论题,由于它们的许多运用办法与其规划初衷各走各路。我见到的最明晰的断语界说是这样的:
“断语是在程序某个特定点的一个布尔表达式,除非程序中有缺点(Bug),不然它的值将为真。”
想要了解上述断语界说的开发人员应该留心下面三个关键:
·断语会评价一个表达式是真仍是假
·断语是在代码中的某个点对体系状况的一种假定
·断语会验证体系假定,假如不为真,就标明代码中有一个缺点
技巧2:运用ASSERT验证函数的先决条件
断语十分合适契约式规划环境,在这种环境中,开发人员十分明晰地界说了某个函数的先决条件。断语能够用来查看该函数的输入是否满意先决条件。就拿图1所示的代码片段为例:
图1:函数的先决条件
函数的STate输入应该在界说的体系状况规模内。假如State不是有用的状况值,那么它就不是过错,而是缺点!断语能够用来验证State是有用的假定,如图2所示:
图2:对函数先决条件运用断语
在State不小于最大值的作业中,断语表达式将被评价为假,程序所以将间断履行。间断程序履行能够让开发人员很简单立刻看到哪里的代码犯错,而不是过段时间今后才知道。
技巧3:运用ASSERT验证函数的后置条件
断语也能用来验证契约式规划环境中对某个函数输出的假定。例如,假如前面界说的System_StateSet函数回来SystemState变量,开发人员能够估计它也在希望的规模之内。断语能够用来对缺点进行监督,如图3所示。
图3:对函数后置条件运用断语
开发人员在查看上述代码后可能会感到这些查看毫无意义。刚方才设置好的SystemState怎样就会呈现大于SYSTEM_STATE_MAX的值呢?答案是这的确不应该呈现,但是有时候会不可思议地产生改动,也许是经过间断或并行线程,此刻断语能够当即标志出这个缺点。
技巧4:不要把ASSERT用于过错处理
在记住断语界说之后,开发人员应该牢记:断语是用于检测缺点的,不能用于过错处理。过错处理是规划用于呼应过错的用户输入和意外的作业次序的软件。过错在体系中意料是会产生的,但仅仅是由于有无效的输入而并不意味着代码中有缺点。过错处理应该与缺点寻觅分开来。过错运用断语的一个典型比如是,在企图翻开一个文件用于读取时去查看文件的指针,如图4所示。
图4:ASSERT的不妥运用
读者能够清楚地看到,企图翻开文件的结果与文件体系的状况和用户数据有关,而与代码中的缺点一点联系也没有。开发人员应该编写过错处理程序,而不是用断语,以便在文件不存在时,过错处理程序能够用一些默许可用数据来创立它,以便后续代码持续操作。
技巧5:ASSERT仅对开发有意义,不能用于出产
开发ASSERT宏的原始目的是在开发过程中启用它,在后面出产时要禁用。能够用NDEBUG宏激活和禁用ASSERT。正确施行的断语在被禁用后应该对嵌入式体系根本没有影响。
问题是,假如测验是在断语启用的情况下进行的(为了捕捉任何缺点,应该这样做),那么现在禁用断语将导致交给的产品与测验的产品处于不同的状况。断语的确会占用一些代码空间,但更重要的是,它们需求占用少数的时钟周期来评价它们的布尔表达式。禁用ASSERT可能对具有有限资源的裸机体系的履行时序产生很大影响,然后导致在出产体系中产生新的缺点。开发团队需求判别是否值得冒封闭断语的危险。
一种代替计划是保存断语在激活状况,而将它们的输出重定向到一个体系日志。这样能够保证任何挥之不去的缺点很简单被辨认,并且能防止间断体系的运转,而间断体系可不是明智之举。
技巧6:不答应断语有副作用
ASSERT的默许完成答应开发人员包括一段可履行代码作为布尔表达式的一部分。举例来说,一个状况变量能够被完成为表达式的一部分并传递给ASSERT。但假如传递给ASSERT的表达式有副作用,也就是说,它会改动嵌入式体系的状况,那么禁用断语将改动体系的行为。开发人员应该保证他们的表达式没有副作用,不然他们需求冒险在体系中添加只针对产品代码唤醒的休眠时间缺点。
技巧7:断语应该占代码的1%至3%
每个开发人员关于代码库(Code Base)中应该有多少个断语都有自己的主意。我们一致同意的一个数字是,代码库中的断语占比应该大于0。断语为开发人员供给了一种在代码库中产生缺点的时间发现它的好办法。调试是在开发嵌入式体系中最浪费时间并令人懊丧的作业之一。不论开发人员认可的占比是1%、3%仍是5%,运用断语必定对你有利,并会使开发嵌入式软件变得多少有些兴趣。
技巧8:将断语用作可履行代码注释
断语能够生成极好的注释!编写超卓的表达式能够切当地告知开发人员在代码的某个给定点应该意料产生什么作业。开发人员应该做好他们断语的架构,协助人们更清楚地了解体系中产生的作业,从而协助削减缺点。
小结
断语是一种超卓的东西,但有太多的嵌入式软件开发人员忽视了这一东西。本文评论的八个技巧仅仅怎样正确运用断语的冰山一角。接下来读者就能够在测验平台中树立和开端运用断语,并研讨它们在实践的嵌入式体系中是怎样作业的。