0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于嵌入式ASIL D产品的开发经验

汽车ECU开发 来源:汽车ECU开发 2023-11-21 16:32 次阅读

软件开发始于需求却不能终于需求,我们在满足需求的同时,还需要考虑代码本身的质量,包括可读性、可维护性、可扩展性、可移植性、安全性、高效性等。

上一篇文章《汽车软件单元测试的要点与意义》提到了诸如静态分析与覆盖度测试的一些代码评价手段,这一篇讲一些具体指标。

这些指标主要来自于ASIL D软件的实践经验。

1

每个函数的语句数

该指标是指函数内部语句的个数,是一种基础的代码复杂度度量方式。在多数语言中,我们可以使用工具自动计算语句个数。

常见语句包含以下类型:

以分号(;)结尾的简单语句

  • if语句
  • for语句
  • while语句
  • do语句
  • switch语句
  • break语句
  • continue语句
  • return语句
  • goto语句

语句个数应尽量维持在10~20,最多不要超过50。

2

return语句的数量

为了提高代码的可读性,我们最好遵循“单一出口原则”,也就是尽量保证一个函数只有一个出口点(函数结束执行的地方)。

出口点通常是return语句,所以我们也建议尽量减少其数量,比如,一个函数的return维持在1~2个之内

3

代码行长度

写文章要短句,是为了便于阅读。代码也是一样,太长的代码行会明显增加阅读代码的难度,很现实的问题是,需要开发人员左右滚动屏幕

在保证合理的逻辑、换行和缩进的前提下,要尽可能将长代码拆分。通常,低于160个字符的代码行可以认为是一个合理目标。

4

圈复杂度

圈复杂度是指通过源代码线性独立路径的个数,也是用来衡量代码复杂度。

如何计算呢?我们可以通过以下3个代码控制流图来看。

55ab37fa-73a0-11ee-939d-92fbcf53809c.png

一种计算公式为,圈复杂度M=控制流图边数E-节点N+2

故,

图1:M=1-2+2=1,即无判定节点,圈复杂度为1。

图2:M=4-4+2=2,即一个判定节点,圈复杂度为2。

图3:M=7-6+2=3,即两个判定节点,圈复杂度为3。

除了评价本身代码判定逻辑的复杂性之外,圈复杂度还能够用来确定最少需要多少个测试用例来满足分支和路径的覆盖度。

一般经验是,圈复杂度应小于10,以达到较好的可测性

5

非循环路径数

这个指标也被称为NPATH,是指通过软件所有可能路径的数量。其中,循环中的循环(for, while, do-while)只访问一次。

因此,NPATH也给出了达到路径覆盖所需的测试用例的最大数量。而圈复杂度给出了测试用例的最小数量。

如下图,对应的圈复杂度和NPATH分别为2和4。NPATH建议限制在80个以内

55b5f474-73a0-11ee-939d-92fbcf53809c.png

6

每个函数的嵌套级别

嵌套级别用来描述函数之间调用的深度层次。

当引入控制结构(if, while…)时,就会发生嵌套,每将控制结构放置在其他控制结构内部一次,嵌套级别就会增加一次。

以下为一个嵌套级别为2的代码段示意。

if(a < K) {

if(b > L) {

function);

}

}

嵌套级别建议不超过4。

7

调用图递归

调用图是软件工程中用于表示函数调用关系的有向图,它显示了哪个函数调用了哪个函数。

调用图内部的递归是一个函数直接或间接(通过至少一个其他函数)再次调用自身的模式。

递归是一种很好的编程技巧,但在嵌入式中有一些缺点。

要想停止递归时,必须有一个结束条件,否则,递归将导致应用程序崩溃,但是,无论是直接递归还是间接递归,确定结束条件并不容易。

此外,由于递归算法需要更多的函数调用和堆栈操作,其使用会造成性能阻塞、可读性差或堆栈溢出等问题。

一般不建议使用递归

8

不同函数的调用次数

更多的函数调用必然带来更大的复杂性,整体最好不超过7次

9

参数数量

参数的数量是函数复杂性和接口复杂性的另一个指标。存在的参数越多,就越容易在调用函数时出错,比如,参数顺序错误。

如果函数参数超过了5个,可以试着把函数分成使用较少参数的逻辑部分。

10

goto语句

goto语句可以使程序直接跳转到同一函数中的预定义位置。

goto是一个很有争议的语句。在处理错误或跳出多层循环时,有很直接的效果,但非逻辑性的跳转会让代码很难理解、出了错误也很难追踪。

所以,通常强烈建议不要使用goto语句

11

注释密度

除了从语句结构上降低外,代码复杂度还有一种应对方式是代码注释。

函数功能的文本化描述就是注释,这显然有助于理解代码。特别地,代码已经长时间没有被修改,或者代码必须由原始编写人分析或修改时,这些注释更加有用。

一种算法是,注释密度是指第一个语句之后找到的注释数量与语句数量之间的比率,20%是一个可参考的下限。

审核编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5087

    文章

    19145

    浏览量

    306134
  • 函数
    +关注

    关注

    3

    文章

    4338

    浏览量

    62749

原文标题:评价ASIL D软件代码的11个指标

文章出处:【微信号:eng2mot,微信公众号:汽车ECU开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式系统开发实践经验分享

    工程师一刻也没忘记交付能同时满足质量、时间安排和预算目标的项目的需求。一个事半功倍的方法 就是借鉴嵌入式系统开发人员社区多年来累计的经验教训。下面我们就来了解一些为嵌入式开发带来了最佳
    发表于 12-14 11:39 2460次阅读
    <b class='flag-5'>嵌入式</b>系统<b class='flag-5'>开发</b>实践<b class='flag-5'>经验</b>分享

    如何从零开始开发一款嵌入式产品(20 年的嵌入式经验

    如何从零开始开发一款嵌入式产品(20 年的嵌入式经验) 高级工程师的经验之谈,个人觉得非常好,借
    发表于 05-07 11:43

    如何从零开始开发一款嵌入式产品(20 年的嵌入式经验

    如何从零开始开发一款嵌入式产品(20 年的嵌入式经验) 高级工程师的经验之谈,个人觉得非常好,借
    发表于 05-07 11:45

    嵌入式开发调试经验分享

    嵌入式开发过程中的一点调试经验嵌入式开发最麻烦的在现场调试过程中或实际运营过程中出现问题很难定位。我在实际开发过程中一点经验分享给大家
    发表于 11-05 08:15

    Linux嵌入式产品开发有哪些注意事项

    应用层开发嵌入式产品,并会逐渐向底层学习。本系列文章所有内容均为个人开发过程中逐渐累积的经验之谈,如有问题,欢迎路过大神指出,共同学习。 本
    发表于 12-17 07:25

    嵌入式系统开发学习心得体会_经验总结

    本文主要介绍的是嵌入式系统开发学习心得体会及经验总结,首先介绍了嵌入式系统开发的三大关键点,其次推荐了
    的头像 发表于 05-18 10:24 3.1w次阅读

    嵌入式开发产品有哪些_嵌入式开发的流程

    本文主要阐述了嵌入式开发产品,其次介绍了嵌入式开发的流程。
    发表于 08-31 15:38 1.1w次阅读

    嵌入式产品开发不同阶段的解析

    嵌入式 产品,与普通 电子产品 一样,开发过程都需要遵循一些基本的流程,都是一个从需求分析到总体设计,详细设计到最后产品完成的过程。   但
    的头像 发表于 10-30 11:00 506次阅读

    嵌入式产品开发有哪些不同的阶段

    嵌入式产品,与普通电子产品一样,开发过程都需要遵循一些基本的流程,都是一个从需求分析到总体设计,详细设计到最后产品完成的过程。但是,与普通电
    发表于 12-25 11:44 20次下载

    嵌入式开发(一):嵌入式开发新手入门

    本篇文章整理下嵌入式开发中一些入门的基础技能,都是根据以往的工程经验整理,适用于之前没做过嵌入式开发的新手。嵌入式开发流程一般如下,一般是在PC机的Windows系统下安装Ubuntu
    发表于 10-14 10:58 79次下载
    <b class='flag-5'>嵌入式开发</b>(一):<b class='flag-5'>嵌入式开发</b>新手入门

    嵌入式开发资料免费分享

    嵌入式开发资料免费分享嵌入式工程师经验分享:如何学习嵌入式开发截取文档部分学习嵌入式工程师经验
    发表于 10-21 11:07 47次下载
    <b class='flag-5'>嵌入式开发</b>资料免费分享

    视频教程-嵌入式Linux开发基础-嵌入式

    嵌入式Linux开发基础 嵌入式工程师、嵌入式讲师、10多年
    发表于 11-02 13:21 30次下载
    视频教程-<b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>开发</b>基础-<b class='flag-5'>嵌入式</b>

    新手怎么学习嵌入式开发嵌入式培训怎么学?

    掌握哪些技能呢?市场上需要的嵌入式人才必须具备C语言编程经验嵌入式操作系统(嵌入式Linux)经验、内核裁剪
    发表于 11-03 09:21 17次下载
    新手怎么学习<b class='flag-5'>嵌入式开发</b>?<b class='flag-5'>嵌入式</b>培训怎么学?

    蓝桥杯嵌入式开发学习索引

    联系方式作者:马一飞QQ:791729359 蓝桥杯嵌入式开发学习目录蓝桥杯嵌入式开发经验分享(1.
    发表于 11-03 10:36 20次下载
    蓝桥杯<b class='flag-5'>嵌入式开发</b>学习索引

    嵌入式产品开发流程

    嵌入式产品,与普通电子产品一样,开发过程都需要遵循一些基本的流程,都是一个从需求分析到总体设计,详细设计到最后产品完成的过程。但是,与普通电
    发表于 11-04 10:06 36次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>产品</b><b class='flag-5'>开发</b>流程