搜索
bottom↓
回复: 34

单片机开发代码怎么评审?

[复制链接]

出0入4汤圆

发表于 2021-12-17 10:29:35 | 显示全部楼层 |阅读模式
请教大家在实际工作中单片机代码有评审环节吗?评审的颗粒度怎么样?什么时候评审? 会跑白盒测试用例吗?


类似这种代码逻辑错误,最该在哪个环节被发现,开发流程才算规范的?

/*校验设备ID: 等于本机ID或者0x0000广播ID 返回 1 校验通过*/
  if(((*(data_buf+3)!= ID[0]) || (*(data_buf+4) != ID[1]))&&((*(data_buf+3)!= 0x00) && (*(data_buf+4) != 0x00)))
    return 0;
else
    return 1;

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入57汤圆

发表于 2021-12-17 10:38:06 | 显示全部楼层
组织技术大牛走查代码。和撸原理图类似。评审只是形式,关键是要有大牛
至于代码健康度,有时各种测试还真不一定测得出来。比如我们有个RS485设备,MCU控制收发脚,在家做软件硬件7*24小时都做完出了合格报告已经结项
结果安装到现场,10个现场的其中一个,通信一个月之后挂了,重启跑了几天又挂了。拿示波器到现场一看,RS485收发控制脚被长期强制拉高导致总线瘫痪,但MCU没死机,狗子也没叫,回来走查N遍代码也没发现导致错误长期拉高的原因。现在策略是加定时器在串口发送完成后定期清除RS485发送脚电平。

出0入36汤圆

发表于 2021-12-17 10:54:53 来自手机 | 显示全部楼层
你们公司有多少人?研发团队有多少人?

出0入4汤圆

 楼主| 发表于 2021-12-17 11:21:40 | 显示全部楼层
redworlf007 发表于 2021-12-17 10:54
你们公司有多少人?研发团队有多少人?

公司100多好人 ,做嵌入式相关的 15个

出0入4汤圆

 楼主| 发表于 2021-12-17 11:22:35 | 显示全部楼层
mrf245 发表于 2021-12-17 10:38
组织技术大牛走查代码。和撸原理图类似。评审只是形式,关键是要有大牛
至于代码健康度,有时各种测试还真 ...

有这种问题你公司都敢放出去用

出100入312汤圆

发表于 2021-12-17 11:23:59 | 显示全部楼层
走查代码的不多,软件代码规范可以建立起来

出0入36汤圆

发表于 2021-12-17 11:28:06 | 显示全部楼层
acmilannast 发表于 2021-12-17 11:21
公司100多好人 ,做嵌入式相关的 15个

小公司搞这些都是徒劳,不加很多人手,根本搞不下去的。

出0入4汤圆

发表于 2021-12-17 11:31:58 来自手机 | 显示全部楼层
本帖最后由 Landmark 于 2021-12-17 11:33 编辑

我认为评审顶多只能检查一下风格,函数的耦合度等等这些表面形式的东西,至于一些隐藏很深的bug是无法用肉眼看出来的。看别人的代码并且理清运行逻辑是一个很痛苦的过程,没几个人愿意长期干这活。

出200入657汤圆

发表于 2021-12-17 11:32:24 | 显示全部楼层
代码很难评估吧。最多要求写代码的人必须按照一定的标准规范表代码,至于具体的业务逻辑细节根本无法评论。
如果想产品更强壮稳定,应该是要设置专业的软件测试工程师,设置各种检验方式对实际使用到的各种路径进行组合逻辑测试和极限测试。

出715入1076汤圆

发表于 2021-12-17 11:33:48 | 显示全部楼层
本帖最后由 dukelec 于 2021-12-17 15:29 编辑

mcu 代碼要評審也是看 框架結構 是否合理,然後是看 代碼風格 是否有問題。功能問題主要靠真機測試。
你這小段代碼,代碼風格 就過不了審,if 和 else 沒有對齊,!= 符號有的前面有空格,有的沒有,&& 符號也是有同樣的問題,再進一步,if 和 後面的 ( 之間沒有空格,+ 號左右沒有空格。
代碼風格通過後,才有可能順便看一下邏輯有沒有錯。否則看都懶得看,直接打回重改。

一般是返回 0 表示沒有錯誤,你這個返回 1 不太符合常規。

另外,類似這種比較,我會建議直接比較 16 位的數據(通過強制轉換取 16 位數,或者 get_unaligned16 之類的 helper)。

引伸閱讀:
如何针对糟糕的代码进行安全重构
https://www.amobbs.com/thread-5697580-1-1.html

再補充一句,多打 ( ) 可以預防優先級搞錯的問題,但有的時候 ( ) 套的太多也會影響閱讀,譬如樓主位的語句,最內層的 && 和 || 的兩邊的 != 語句,沒有必要加 ( ),最常用的優先級還是要記一下的

出0入8汤圆

发表于 2021-12-17 11:36:47 | 显示全部楼层
review要大牛专门干才行,兼职review不到很细的地方的;
大部分公司不会这么干,费钱费人啊

出0入57汤圆

发表于 2021-12-17 11:53:16 | 显示全部楼层
acmilannast 发表于 2021-12-17 11:22
有这种问题你公司都敢放出去用

没办法,投标完逼着要供货安装

出0入36汤圆

发表于 2021-12-17 12:21:48 来自手机 | 显示全部楼层
评审也只能如10楼所述那样,功能也只能交付测试人员反复验证。15个开发者的公司也算有规模的了,那一大串表达式看的眼花。如果ID更多呢,更长串了。用指针来比较清爽多了吧。写代码时用点心,可以去除一些低级bug,为何不将*(data_buf+4) != 0x00写成0x00 != *(data_buf+4)呢?

出0入16汤圆

发表于 2021-12-17 13:17:25 | 显示全部楼层
自己写的函数功能起码自己得跑一遍验证吧,逻辑都错了直接按死

出0入4汤圆

 楼主| 发表于 2021-12-17 14:31:52 | 显示全部楼层
ziruo2002ab 发表于 2021-12-17 11:32
代码很难评估吧。最多要求写代码的人必须按照一定的标准规范表代码,至于具体的业务逻辑细节根本无法评论。 ...

嗯,如果真增加白盒测试用例,这些bug肯定能覆盖到的。
类似伪代码
CU_ASSERT_EQUAL(checkID(0x0000),1); //广播地址
CU_ASSERT_EQUAL(checkID(0x0102),1);// 本机地址
CU_ASSERT_EQUAL(checkID(0x0002),0); //非本机地址

就是我们嵌入式开发不知道大家有没有这种实践,从人工,工期之类的考虑, 或者有其他更高效的办法?

出0入4汤圆

 楼主| 发表于 2021-12-17 14:34:58 | 显示全部楼层
初音之恋 发表于 2021-12-17 13:17
自己写的函数功能起码自己得跑一遍验证吧,逻辑都错了直接按死

工程师 一般也只会测试正确情况,针对这种代码他们也只发0x0000 能通讯,发本机ID 能通讯,就认为测试过了。。。

出0入4汤圆

 楼主| 发表于 2021-12-17 14:39:41 | 显示全部楼层
GZZXB 发表于 2021-12-17 12:21
评审也只能如10楼所述那样,功能也只能交付测试人员反复验证。15个开发者的公司也算有规模的了,那一大串表 ...

你也知道单片机开发情况,基本一到两个负责一个项目,代码质量基本靠工程师本身保证。所以我想看看有没有更好的模式。。。

出0入4汤圆

 楼主| 发表于 2021-12-17 14:40:48 | 显示全部楼层
dukelec 发表于 2021-12-17 11:33
mcu 代碼要評審也是看 框架結構 是否合理,然後是看 代碼風格 是否有問題。功能問題主要靠真機測試。
你這 ...

多谢宝贵建议

出0入0汤圆

发表于 2021-12-17 14:41:43 | 显示全部楼层
我斯也没有,不过产品有严格测试、长期运行测试,老化测试。但现场确实有出现一些未测试出BUG,预留远程升级和本地升级接口。硬件一般没有问题,都有评审和全套EMC测试。

出110入0汤圆

发表于 2021-12-17 14:45:52 | 显示全部楼层
acmilannast 发表于 2021-12-17 14:39
你也知道单片机开发情况,基本一到两个负责一个项目,代码质量基本靠工程师本身保证。所以我想看看有没有 ...

简单的措施比如将BSP层完全剥离,中间库持续维护,应用层代码抽象出贴合公司应用需求的简单框架。

如果十几个人项目都忙脱不开身,那啥也不说了……

出1325入193汤圆

发表于 2021-12-17 14:48:31 | 显示全部楼层
mrf245 发表于 2021-12-17 10:38
组织技术大牛走查代码。和撸原理图类似。评审只是形式,关键是要有大牛
至于代码健康度,有时各种测试还真 ...

现在策略是加定时器在串口发送完成后定期清除RS485发送脚电平。

好奇的是   RS485使能端被啥地方置高    关键代码

出5入14汤圆

发表于 2021-12-17 14:57:46 | 显示全部楼层
lb0857 发表于 2021-12-17 14:48
现在策略是加定时器在串口发送完成后定期清除RS485发送脚电平。

好奇的是   RS485使能端被啥地方置高   ...

先说下单片机型号吧,如果是国产单片机、那么你要理解单片机也会有BUG的

出5入14汤圆

发表于 2021-12-17 14:59:13 | 显示全部楼层
mrf245 发表于 2021-12-17 10:38
组织技术大牛走查代码。和撸原理图类似。评审只是形式,关键是要有大牛
至于代码健康度,有时各种测试还真 ...

所用单片机型号?

我的理解是,如果软件上确实没BUG,不排除单片机本身的BUG

出1325入193汤圆

发表于 2021-12-17 15:05:30 | 显示全部楼层
EMC菜鸟 发表于 2021-12-17 14:57
先说下单片机型号吧,如果是国产单片机、那么你要理解单片机也会有BUG的 ...

一样的意思
不能定时器定时清零这样处理
还是要看究竟是啥情况造成

出0入57汤圆

发表于 2021-12-17 16:17:46 | 显示全部楼层
EMC菜鸟 发表于 2021-12-17 14:59
所用单片机型号?

我的理解是,如果软件上确实没BUG,不排除单片机本身的BUG ...

STM32F103RET6
使用串口UART4(51 52脚),收发控制为PB1,代码是同事写的
这个问题去年9月发现,用了1个月走查,测试,11月发布新代码给客户升级后,那一个客户到目前没再反应过同样问题
但上周在其他一个客户反馈出现一次485通信失败,重启终端就好了的问题,问题没再复现,我们怀疑这一块还有问题

出0入57汤圆

发表于 2021-12-17 16:19:10 | 显示全部楼层
本帖最后由 mrf245 于 2021-12-17 16:24 编辑
lb0857 发表于 2021-12-17 15:05
一样的意思
不能定时器定时清零这样处理  
还是要看究竟是啥情况造成  ...


问题出现没有规律,也找不到触发条件,我怀疑是代码中有别的地方动到了收发使能脚(虽然走查里找不到这个问题)
在公司里用同样数量终端和主机搭环境,485用的普通多芯线,里面还故意给一根线加了220V火线电压模拟干扰,跑了2个月屁事没有,服了

出5入14汤圆

发表于 2021-12-17 16:55:43 | 显示全部楼层
mrf245 发表于 2021-12-17 16:19
问题出现没有规律,也找不到触发条件,我怀疑是代码中有别的地方动到了收发使能脚(虽然走查里找不到这个 ...

程序在编的时候就要考虑各种异常,只靠测试解决不了多少问题,程序能可靠的跑、编程者严谨的思维尤其重要,,,,

出100入312汤圆

发表于 2021-12-17 17:17:24 来自手机 | 显示全部楼层
mrf245 发表于 2021-12-17 16:19
问题出现没有规律,也找不到触发条件,我怀疑是代码中有别的地方动到了收发使能脚(虽然走查里找不到这个 ...

有客户用某大460系列mcu,io口有时不翻转,据客户说某大承认了

出1325入193汤圆

发表于 2021-12-17 17:20:07 | 显示全部楼层
mrf245 发表于 2021-12-17 16:17
STM32F103RET6
使用串口UART4(51 52脚),收发控制为PB1,代码是同事写的
这个问题去年9月发现,用了1个 ...

给一根线加了220V火线电压模拟干扰

实验室中这个火线的干扰对于485来说  无半点伤害  真正的干扰  远比这个厉害   
现场奇奇怪怪的故障  通讯发送概率较多  

出1325入193汤圆

发表于 2021-12-17 17:21:56 | 显示全部楼层
mrf245 发表于 2021-12-17 16:17
STM32F103RET6
使用串口UART4(51 52脚),收发控制为PB1,代码是同事写的
这个问题去年9月发现,用了1个 ...

一次485通信失败   
通讯上面冗余判定多少次失败才报错误    这个确认一下   

出0入1209汤圆

发表于 2021-12-17 17:44:00 | 显示全部楼层
这种错误,开发人员自己应该发现。 写代码的人才会想到如何去针对性的测试。

出0入0汤圆

发表于 2021-12-17 17:53:50 来自手机 | 显示全部楼层
代码评审根本就是无用功,用cpplint做风格检查,用c++ test做静态分析,剩下的就随缘了。

出350入477汤圆

发表于 2021-12-17 20:58:56 来自手机 | 显示全部楼层
本帖最后由 redroof 于 2021-12-17 21:00 编辑

黑盒测试,弄个电脑接个usb转串口,也接到这个总线上,写程序随机隔一阵乱发一点东西,发啥都行,随便乱搞。
你的系统必须保证总是可以快速的从这种故障中恢复。
测通迅可靠性,这样才是最狠的测法

出0入57汤圆

发表于 2021-12-18 11:16:29 | 显示全部楼层
本帖最后由 mrf245 于 2021-12-18 11:17 编辑
lb0857 发表于 2021-12-17 17:21
一次485通信失败   
通讯上面冗余判定多少次失败才报错误    这个确认一下    ...


上位机连续发送10次不回复认为掉线。这个可以设置。我们也调取后台数据看了,上位机下发没有收到任何回复
EMC测试方面,信号线用电容耦合EFT 4级干过了。当然只是常规测试手段,随机性耦合干扰没办法模拟

485偶然一两次不回没关系的,系统不会过敏,但当时去现场用万用表戳到MCU控制485发送脚测电平,是稳定高电平,重启就好,可以100%确定锁死总线了。

出0入0汤圆

发表于 2021-12-18 14:14:56 | 显示全部楼层
先要有富裕工作资源才行,人少事又杂就别搞了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-16 08:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表