嵌入式体系是一种“彻底嵌入受控器材内部,为特定运用而规划的专用计算机体系”,依据英国电气工程师协会( U.K. Institution of Electrical Engineer)的界说,嵌入式体系为操控、监督或辅佐设备、机器或用于工厂运作的设备。与个人计算机这样的通用计算机体系不同,嵌入式体系一般履行的是带有特定要求的预先界说的使命。因为嵌入式体系只针对一项特其他使命,规划人员能够对它进行优化,减小尺度降低本钱。嵌入式体系一般进行大量生产,所以单个的本钱节约,能够跟着产值进行成百上千的扩大。
嵌入式体系是以运用为中心,以计算机技能为根底,而且软硬件可裁剪,适用于运用体系对功用、牢靠性、本钱、体积、功耗有严格要求的专用计算机体系。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作体系以及用 户的运用程序等四个部分组成,用于完结对其他设备的操控、监督或办理等功用。
嵌入式体系的规划技能首要包含硬件规划技能和软件规划技能两大类。其间,硬件规划范畴的技能首要包含芯片级规划技能和电路板级规划技能两个方面。
芯片级规划技能的中心是编译/归纳、库/IP、测验/验证。编译/归纳技能使规划者用笼统的办法描绘所需的功用,并主动剖析和刺进完结细节。库/IP技能将预先规划好的低笼统级完结用于高档。测验/验证技能保证每级功用正确,削减各级之间重复规划的本钱。
下面咱们先来介绍一些根本的开发流程.
嵌入式体系开发流程
第一步:树立开发环境
操作体系一般运用Redhat Linux,挑选定制装置或悉数装置,经过网络下载相应的GCC穿插编译器进行装置(比方,arm-linux-gcc、arm-uclibc-gcc),或许装置产品厂家供给的相关穿插编译器;
第二步:装备开发主机
装备MINICOM,一般的参数为波特率115200 Baud/s,数据位8位,中止位为1,9,无奇偶校验,软件硬件流控设为无。在Windows下的超级终端的装备也是这样。MINICOM软件的作用是作为调试嵌入式开发板的信息输出的监督器和键盘输入的东西。装备网络首要是装备NFS网络文件体系,需求封闭防火墙,简化嵌入式网络调试环境设置进程。
第三步:树立引导装载程序BOOTLOADER
从网络上下载一些揭露源代码的BOOTLOADER,如U.BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,依据详细芯片进行移植修正。有些芯片没有内置引导装载程序,比方,三星的ARV17、ARM9系列芯片,这样就需求编写开发板上FLASH的烧写程序,能够在网上下载相应的烧写程序,也有Linux下的揭露源代码的J-FLASH程序。假如不能烧写自己的开发板,就需求依据自己的详细电路进行源代码修正。这是让体系能够正常运转的第一步。假如用户购买了厂家的仿真器比较简略烧写FLASH,尽管无法了解其间的中心技能,但关于需求敏捷开发自己的运用的人来说能够极大进步开发速度。
第四步:下载现已移植好的Linux操作体系
如MCLiunx、ARM-Linux、PPC-Linux等,假如有专门针对所运用的CPU移植好的Linux操作体系那是再好不过,下载后再增加特定硬件的驱动程序,然后进行调试修正,关于带MMU的CPU能够运用模块办法调试驱动,而关于MCLiunx这样的体系只能编译内核进行调试。
第五步:树立根文件体系
下载运用BUSYBOX软件进行功用削减,发生一个最根本的根文件体系,再依据自己的运用需求增加其他的程序。因为默许的发动脚本一般都不会契合运用的需求,所以就要修正根文件体系中的发动脚本,它的寄存方位坐落/etc目录下,包含:/etc/init.d/rc.S、/etc/profile、/etc/.profile等,主动挂装文件体系的装备文件/etc/fstab,详细状况会随体系不同而不同。根文件体系在嵌入式体系中一般设为只读,需求运用mkcramfs genromfs等东西发生烧写映像文件。
第六步:树立运用程序的FLASH磁盘分区
一般运用JFFS2或YAFFS文件体系,这需求在内核中供给这些文件体系的驱动,有的体系运用一个线性FLASH(NOR型)512KB~32MB,有的体系运用非线性FLASH(NAND型)8MB~512MB,有的两个一起运用,需求依据运用规划FLASH的分区计划。
第七步:开发运用程序
能够放入根文件体系中,也能够放入YAFFS、JFFS2文件体系中,有的运用不运用根文件体系,直接将运用程序和内核规划在一起,这有点类似于μC/OS-II的办法。
第八步:烧写内核
根文件体系和运用程序,发布产品。
进步牢靠性的七大技巧
从规范完善的开发周期到严格履行和体系查看,开发高牢靠性嵌入式体系的技能有许多种。本文介绍了7个易操作且能够持久运用的技巧,它们关于保证体系愈加牢靠地运转并捕获反常行为大有帮忙。
技巧1——用已知值填充ROM
软件开发人员往往都是十分达观的一群人,只要让他们的代码忠实地长期地运转就能够了,仅此而已。微操控器跳出运用程序空间并在非料想的代码空间中履行这种状况似乎是适当罕见的。但是,这种状况发生的时机并不比缓存溢出或过错指针失掉引证少。它的确会发生!发生这种状况后的体系行为将是不确认的,因为默许状况下内存空间都是0xFF,或许因为内存区一般没有写过,其间的值或许只要天主才知道。
不过有适当齐备的linker或IDE技巧能够用来帮忙辨认这样的作业并从中康复体系。技巧便是运用FILL指令对未用ROM填充已知的位形式。要填充未运用的内存,有许多不同的或许组合能够运用,但假如是想树立愈加牢靠的体系,最显着的挑选是在这些方位放置ISR fault handler。假如体系出了某些过失,处理器开端履行程序空间以外的代码,就会触发ISR,并在决议校对举动之前供给贮存处理器、寄存器和体系状况的时机。
技巧2——查看运用程序的CRC
对嵌入式工程师来说一个很大的优点是,咱们的IDE和东西链能够主动发生运用程序或内存空间校验和(Checksum),然后依据这个校验和验证运用程序是否无缺。风趣的是,在许多这些事例中,只要在将程序代码加载到设备时,才会用到校验和。
但是,假如CRC或校验和坚持在内存中,那么验证运用程序在发动时(或乃至对长期运转的体系守时验证)是否依然无缺是保证意外之事不会发生的极好途径。现在一个编程过的运用程序发生改动的概率是很小的,但考虑每年交给的数十亿个微操控器以及或许恶劣的作业环境,运用程序溃散的时机并不是零。更有或许的是,体系中的一个缺点或许导致某一扇区发生闪存写入或闪存擦除,然后损坏运用程序的完整性。
技巧3——在发动时履行RAM查看
为了树立一个愈加牢靠和厚实的体系,保证体系硬件正常作业十分重要。究竟硬件会发生毛病。(走运的是软件永久不会发生毛病,软件只会做代码要它做的事,不管是正确的仍是过错的)。在发动时验证RAM的内部或外部没有问题,是保证硬件能够如预期般运作的一个好办法。
有许多不同的办法可用于履行RAM查看,但常用的办法是写入一个已知的形式,然后等上一小段时刻再回读。成果应该是所读便是所写。本相是,在大多数状况下RAM查看是经过的,这也是咱们想要的成果。但也有极小的或许性查看不经过,这时就为体系标明出硬件问题供给了极好的时机。
技巧4——运用仓库监督器
对许多的嵌入式开发者而言,仓库似乎是一股适当奥秘的力气。当古怪的作业开端发生,工程师总算被难倒了,他们开端考虑,或许仓库中发生了什么事。成果是盲目地调整仓库的巨细和方位等等。但该过错往往是与仓库无关的,但怎能如此确认?究竟,有多少工程师真的实践履行过最坏状况下的仓库巨细剖析?
仓库巨细是在编译时就静态分配好的,但仓库是以动态的办法运用的。跟着代码的履行,运用程序需求的变量、回来的地址和其它信息被不断存储在仓库中。这种机制导致仓库在其分配的内存中不断增加。但是,这种增加有时会超出编译时确认的容量极限,导致仓库损坏相邻内存区域的数据。
肯定保证仓库正常作业的一种办法是完结仓库监督器,将它作为体系“保健”代码的一部分(有多少工程师会这样做?)。仓库监督器会在仓库和“其它”内存区域之间创立一个缓冲区域,并填充已知的位形式。然后监督器会不断的监督图画是否有任何改动。假如该位形式发生了改动,那就意味着仓库增加得太大了,行将要把体系面向漆黑阴间!此刻监督器能够记载作业的发生、体系状况以及任何其它有用的数据,供日后用于问题的确诊。
大多数实时操作体系(RTOS)或完结了内存保护单元(MPU)的微操控器体系中都供给有仓库监督器。可怕的是,这些功用默许都是封闭状况,或许常常被开发人员有意封闭。在网络上快速搜索一下能够发现,许多人主张封闭实时操作体系中的仓库监督器以节约56字节的闪存空间。等等,这但是因小失大的做法!
技巧5 – 运用MPU
在曩昔,是很难在一个小而廉价的微操控器中找到内存保护单元(MPU)的,但这种状况现已开端改动。现在从高端到低端的微操控器都现已有MPU,而这些MPU为嵌入式软件开发人员供给了一个能够大幅进步其固件(firmware)鲁棒性(robustness)的时机。
MPU 已逐步与操作体系耦合,以便树立内存空间,其间的处理都分隔,或使命可履行其代码,而不必忧虑被stomped on。假使真有作业发生,不受操控的处理会被撤销,也会履行其他的保护措施。请留心带有这种组件的微操控器,假如有,请多加运用它的这种特性。
技巧6 – 树立一个强壮的看门狗体系
你常常会发现的一种总是最受喜欢的看门狗(watchdog)完结是,在看门狗被启用之处(这是一个很好的开端),但也是能够用周期性守时器将该看门狗清零之处;守时器的启用是彻底与程序中呈现的任何状况阻隔的。运用看门狗的意图是帮忙保证假如呈现过错,看门狗不会被清零,即当作业暂停,体系会被逼去履行硬件重设定(hardware reset),以便康复。运用与体系活动独立的守时器能够让看门狗坚持清零,即便体系已失效。
对运用使命怎么整合到看门狗体系中,嵌入式开发人员需求细心考虑和规划。例如,有种技能或许能够让每个在一守时期内运转的使命标明它们能够成功地完结其任 务。在此作业中,看门狗不被清零,强制被复位。还有一些比较先进的技能,像是运用外部看门狗处理器,它可用来监督主处理器怎么体现,反之亦然。
对一个牢靠的体系而言,树立一个强壮的看门狗体系是很重要的。因为有太多的技能,难以在这几个阶段中彻底包括,但针对此一议题,笔者未来还会宣布相关的文章。
技巧7 – 防止易失存储器分配
不习惯在资源有限环境下作业的工程师,或许会企图运用其编程言语的特性,这种言语让他们能够运用易失存储器分配。究竟,这是一种常在计算器体系中运用的技能,在计算器体系中,只要在有必要时,内存才会被分配。例如,以C开发时,工程师或许倾向于运用malloc来分配在堆(heap)上的空间。有一个操 作会履行,一旦完结,能够运用free将被分配的内存回来,以便堆的运用。
在资源受限的体系,这可 能是一场灾祸!运用易失存储器分配的其间一个问题是,过错或不妥的技能或许会导致内存走漏或内存碎片。假如呈现这些问题时,大多数的嵌入式体系并没有 资源或常识来监督堆或妥善地处理它。而当它们发生时,假如运用程序提出对空间的要求,但却没有所恳求的空间能够运用,会发生什么事呢?
运用易失存储器分配所发生的问题是很杂乱的,要妥善处理这些问题,能够说是一个噩梦!一种代替的办法是,直接以静态的办法,简化内存的分配。例如,只要在 程序中简略地树立一个巨细为256字节长的缓冲区,而不是经由malloc恳求这样巨细的内存缓冲区。此一分配的内存可在整个运用程序的生命周期期 间坚持,且不会有堆或内存碎片问题方面的顾忌。
嵌入式软件牢靠性规划留意的问题
嵌入式软件的最大特色是以操控为主,软硬结合的较多,功用性的操作较多,模块相互间调用的较多,外部作业环境杂乱简略遭到搅扰或搅扰其他设备,且履行过错的结果不仅仅是数据过错而是有或许导致不可估量的灾祸,所以总结起来,嵌入式软件牢靠性规划需留意的问题有四个方面:
1、软件接口
2、软硬件接口
3、软件代码
4、数据、变量
定论
这些都只是一些能够让开发人员开端树立更牢靠嵌入式体系的办法。别的还有许多其他技能,例如运用杰出的编码规范、位翻转的监测、履行数组和指针鸿沟查看,及运用断语等。所有这些技能都是让规划者能够开宣布牢靠性更高嵌入式体系的诀窍。