首页 > 新闻中心> 西安校区 >正文

嵌入式软件有哪些错误的开发观念?

更新时间: 2019-12-07 15:30:38来源: 粤嵌教育

  最近粤嵌科技的嵌入式讲师经常在和学员讲课的时候会听到我们的学员反馈自己在学习的时候会经常出现很多的开发错误,下面粤嵌科技的讲师就以我们的学员出现最多的嵌入式软件开发错误的观念来给大家讲解下。也给大家整理下这些错误的观念都有哪些?

嵌入式

  一、特别大if-then-elsecase 的描述


  在嵌入式系统的代码中有很大的if-then-elsecase的结构是不正常的,这会引起三个方面的问题。


  1、由于代码有很多不同的执行路径,所以它们将很难测试。假如是嵌套的话,就会变得更加的复杂。


  2、最好和最坏情况下的代码执行时间会明显的不同。这将导致CPU效率低下,或者是当执行最长路径时可能出现时序错误。


  3、结构代码覆盖测试的困难将会随着分支的数量成指数增长,所以结构分支应该最少。


  相反,用数学计算方法可以得到相同的结果。用布尔代数做一个跳转表来实现一个有限状态机,或用查找表来实现的话,可以把100行有if-else结构的代码减少为 不到10行的代码。


  二、用空循环实现时延


  实时软件经常需要增加时延来保证通过I/O口能有足够的时间来准备收发数据。这些时延通常都是通过增加一些空语句或空循环来实现(如果编译器有优化功能,要使用volatile保证变量不被优化)。如果这种代码在不同的处理器上使用,甚至对于一种处理器,只是运行在不同的主频(比如25MHZ33MHZ)下,在快一些的处理器上这种代码很可能就会失效。这一点我们在设计时要特别注意,因为它将直接带来一些实时性问题,这种问题很难跟踪和解决,因为这类问题表现的症状是五花八门的。


  其实,我们可以使用一个基于定时器的实现机制。一些实时操作系统(RTOS)提供了这样的功能,如果没有,我们也可以很容易造一个定时器。下面列举了两种通用的造时延函数delay(int usec)


  大多数的递减定时器允许软件读取当前递减寄存器的值。我们可以使用一个系统变量来记录定时器的速率,单位为usec/tick。假如值为2 usec/tick,现在需要一个10usec的时延,那么时延函数的忙等待时间为5tick。就算换了一个不同速率的处理器,定时器的tick数还是一样。若是定时器的频率更改了,则系统变量需要跟着修改,并且忙等待需要的tick也需要修改,但时延时间仍然保持不变。


  三、移植代码并非为移植而设计


  不是专门为移植而设计的代码,形式上不会是一种抽象出来的数据类型或是对象。这种代码很可能和其他代码之间存在一定的交互性,因此如果采用所有的移植代码,那么就会存在很多我们不需要的代码在其中。如果只采用其中一部分,那么我们就必须象一个外科医生一样对代码进行解剖,如果我们对这些代码没有足够的认识,我们很可能在剔除这些不需要的部分时存在一定的风险,或是无意中影响到了其功能。如果代码不是为移植而设计,最好先分析一下现有程序的功能,然后重新设计和组合代码,将它改造成结构良好,可移植性好的软件模块。这样代码就可以移植了。重新编写这个模块代码的时间将比直接修改和调试原始的移植代码的时间短得多。


  四、交互式的和不完整的测试程序


  许多嵌入式设计人员创建了一系列的测试程序,每块测试程序是为了测试特定的一种特性。每个测试程序都必须单独运行,而且有时候需要用户输入一些内容(比如通过键盘或开关),然后观察输出响应。这种方法的问题就是编程人员仅仅想测试一下他们正在修改的部分。但是既然不相关代码之间需要共享资源,就必然有交互作用,每次修改后都必须将整个系统全面测试一次。


  要完成这件事,就必须避免创建交互式的的测试程序。创建一个单独的测试程序,让他尽可能做到能自测,这样,任何时候即使有一点小改动,也能很容易而且迅速地完成一次完整的测试。不幸地是,说的总比做的容易,比如一些测试特别是I/O口的测试,只能交互式地完成。尽管如此,任何开发人员在编写测试用例前还是应该优先考虑到编写自动测试用例的原则,而不是写一步算一步,采用边写代码边测试的方法。


  五、超负荷设计系统


  如果处理器和存储器的平均利用率小于90%,而峰值利用率小于100%,那么我们就说这个系统属于超负荷设计。对于设计者而言,写程序使用过多的资源实在是一种奢侈的行为。在某种情况下,这种奢侈能直接导致盈利和破产的区别!软件工程师有责任尽量减少一个嵌入式系统的价格和能源消耗。如果CPU的利用率只有45%,那么就可以使用运行速度只有一半的处理器,因而减少了4倍的能量,而且可能每个处理器还能省下1美元或者更多的钱。


  如果这个产品大批量生产,每个处理器省下1美元,仅这一项整个产品就能省下100万美元。如果该产品是电池驱动的,电池就可以延长寿命,从而提升该产品的市场上的需求量。作为一种计算机家族中电源消耗的一种极端例子——便携机,一般使用一种很沉的电池,最多能使用3个小时。而一块手表,重量轻,电池便宜,却能使用3!尽管软件通常和能量消耗没有直接的关系,但它确实扮演了一个重要的角色。


  六、第一次设计时过度优化


  与第21个问题相反的一个问题也是一种通用的错误。一些编程者预见到了这种不规则现象(有些是很实际的,有些则有些奇怪)有一种奇怪的不规则现象的例子就是乘法比加法要长得多。一些设计者会将3*x写成x+x+x.而在有些嵌入式处理器中,乘法比加法处理时间的两倍要少一些,因此x+x+x的处理时间比3*x要慢一些。


  一个能预见所有的不规则现象的编程人员可能会为了优化代码,将第一个版本的代码编得可读性很差。那是因为他并不知道是否真正需要优化。一般的原则是,在实现过程中不要使用完全优化。


  七、差异化的多晶硅浮栅嵌入式闪存


  多年来,大多数IDM都在为需要嵌入式闪存的应用使用类似的1T多晶硅浮栅堆叠解决方案。在过去二十年间,创新型分离栅极SuperFlash?技术凭借其差异化且高效的多晶硅间擦除和源极注入编程存储单元,不断推动行业向前发展。


  以上就是粤嵌科技的嵌入式讲师根据我们这边的学员在学习嵌入式的时候会遇到的嵌入式软件在开发的时候会遇到的错误的观念整理出来的,希望对于大家是有用的。如果说你是想要学习嵌入式技术的话,那么粤嵌科技欢迎大家来我们公司进行实地考察,获取是也可以点击我们文章下面的获取试听资格按钮来获取我们的嵌入式培训免费课程试听资格,来和我们的讲师进行面对面的交流和互动。但是如果你是在学习的是遇到了什么不懂的问题,那么也可以点击我们的在线咨询来咨询我们的讲师专业上的问题。

免费预约试听课

推荐阅读