微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 什么是嵌入式技术?嵌入式软件经常出现的错误有哪些?又该如何避免?

什么是嵌入式技术?嵌入式软件经常出现的错误有哪些?又该如何避免?

时间:03-27 来源:网络整理 点击:

态过程,忽视了过渡过程。举例说明,比如我们控制一个支路的供电,从软件控制来说,直接给继电器一个启动信号,让开状态的触点闭合就可以了,非"关"即"开",是受控继电器的两个稳态状态,但事实上,在从开到闭合的过程中,支路供电的电压并不是一个简单0V—24V(24V为示例而已)的跳变状态,而是一个抖动,有冲击信号的过程,这种情况在硬件上的防护是必不可少的,但在软件上也不是可以事不关己、高高挂起的。

  另外在逻辑上,宜将容易被干扰和容易产生的干扰控制动作从时序上控制好,予以分开隔离。比如,控制继电器的过程是容易产生抖动尖峰脉冲而干扰数据总线和控制信号总线的,这时候从控制上,不宜同时实施数据的发送和接收工作,不宜作出其他的控制动作,惹不起咱躲得起,躲过这一阵干扰的时候总可以了吧?

  3、软件代码

  软件的可靠性是随着时间的推移,可靠性逐渐增加的,这一点区别于电子可靠性、机械可靠性。电子可靠性服从指数分布,在整个生命周期内,其失效率为一个常数;机械可靠性因为磨损、腐蚀、运动等因素的存在,随时间推移可靠度会下降。因此也就有了软件可靠性设计的一个特定规律和注意事项。

  既然需要通过时间推移,通过不断改进,软件可靠性得到提升。那么软件的可维护性就是一个大问题了。这也是为什么软件工程管理方面特别关注软件文档、注释的原因了。但做这些要求的人只是人云亦云,并不理解如此做法的真正动机。至于注释如何去做、变量如何命名、软件配置管理如何操作,这里面既有很常规的方法,也有一些我们司空见惯然而是错误的做法。信手举上几个值得注意的细节供参考。

  变量定义时宜将变量类型的变量名程中体现于其中;如AD_result_int、Cal_result_float等。这样为的好检查,防止数据类型的强制转换或强制赋值时出现数据类型的错误;

  注释要充分;

  代码的布局风格宜统一,便于阅读查找;

  不可出现非受控的default流程,所有数值和变量,不论是调用函数时赋予的、读取接口读进来的、还是中间变量计算出来的,在应用前都宜作数据有效性的判断,并对判定的所有可能结果均做受控的对应处理。

  关于软件可维护性编程方法方面的文章资料在网上是铺天盖地,不予赘述,综合采用之即可。很多文章把软件可维护性编程规范推荐做成企业的嵌入式软件可靠性设计规范,实在是有点以偏概全,有失偏颇的,用一句娱乐圈的话来说,"爱情是生活的重要内容,但它不是生活的全部",软件可维护性编程方法亦然。

  软件代码在执行中容易出现的下一个问题是跑飞,程序指针受到干扰,跳转到了一个非受控位置,执行了不该执行的代码。如果执行了不该执行的代码,如果在程序中加入了足够的变量判断、读值判断、状态检测判断等,那倒还好了,后果也不会太严重,甚至最终还是可能自己跑回来的。但有一种跑飞是比较可怕的,一般我们在ROM中存放的程序目标代码是1-3字节的指令,就是最多3条字段的目标码组成了执行动作,如果程序指针跑飞到了某个3字节指令的第2个字节上的时候,执行的后果是什么,可就真的没人知道了,即使在程序上作了足够的数据判错、逻辑跳转的防范措施,结果也不会好。而且ROM一般是不可能全部都被程序代码填满的,总有富余空间,富余空间中的默认内容是啥,这些默认字节是否也会导致一些操作呢?单片机中的默认空间是0FFH,DSP的我没查过,大家有兴趣查一下,跳到这些字段里,也是容易出麻烦的。

  好了,不再罗嗦,直接给出解决方法吧,就是每隔一段程序代码或控制区域,就人为放置上几个NOP指令,在NOP指令后放置一个长跳转的ERR处理程序。注意NOP最少放置3个,这样任何的跑飞最多只能占用2个NOP,第三个NOP一样还是能把程序代码揪回来,揪回来后就执行ERR处理程序。

如果碰到安全性、可靠性等级要求比较高的程序,推荐的处理方法可以采用热备份的处理方法,即用两段代码同时执行同一个功能,执行的结果进行对比,如果一致则放行通过,如果结果不一致,咋处理就看您的喽。但是… …国人有的是办法,为了图省事,你领导不是要求我编热备份程序吗,那好,我就把原来的代码复制一遍,重新插入到某个地方,您这和明朝时代冯保太监(还是严嵩、张居正阿?拿不准了,大家有兴趣的翻看《明朝那些事儿》查阅下)玩的没啥两样,自己写奏章,自己给自己审批奏章。既然是备份就是为了防止一个人出问题,那最好的办法自然是不同的人来编这段,如果原理计算方法上也不同,数据采集通道也不同,那就过年带娶媳妇的,好上加好了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top