做嵌入式开发的广大工程师应该对MISRA C不陌生,他是Motor Industry Software Reliability Association 的缩写,现在很多的编译器已经集成对MISRA C的规则检查,但可以自己选择,也可以不检查,如果你的代码强制要求符合MISRA C的规则,那么在软件实现上就要注意,不能随便写。C语言中有时候指针很方便,但是MISRA C 对指针有很多限制和要求,要特别注意。
在通讯程序中其实用指针是很方便的,但鉴于MISRA C对指针的严格要求,现在在一般项目中,MODBUS程序,我都建议工程师使用数组,而且在头文件中利用宏定义来定义好数组索引对应的数据映射,那么用数组来实现也是很方便的,例如对输入寄存器的数据映射可以如下定义
这样的话添加任何数据只需要更改前后相关的两个宏就可以,而且很方便在应用层对数据的刷新,只要for循环就可以。而且数据的起始地址也可以定义在这个都文件中。那么在更新输入寄存器的数据就可以一个for循环搞定
正如函数描述注释所写,数组的索引就是上图的宏定义,也是数据映射的协议表,很方便,当然你的宏定义名字一定要起的很到位,做到见名知意,所以现在我都是要求工程师这样来实现,当然如果你有更好的办法也欢迎来交流沟通。之前移植都是用指针来实现,后来因为MISRA C要求的项目需求,我都改为这种方法来实现。解析相应程序可以采用switch来选择不同的功能码响应程序
并且要注意对异常码的响应,MISRA C对函数的返回值也有要求,所以养成习惯慢慢代码就自然越来越符合规则。并且代码一定要加注释,标准对注释率都是有要求的,像一些代码检查工具一般默认都要求注释率达到20%,所以尽可能加有用的注释,既方便代码维护,也方便团队合作,于己于人都有好处。
希望这个小技巧你已经领会。