您的位置 首页 软件

嵌入式软件的开发流程_嵌入式软件的调试

嵌入式软件的开发流程_嵌入式软件的调试-本文首先介绍了嵌入式软件的发展,其次阐述了嵌入式软件的开发流程,最后介绍了嵌入式软件的调试。

  嵌入式软件的开展

  榜首阶段:前期的嵌入式体系规划办法,一般是选用“硬件优先”准则。即在只大略估量软件使命需求的状况下,首要进行硬件规划与完结。然后,在此硬件渠道之上,再进行软件规划。因而很难到达充分运用硬件软件资源,取得最佳功用的作用。一起,一旦在测验时发现问题,需求对规划进行修正时,整个规划流程将从头进行,对本钱和规划周期的影响很大。这种传统的规划办法只能改善硬件/软件各自的功用,在有限的规划空间不行能对体系做出较好的功用归纳优化,在很大程度上依赖于规划者的经历和重复试验。

  第二阶段:90年代以来跟着电子体系功用的日益强壮和微型化,体系规划所触及的问题越来越多,难度也越来越大。一起硬件和软件也不再是截然分隔的两个概念,而是紧密结合、彼此影响的。因而呈现了软硬件协同(codesign)规划办法,即运用一致的办法和东西对软硬件,协同规划软硬件体系结构,以最大极限地发掘体系软硬件才干,避免因为独立规划软硬件体系结构而带来的种种弊端,得到高功用低价值的优化规划方案。

  嵌入式软件的开发流程

  在嵌入式体系的开发进程中,一般选用的办法是现在通用PC机上编程;然后经过穿插编译和链接,将程序做成方针渠道上课运转的二进制代码格局;终究将程序下载到方针渠道上的特定方位,由方针板上发动代码运转这段二进制代码,然后运转起嵌入式体系。

  嵌入式软件开发的根本流程:整个进程中的部分作业在主机上完结的,另一部分作业在方针板上完结。首要,是在主机上的编程作业。朴实运用汇编代码编写源代码,除了编写困难外,调试和保护困难也是汇编代码的难题;而c言语可直接对硬件进行操作,而且又有高档言语程序结构化、简略移植等长处,因而嵌入式体系源代码首要是由汇编言语和c言语混合编写。源代码编写完结后简略保存为源文件,再用主机上树立的穿插编译环境生成.obj文件,而且将.obj文件依照方针板的要求链接成适宜的.image文件。终究经过重定位机制和下载进程,将.image文件下载到方针板上运转。因为无法保证方针板一次就可以运转编译、链接成功的程序,因而后期的调试排错作业就特别重要。调试只能在运转态完结,因而在主机和方针板之间经过衔接,由主机操控方针板上程序的运转,可到达调试内核或许嵌入式运用程序的意图。

  作为从事了5年之久的嵌入式软件开发,以下责任是必需求把握的,嵌入式软件工程师能依据项目办理和工程技术的实践要求,依照体系总体规划标准进行软、硬件实践,编写体系开发标准阐明书等相应的文档;安排和辅导嵌入式体系靠法施行人员施行硬件电路、编写和调试程序,并对嵌入式体系硬件设备和程序进行优化和集成测验,开宣布契合体系总体规划要求的高质量嵌入式体系;具有工程师的实践作业才干和业务水平。

  一起在这样一个技术日进千里的年代中,嵌入式软件开发工程师该干嘛,我给出咱们列一个嵌入式软件开发流程,对你必定有所协助。

  1.学习那些让因特网完结的技术,主张嵌入式工程师学习因特网有关的技术,对职业生涯开展会有加分作用。

  2.学习运用搜索引擎,不要凭空捏造,要善用开放源码国际的信息,许多常见的规划问题其实透过因特网就能找到同范畴菁英奉献的程序代码,与同范畴的其他工程师们彼此沟通、互相协助。

  3.脱离舒适圈,走出舒适圈,应战自我、去学习本来不了解的东西,包含工程以外的常识。

  4.了解实时操作体系,嵌入式工程师从一些较小型的体系着手,累积相关技术经历。

  5.培育多元化技术与体系观,尝试着去开发手机运用程序、或许是学习后端服务器的相关技术,能让你敞开彻底不同的观念,去了解开放性硬件,现在市道上有不少现成的开发板,能让工程 师专心于学习共同算法的开发。

  6.了解软件也要了解新的处理器,除了要深化了解C或C++等根本程序言语,有时也要知道一些抢手的新程序言语以因应特别规划需求,但更重要的是了解新的处理器技术;处理器才是嵌入式体系的实质。

  7.要能了解开放源码软件,主张工程师避免只特长单一范畴,因为那或许会阻止你的生长。对 嵌入式工程师来说,保证自己对软硬件技术都很了解,是十分名贵的价值。

  8.树立体系级的工程思想,嵌入式工程师具有体系导向的思想是很重要的,此外每个嵌入式工程师都应该具有优秀的项目办理技巧,力求按时完结担任的项目。

  9.要能清晰表达自己的主意与定见透过文字或绘图,无论是哪一种工程师,都需求能有用表达自己的主意与定见。

  10.学习无线连接技术,嵌入式工程师需求在接下来1—3年学习无线连接技术,特别是Wi-Fi蓝牙低功耗;因为现在的嵌入式设备与运用者智能手机连接的首要办法。

  嵌入式软件的调试

  在嵌入式软件开发进程中,一般来说,花在测验和花在编码的时刻比为3:1(实践上或许更多)。这个份额跟着你的编程和测验水平的进步而不断下降,但不论怎样,软件测验对一般人来讲很重要。许多年前,一位开发人员为了对嵌入式有更深层次的了解,向Oracle询问了这样的一个问题:我怎样才干知道并懂得我的体系究竟在干些什么呢? Oracle面临这个问题有些吃惊,因为在其时没有人这么问过,而一起代的嵌入式开发人员问的最多的大都环绕“我怎样才干使程序跑的更快”、“什么编译器最好”等浅薄的问题。所以,面临这个不同寻常却异乎老练的问题,Oracle感到欢喜并仔细回复了他:你的问题很有深度很老练,因为只需不断地去深化了解才有或许不断地进步水平。而且Oracle为了鼓舞这位执着的程序员,把10条关于嵌入式软件开发测验的诀窍告知了他:

  1.懂得运用东西

  2.尽早发现内存问题

  3.深化了解代码优化

  4.不要让自己难如登天

  5.重现并阻隔问题

  6.以退为进

  7.承认测验的完整性

  8.进步代码质量意味着节省时刻

  9.发现它,剖析它,处理它

  10.运用初学者的思想

  这十条诀窍在业界广为流传,使许多人获益。本文环绕这十条诀窍翻开论说。

  1.懂得运用东西

  一般嵌入式体系对可靠性的要求比较高。嵌入式体系安全性的失效或许会导致灾难性的成果,即便对错安全性体系,因为大批量出产也会导致严峻的经济损失。这就要求对嵌入式体系,包含嵌入式软件进行严厉的测验、承认和验证。跟着越来越多的范畴运用软件和微处理器操控各种嵌入式设备,对门益杂乱的嵌入式软件进行快速有用的测验更加显得重要。

  就象修车需求东西相同,好的程序员应该可以娴熟运用各种软件东西。不同的东西,有不同的运用范围,有不同的功用。运用这些东西,你可以看到你的体系在干些什么,它又占用什么资源,它究竟和哪些外界的东西打交道。让你抑郁好几天的问题或许经过某个东西就能轻松搞定,惋惜你便是不知道。那么为什么那么多的人总是在折腾个半死之后才想到要用测验东西呢?原因许多,首要有两个。一个是惧怕,另一个是慵懒。惧怕是因为参加测验用具或测验模块到代码需求技巧一起有或许引进新的过错,所以他们总喜爱寄希望于经过不断地修正重编译代码来消除bug,成果却杯水车薪。懒散是因为他们习惯了运用printf之类的简略测验手法。下面来介绍一些嵌入式常用的测验东西。

  2.尽早发现内存问题

  内存问题损害很大,不简略排查,首要有三种类型:内存走漏、内存碎片和内存溃散。关于内存问题情绪必需求清晰,那便是早发现早“医治”。在软件规划中,内存走漏的“名望”最大,首要因为不断分配的内存无法及时地被开释,一朝一夕,体系的内存耗尽。即便仔细的编程内行有时后也会遭受内存走漏问题。有测验过内存走漏的朋友估量都有深刻地体会,那便是内存走漏问题一般躲藏很深,很难经过代码阅读来发现。有些内存走漏乃至或许呈现在库傍边。有或许这自身是库中的bug,也有或许是因为程序员没有正确了解它们的接口阐明文档构成错用。

  在许多时分,大多数的内存走漏问题无法勘探,但或许表现为随机的毛病。程序员们往往会把这种现象见怪于硬件问题。假如用户对体系安稳性不是很高,那么重启体系问题也不大;但,假如用户对体系安稳很高,那么这种毛病就有或许运用户对产品失掉决心,一起也意味着你的项目是个失利的项目。因为内存走漏损害巨大,现在现已有许多东西来处理这个问题。这些东西经过查找没有引证或重复运用的代码块、废物内存搜集、库盯梢等技术来发现内存走漏的问题。每个东西都有利有弊,不过总的来说,用要比不用好。总归,担任的开发人员应该去测验内存走漏的问题,做到防患于未然。

  内存碎片比内存走漏躲藏还要深。跟着内存的不断分配并开释,大块内存不断分解为小块内存,然后构成碎片,一朝一夕,当需求请求大块内存是,有或许就会失利。假如体系内存够大,那么坚持的时刻会长一些,但终究仍是逃不出分配失利的厄运。在运用动态分配的体系中,内存碎片常常产生。现在,处理这个问题最效的办法便是运用东西经过显现体系中内存的运用状况来发现谁是导致内存碎片的元凶巨恶,然后改善相应的部分。

  因为动态内存办理的种种问题,在嵌入式运用中,许多公司爽性就禁用malloc/free的以绝后患。

  内存溃散是内存运用最严峻的成果,首要原因有数组拜访越界、写现已开释的内存、指针计算过错、拜访仓库地址越界等等。这种内存溃散构成体系毛病是随机的,而且很难查找,现在供给用于排查的东西也很少。

  总归,假如要运用内存办理单元的话,必需求当心,并严厉遵守它们的运用规矩,比方谁分配谁开释。

  3.深化了解代码优化

  讲到体系安稳性,人们更多地会想到实时性和速度,因为代码功率对嵌入式体系来说太重要了。知道怎样优化代码是每个嵌入式软件开发人员有必要具有的技术。就象女孩子瘦身相同,最少知道她哪个当地最需求减,才干去购买瘦身药或器件来减掉它。可见,代码优化的条件是找到真实需求优化的当地,然后对症下药,优化相应部分的代码。前面说到的profile(功用剖析东西,一些功用完全IDE都供给这种内置的东西)可以记载各种状况比方各个使命的CPU占用率、各个使命的优先级是否分配稳当、某个数据被复制了多少次、拜访磁盘多少次、是否调用了网络收发的程序、测验代码是否现已封闭等等。

  可是,profile东西在剖析实时体系功用方面仍是有不行的当地。一方面,人们运用profile东西往往是在体系呈现问题即CPU耗尽之后,而profile东西自身对CPU占用较大,所以profile对这种状况很或许不起作用。依据Heisenberg效应,任何测验手法或多或少都会改动体系运转,这个对profiler相同适用!

  总归,进步运转功率的条件是你必需求知道CPU究竟干了些什么干的怎样样。

  4.不要让自己难如登天

  难如登天仅仅对调试的一种生动比方。

  常常听到组里有人对自己正在调试的代码说shit!可以了解,因为代码不是他写的,他有满足的理由去shit bug百出的代码,只需他自己不要写出这种代码,不然有一天同组的其它人或许相同会shit他写的代码。为何会有难如登天呢?肯定是有人把针掉到海里咯;那针为何会掉在海里呢?肯定是有人不当心或草率呗。所以当你在诉苦针那么难找的时分,你是否想过是你自己草率地丢掉的。相同,当你调试个半死的时分,你是否想过你要好好检讨一下最初为了寻求捷径或许没有严厉地遵守好的编码规划规范、没有检测一些假定条件或算法的正确性、没有将一些或许存在问题的代码打上记号呢?关于怎样写高质量请参阅林锐的《高质量c++/c编程攻略》或《关于C的0x8本“经文”》。

  假如你的确现已把针掉在海里是,为了避免在找到之前刺到自己,你必需求做一些防备作业,比方戴上安全手套。相同,为了尽能地露出和捕捉问题本源,咱们可以规划比较全面的过错盯梢代码。怎样来做呢?尽或许对每个函数调用失利作出处理,尽或许检测每个参数输入输出的有用性包含指针以及检测是否过多或过少地调用某个进程。过错盯梢可以让你知道你大约把针掉在哪个方位。

  5.重现并阻隔问题

  假如你不是把针掉在大海了,而是掉在草堆里,那要好办写。因为至少咱们可以把草堆分红许多块,一块一块的找。关于模块独立的大型项目,运用阻隔办法往往是抵挡那些躲藏极深bug的终究办法。假如问题的呈现是间歇性的,咱们有必要设法去重现它并记载使其重现的整个进程以备鄙人一次可以运用这些条件去重现问题。假如你坚信可以运用记载的那些条件去重现问题,那么咱们就可以着手去阻隔问题。怎样阻隔呢?咱们可以用#ifdef把一些或许和问题无关的代码封闭,把体系最小化到仍可以重现问题的境地。假如仍是无法定位问题所在,那么有必要翻开“东西箱”了。可以试着用ICE或数据监视器去查看某个可疑变量的改变;可以运用盯梢东西取得函数调用的状况包含参数的传递;查看内存是否溃散以及仓库溢出的问题。

  6.以退为进

  猎人为了不使自己在森林里走失,他常常会在树木上流下一些符号,以备自己将来有一天走失时可以依据这些符号找到出路。对过去代码的修正进行盯梢记载对将来呈现问题之后的调试很有协助。假如有一天,你最近一次修正的程序跑了好久之后遽然死掉了,那么你这时的榜首反映便是我究竟改动了些什么呢,因为前次修正之前是好的。那么怎样检测这次相关于前次的修正呢?没错,代码操控体系SCS或称版别操控体系VCS(Concurrent Version Control,CVS是VCS的演化版别)。将上个版别check in下来后和当时测验版别比较。比较的东西可以是SCS/VCS/CVS自带的diff东西或其它功用更强的比较东西,比方BeyondCompare和ExamDiff。经过比较,记载一切改动的代码,剖析一切或许导致问题的可疑代码。

  7.承认测验的完整性

  你怎样知道你的测验有多全面呢?掩盖测验(coverage testing)可以答复这个问题。掩盖测验东西可以告知你CPU究竟执行了那些代码。好的掩盖东西一般可以告知你大约20%到40%代码没有问题,而其他的或许存在bug。掩盖东西有不同的测验等级,用户可以依据自己的需求挑选某个等级。即便你很坚信你的单元测验现已很全面而且没有dead code,掩盖东西仍是可以为你指出一些潜在的问题,看下面的代码:

  if (i 》= 0 && (almostAlwaysZero == 0 || (last = i)))

  假如almostAlwaysZero为非0,那么last=i赋值句子就被越过,这或许不是你所希望的。这种问题经过掩盖东西的条件测验功用可以轻松的被发现。

  总归,掩盖测验关于进步代码质量很有协助。

  8.进步代码质量意味着节省时刻

  有研讨标明软件开发的时刻超越80%被用鄙人面几个方面:

  调试自己的代码(单元测验)

  调试自己和其他相关的代码(模块间测验)

  调试整个体系(体系测验)

  更糟糕的是你或许需求花费10-200倍的时刻来找一个bug,而这个bug在开端的时分或许很简略就能找到。一个小bug或许让你支付巨大的价值,即便这个bug对整个体系的功用没有太大的影响,但很或许会影响让那些你可以看得到的部分。所以咱们必需求养成杰出的编码和测验手法以求更高的代码质量,以便缩短调试的代码。

  9.发现它,剖析它,处理它

  这国际没有全能的膏药。profile再强壮也有无能为力的时分;内存监视器再好,也有无法发现的时分;掩盖东西再好用,也有不能掩盖的当地。一些躲藏很深的问题即运竭尽一切东西也有或许无法查到其本源,这时咱们能做的便是经过这些问题所表现出来的外在现象或一些数据输出来发现其间的规则或反常。一旦发现任何反常,必定要深化地了解并回溯其本源,直到处理停止。

  10.运用初学者的思想

  有人这样说过:“有些工作在初学者的脑子里或许有各式各样的状况,可在专家的脑筋里或许就很单一”。有时分,有些简略的问题会被想的很杂乱,有些简略的体系别规划的很杂乱,便是因为你的“专家思想”。当你被问题难住时,关掉电脑,出去逛逛,把你的问题和你的朋友乃至你的小狗说说,或许他们可以给你意想不到的启示。

  总结:嵌入式调试也是一门艺术。就想其它的艺术相同,假如你想取得成功,你有必要具有才智、经历并懂得运用东西。只需咱们可以很好地领会Oracle这十条诀窍,我信任咱们在嵌入式测验方面就可以取得成功。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/93469.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部