嵌入式软件面试

2024-08-28

嵌入式软件面试(精选6篇)

嵌入式软件面试 第1篇

今天老大让我针对一个面试者出些嵌入式方面的面试题,主要是想对他的技术深度进一步了解。我就出了下面这些问题,每个问题背后都是考察一个嵌入式程序员应该具备的相关技能。当然这些只是我的个人理解,不一定正确。在此与大家分享,只是希朋友们能够得到一点点启发:如何抓住每一个契机展现你的与众不同?同样的技术问题,很多人可能都能够回答得对,但有些人只是知其然而不知所以然。其实面试官每一个问题背后通常都隐藏着一个考察点。如果我们能够透过问题看到背后的实质,在回答出答案的时候还能够借机发挥,我相信90和100分的差别就出来了。哪个面试官不喜欢招一个喜欢思考、能透过现象看本质的员工呢~

下面我们来看看嵌入式C面试题背后到底藏何玄机~。以下仅是个人的一些想法,欢迎大家讨论,拍砖的轻点~~

////////////////////////////

1、int a=2,b=11,c=a+b++/a++;则c值为多少?

【考点】编码规范。

表面上考察你对运算符优先级的掌握程度,但实际上优先级这些玩意很难死记硬背得住?大家的疑惑不就是运算符的结合顺序么?那么如何去避免呢?

c=a+((b++)/(a++))不就行了么,其实问题背后考察的是你的编码规范,如何写清晰易懂的代码,如何在一个团队中让自己的代码狠容易毫无偏差的让新人看懂~

2、Static用在全局变量定义和函数内部局部变量定义有何区别?

【考点】编码规范及模块化设计。

Static变量的两个属性涉及存储位置及可见域。在大型的程序设计中static全局变量可以有效的避免名字空间的重复及无意的变量引用,这样可以有效的提高程序设计的安全性,同时也利用模块化作业

3、在程序设计中哪些地方需要使用define?如何用define来定义一年内有多少小时的常量?

【考点】可移植性。

嵌入式程序设计的特点就是软硬件平台可变性,有效利用define常量可以提高程序的可移植性,这样改动方便,不易出错

4、Define宏语句和inline函数有什么区别?

【考点】时空效率及宏的副作用。

嵌入式系统平台通常存储资源有限,但同时又对实时性有一定的要求,二者如何权衡需要考虑。Define宏语句相对于函数调用能提高运行时间性能,但消耗了空间,并且不标准的宏语句定义在不标准的编码中更容易出现副作用,因此inline函数则是define语句的完美替代品。小资金干大事正是嵌入式的终极目标!

5、哪些地方可以用到const?const变量和函数输入参数用const修饰有哪些作用?

【考点】程序设计可靠性。

Const只读变量可以有效克服define常量的一些弊端,如无类型安全检查。Const形参可以有效避免程序内部更改无意的更改。人非圣贤孰能无误,所以我们要将这些可能的失误统统交给智能的编译器,这样就可以将错误扼杀在摇篮中

6、Int,short,char在32位平台下各占几个字节?一个结构体含有int、short、char变量各一个,结构体占据的总内存空间多少?

【考点】跨平台移植。

嵌入式并非x86,其硬件平台具备很大的差异性,同为int在不同的架构体系下可能占据的字节数是不一样的。不同的平台也有不同的编译器,其在变量对齐方面可能有不同的特性。因此在结构体定义时如何设计成员变量的顺序以有效减少占据的内存空间,以及如何填充特定字段保证访问对齐问题,都是嵌入式系统结构体设计时应该考虑的跨平台可移植性问题

7、如何将unsigned int明确定义为一个32位类型?define和typedef有何区别?

【考点】跨平台移植。

define和typedef都可以实现变量类型重定义,但是typedef类型的指针变量可以有效去除变量定义的二义性。在嵌入式的工程项目中,通常为了保证数据类型的统一且便于跨平台移植时修改数据类型方便,通常都会单独定义一个数据类型的头文件,把所有用到的数据类型typedef成所熟悉的形式

8、有没有用过volatile?有哪些典型的适用场合?

【考点】编译优化的副作用。

通常为了提高程序运行的效率,编译器会自动进行一些优化,如将变量放在寄存器中,以减少存储器访问次数,在数据长期未变时不重新读取内存等等。但是优化有时会带来问题,如硬件寄存器、多任务共享变量、中断和主程序共享变量,优化有可能带来数据访问不一致性的问题,因此对于这些个别变量,我们需要用volatile声明告诉编译器取消优化

9、参数传递有哪些形式?寄存器和堆栈传递各有什么优缺点?

【考点】编译优化、调用性能、接口设计。

每种体系结构及对应的编译器对参数传递都有自己的规定。参数传递并非总是通过堆栈进行的,参数入栈出栈是需要耗费时间的,编译器总是尽量优化利用寄存器来传递参数,因为寄存器的访问效率要高,但当参数过多时,将放弃优化从而用栈传递参数。因此为了提高调用性能,应尽量减少参数个数,太多时可以将所有参数重新定义为一个结构体,利用结构体指针来传递参数。在函数接口设计时应考虑硬件平台和编译器的特性,以灵活定义参数形式

10、中断服务程序设计应注意的问题?中断触发方式的选择?中断处理太长怎么办?中断处理程序如何与主应用程序交互?

【考点】中断服务程序设计。

嵌入式程序最大的特点是经常需要和硬件打交道,中断是接收外界输入的典型方式,通常都决定了系统运行流程,因此如何高效不丢失的处理中断是每个嵌入式程序员应考虑的问题

11、TCP/IP和OSI七层模型是如何划分的?各层的功能,这么设计有什么好处?

【考点】层次化软件设计保证可移植性。

分层模型最大的好处就是某一层变化了,只要其提供上层的接口未变,那么上层就无需做任何改动。因此只需要更改本层的实现即可。嵌入式平台因为软硬件多变性,为了最大限度的利用先前的成果,软件设计一定要遵循这种层次化模型,这样才能保证其可移植性

12、TCP和UDP的区别?各种网络互连设备都用在哪一层?如何建立链接?如何进行拥塞控制?

【考点】协议设计可靠性及缓冲区设计管理。

TCP和UDP的最大区别在于可靠性,TCP通过三次握手协议及超时机制安全可靠的建立或者释放连接。协议设计最大的问题就是如何保证效率合可靠性,TCP的设计为我们提供了一个参考。而滑动窗口机制可以有效的进行拥塞控制,但窗口大小的设计则关系到内存利用率及缓冲效率可靠性等问题。在嵌入式的驱动程序设计中,经常会开辟缓冲区来进行流量控制及防止数据覆盖,缓冲区的大小设计则需要更加具体的应用情况设计才能保证可靠性合灵活性

嵌入式软件面试 第2篇

面试地点:浙江杭州高新人才市场(文三路199号)招聘会:浙江大华技术股份有限公司专场

前记:大年初六就出发了,今年必定将是个(忙碌+压力)的一年 最近一直在为面试做准备,两天前得知大华今天要在高新人才市场开招聘会,于是加紧了准备时间,因为没分配好时间,所以没达到很好的复习效果,一会看看培训期间的PPT,一会做做面试题,一会看看同学的笔记,一会改改简历,一会根据简历来复习,就这样,,最宝贵的两天针对性复习过去了。

2012年2月11日8点晨………………手机铃声响了………,下意识的知道要面对某些事了,迷迷糊糊听见某人的起床声,“哦,我也该起床了…可是我好困,我要再睡会儿“(心里默念道)。

起床了,起床了,,,杜**喊道,我眯了眯眼看着他,哦…… “是该起床了”,不情愿的掀开了被子,然后习惯性的按了下电脑左上角的启动按钮,还像石像似的发呆了一分钟,都过去两分钟了那些困意才像晨雾见到太阳似的渐渐的消失了。因为前天晚上一直到第二天凌晨一点半才睡,再加上失眠了一阵子。失眠是由于这次面试,因为大华的薪资、福利、待遇、休闲娱乐、企业文化都很不错的,所以我挺看重这次招聘会的。对于准备,自我感觉准备的还可以,但还是不够充分,所以在睡觉前,满脑子想的全是什么TCP/IP、UDP啊,SOCKET通信原理啊,汇编指令啊,linux的操作指令啊,mysql的操作语句啊,还有之前面试被提到的问题以及培训期间写的一些小项目啊……等等……等等,满脑子充斥着这些东西……还自己导演了一把面试对话:“假如被问到SOCKET通信原理该如何回答,如果被问TCP/IP协议的三次握手该怎么回答…………“。额,自己给自己当面试官回答的当然挺好的了,不知不觉就睡着了,,,直到凌晨那个刺耳的铃声。

刷牙,洗脸,几分钟搞定;因为最近理了个短寸,这头发是每隔一天不洗就变的更光亮些,因此我还经常指着头对朋友说:“你看我这发型多好,四天不洗,像抹了神马油似的,这么短,梳子的钱都省了。。“(其实几天不洗头,外表很光亮,但是有点痒,而且越挠越痒)下楼,,本来是想坐公交过去的,结果差半分钟没坐上K74,坑爹的K74弟弟一直到9点还没来,这招聘会都快开始了,被逼无奈之下揽了个的哥。打的就是TM的快,15分钟就到了。刚进招聘会大门,眼前近300平方的房间全是人,于是我就去找那个前两天联系我面试的人,结果她给我安排了一位大约30岁的面试官对我进行初步的了解。

开始面试了,首先是自我介绍,这个应该难不住一个会说话的人吧,每个人的回答方式都不一样,我是分三部分来介绍自己的。第一部分,自己的基本信息,如名字,毕业院校,哪里人,工作经验,培训经历,为什么来杭州等等。第二部分是个人喜好,比如说:有点宅,喜欢爬山,不喜欢看电影(高质量的影片除外),不喜欢连续剧,不喜欢小说,第三部分是性格特点,比如说,喜欢交朋友,心细,比较关心周边的朋友。第四部分….(自由发挥)。也可以说一下自己的缺点,但是不要说的太严重,我记得有一次面试,我为了表现自己的诚恳,当面试官问我有什么缺点的时候,我说:自暴自弃,自控力差………,TMD当时面试官就傻了,我还试图力挽狂澜,解释这只是以前的缺点。可是这已经挽不回很差的印象了,所以对于这些致命的缺点Please Shut Up(因为我毕业前就是自己做一些事情,一直做到培训前,所以我面试经验基本上是0吧,而且每次都是表现的很诚恳,经常出闹剧,直接pass)。

有一些爱好我把产生的原因也加进去了,这样我就可以拖长面试时间,还可以让面试官更透彻的了解我。我在面试的时候是这样说的:之所以喜欢爬山是因为我喜欢超越的感觉,我并不会叫朋友用相机在那里咔咔咔的给我留下许多照片,因为我想把更多的时间放在征服这座山上,我想爬的更高、更远,每超越一个人我就都有一种小小的成就感,,,(略,,100字,,根据个人情况自由发挥)。

(自我介绍完毕就开始提问了,由于是初步的筛选,所以都比较简单)(下面是答题对话的过程,根据回忆,大概就是这样)第一题

考官:!@#$%^&*(我没理解题意)我(闷):不知道怎么回答@#¥%……&*()。

考官(换个方式问):你用字符串给字符数组和字符指针初始化。我:写了char str1[10] = “abcdefg”;和char *str2 = “1234567”;考官:str1和str2有什么区别?

我:str1是指向一个字符串的指针,str2是常量字符串指针,str1被分配了地址空间而str2没有分配地址空间,它只是指向这个常量字符串。

考官:字符串str1和str2分别是存在哪里? 我:str1是存在栈上,str2是存在静态存储区。…………..略(100字扩展回答)…………..考官:写出你知道的用字符指针定义的变量;

我(自信的):1,char *c;char **c;2,char *c[10];….3,char(*)[10];….4,char *(*)(int);5,char *((void*)())(int);等等写了大约10个,因为我对第五个不熟悉,也不知道写的对不对,于是他就在这个点上对我进行狂轰滥炸,幸亏我及时想起来了,那个是函数指针,于是我开始解释,,,此处略去五十字。分析:不要把自己往不熟悉的问题上扯,那样会引火烧身。

(就这样,我通过了初步面试,然后面试官就拿了张试卷给我,题目如下)(下面是题目,大家可以自己做一下,答案在最后面)1,已知文件in.txt,该文件记录某班级某门课的学生考试成绩,每次记录一条信息,格式为姓名+空格+成绩+回车换行,比如

//////////////////////////////////////////////////////////////////////////////////// In.txt中的数据 排完序写入out.txt 张三 86 ……

李四 79 => 王五 93 王五 93 => ……… ……….张三 86 赵六 71 …………

李四 79 ………….赵六 71 //////////////////////////////////////////////////////////////////////////////////// 请编程实现对考试成绩按照从高到低的顺序排序,把结果输出到文件out.txt,函数声明如下,fin为输入文件,fout为输出文件,成功返回0,失败返回-1; Int fsort(const *fin,const char *fout);//要实现

2,一般的应用网络协议数据由帧头和帧数据体组成,帧头会描述数据的长度。请使用已经实现的数据接收函数recvData和帧数据处理函数processFrame,完成连续接收数据并封装成帧数据进行处理的函数recvAndProcessFrame.//数据帧头定义

Struct DataFrameHeader {

} // 数据接收接口,buffer表示用来接收数据的缓冲,length是需要接收的长度 // 返回实际接收到数据的长度,如果接收失败返回-1.// 实际接收到的数据长度不定,但肯定小于或等于需要接收的数据长度length。Int recvData(void *buffer,int length);//处理帧数据接口,header是帧数据头指针,data是帧数据体指针。Void processFrame(DataFrameHeader *header,void *data);//连续接收数据并封装成帧数据进行处理,接收失败退出函数,否则继续接收并处理。void { } 3,链表节点定义如下: //…需要实现 recvAndProcessFrame()Int size;//…其它头数据

Struct Node { Int data;Node *next;}NODE;有两个链表,已经按data从小到大进行了排序,请编写编写链表合并函数,将两个链表合并为一个有序的链表。// NODE* connect(NODE *head1,NODE *head2){ } //////////////////////////////////////////////////////(因为我复习期间大部分时间放在了代码练习上,再加上一些小道消息,所以我基本上是顺水推舟般的完成了所有题目,写完了就立马交卷。)………………….写完试卷就去找对应的考官,我找到了他,不过要等他结束面前的工作,才可//…需要实现

以审阅我的卷子。(考官结束了手头工作,于是轮到我了)………………….我静坐在考官的对面,而他在阅我的试卷,此时的我只能看到试卷的北面,大约过了2分钟,我也静坐了2分钟,总觉得有点不舒服,于是我就站起来走到考官左侧面说:“如果有什么疑问就直接问我,,,,“.(此处省略50字,是关于个别代码的解释)。因为试卷做得还可以,用时又短(心里很得意),于是在考官快阅完的时候我小小的装了下逼:“我是班级学习委员,我做这些题目很轻松的!@#¥%……&*()“。其实我只是想表现一下自己有优秀的一面,唉,,事实证明我不应该装逼的,俗话说的好:”装逼遭雷劈“,虽然我没被雷劈,可是在后面我是被羞辱的体无完肤。(总结:低调点,小心驶得万年船,自大是考官讨厌的人之一)试卷这个环节结束了,考官说:“恩,你在这里等一下,我去找部门老大(应该是技术总监吧)面试你”,大约3分钟后我在窗口接到了‘老大’的电话,于是我在原地挥挥手,他在电话里说,“我看到你了“,于是我左右张望找了会终于看到了这位老大-----是位40多岁的中年人,于是开始了新一轮的面试。

第一题:

考官(大概的看了下我简历):请写出一个互斥锁的例子。我(有点紧张):

(心里独白:我以为是叫我用汉字描述互斥锁的,由于我是在几个月前写过这样的代码,但是时间太久了,只记得理论知识,忘记代码了,于是我就宁愿相信是汉字描述)。这时,他把笔递给我,我才相信是要我写代码,于是我写了个循环语句,变量都没定义,真丢人啊,…….考官(看我不会写):那你知道在编程中,是如何来保证共享数据操作的完整性?

我(不自信的): 每个对象都对应于一个可称为“ 互斥锁” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象(大概就是这个意思)。(分析:考察我对互斥锁的理解和编程能力)第二题

考官(写了个函数):看这个函数有错误吗?

Void GetMemory(char *p,int length)//length是申请内存空间的长度 { P=(char*)malloc(length);If(p!= NULL)Else Printf(“failn”);} 我(15秒内仔细的看了三遍小代码):

斩钉截铁的回答“没问题“(晕,这个题目我都做过不知多少遍了,也是一个常考Printf(“success”);//内容记不得了所以用**表示 的基础题,竟然答错了,都怪我粗心没看完整个程序的意思,这个失误是让考官pass我的致命伤,牢记)。

(错误原因之一:由于考官的函数是分两次写的,第一次写了函数头Void GetMemory(char *p,int length)把纸递给我并给我解释了一下各变量的意思,然后又继续写下面的部分,写完后就把纸完全递交给我,我不知道怎么回事,完全忘记了函数头,这是个被调用的函数,而我把他当成主函数 里的代码分析了 int main(){ ***代码略*** },于是我的所有注意力都盯在了代码过程上,仔细看了好几遍还是没发现问题,题目是挺简单的,可总觉得有不详的预感)。第二题分析:主要考察我对指针的掌握程度,TMD,指针是我在C语言那本书的所有章节里学的最好的,这题目也挺简单的,竟然在阴沟里翻船了,很不甘心,草。第二题总结:答题要仔细审题,再简单的问题也不要急于给答案。

第三题

考官(藐视状):你看过哪些关于编程的书?说一说你最近看的且最喜欢看的那本书。

我:(内心独白:糟了,培训期间使用的课本不可以说吧?那我就没看过什么书了,C指针,C++prime神马的PDF只是2个月前看了看开头几个章节,因为感觉大部分知识都懂了,所以就没坚持往下看,年前、年后时间基本上都花在了面试题,百度文库和百度知道上。怕考官急,思考了很短时间便回答了)答:“我的大部分时间都花在了百度文库上了,我还有自己的百度博客,我那里转了不少好文章,还有自己总结了好多东西”。

考官(疑问状):那你说出一篇你认为不错的文章。

我:(内心独白:我的时间分明是大部分花在了面试题上,年前在百度文库里看的文章也没什么印象了,基本上是遇到不懂的知识,泛泛的看一下,没深究,印象也不大,因为我怕考官急,于是没加思索的就说了篇还记得标题的文章。)答:《C语言和C++中’0’和NULL的区别》。

(分析:TMD,这次我是把自己往火坑里推了,这篇文章是我面试前一天晚上在百度文库里看到的,因为都凌晨2点了,太晚了,于是我就把文章下载到桌面准备抽时间看,其实只大概的看了前几行,文章的主体内容都是一扫而过)。

考官:那你说出“C语言和C++中’0’和NULL的区别”,至少三点。我(慢吞吞的):

答:1,他们在内存中的值都是 0;2,都可以作为返回值。

(因为怕答错,实在不忍心再回答了)sorry,这篇文章写的有点深。

(第三题分析:课后多看些编程和嵌入式方面的书籍,丰富自己的知识面。)/////////////////////////// 回答完第三题,面试官对我说:“对不起,你今天的面试就到这里了,我们要选拔更优秀的人才”。

我垂头丧气的在凳子上坐着,大约过了一个半分钟。考官:怎么了?

我:不甘心,准备了好多东西没被问到。(面试到此结束)下面是我面试时写的答案,根据我当时做的情况整理了下给大家做参考,没编译,可能有错误。1, typedef struct student { char name[10];int score;}STU;

int fsort(const char *fin,const char *fout){ STU student_information[4];//用链表更好,我用这个演示用,简单点

FILE *file_in,*file_out;if((file_in = fopen(fin,“r”))== NULL){ printf(“cannot open file %sn.”,fin);return-1;} if((file_out = fopen(fout,“w”))== NULL){ printf(“cannot open file %s”,fout);return-1;} //feof(file_in))feof(file_in)结束是非0 结束是0 int i,j;for(i = 0;i < 4;i++)if(fscanf(file_in,“%s %d”,student_information [i].name,&student_information[i].score)!= 2){ printf(“read erro!n”);fclose(file_in);fclose(file_out);return-1;} //程序还少排序和写入,答案我就略去了,很简单的 //还是写上吧,免得有人嫌麻烦 //对数组中的数据进行排序 STU temp;For(I = 0;I < 3;I++){ For(j = i+1;j < 4;j++){

} } //向fout里写入排好序的数据 For(I = 0;I < 4;I++)If(student_information[i].score < student_information[j].score){

} Temp = student_information[i];student_information[i] = student_information[j];student_information[j] = temp;{ Fprintf(fout,“%s %d%c”, student_information[i].name, student_information[i].score,’n’);} //fscanf(fp,%s%d%lf,a,&b,&c)//返回值:整型,数值等于[argument...]的个数 } ////////////////////////////////////////////////////////////////////// 2, void recvAndProcessFrame(){ int rec_length;struct DataFrameHeader *h;//假设length = 512 char buff[512];

while(1){

嵌入式软件开发中的软件测试流程 第3篇

由于军品实时处理等特殊性, 嵌入式软件越来越多地用于军用装备中。嵌入式软件开发过程是一个软硬件相互支持相互作用的复杂过程, 系统软件功能和性能的实现与硬件功能和性能的实现是捆绑在一起的, 且当前军品研制过程大部分采取的是并行工程, 软件开发过程中硬件平台开发过程同步进行, 有时甚至软件编码完成时硬件还未完成研制。现有的软件测试程序和办法主要针对的硬件平台明确的独立软件产品, 不能很好地解决嵌入式系统中软件硬件功能实现上相互作用的问题。因此需针对军品开发特点进一步明确嵌入式软件开发过程中软件测试工作的流程、要求和规范, 以适应军品并行工程中嵌入式软件开发过程的特殊性。

1 嵌入式软件的特点

嵌入式系统开发过程通常是先分别进行软硬件的独立开发, 硬件部分独立开发形成裸机平台, 软件部分独立进行单元、部件、配置项开发编程, 硬件平台测试通过后, 将相应开发的软件在该硬件平台上进行集成, 开展各项功能和性能调试。

在嵌入式系统开发过程中底层驱动程序、操作系统和应用程序的界线是不清晰的, 根据需要甚至混编在一起。系统功能和性能要求必须在软硬件共同作用下才能实现, 因此嵌入式软件开发过程是软硬件之间相互协调、互相反馈和互相测试的过程。同时由于嵌入式系统中软件对硬件的依赖性, 软硬件开发各项功能和性能要求的实现需软件和硬件结合才能得到结果, 这就使得嵌入式软件功能和性能的实现与外部硬件和设备联系紧密, 在大部分情况下嵌入式软件缺乏继承性, 软件与硬件形成一对一的关系, 随着硬件的不断升级, 必须不断地重新开发相应的软件。造成软件编程工作量大, 继承性差, 另一方面, 由于硬件更新速度快, 又存在着软件编制过程中缺乏硬件平台支持的问题, 往往软件编程完成时硬件还在研发过程中, 软件编程完成后还不能确定是否能实现产品的功能和性能要求, 需要在硬件平台上完成相互的联调测试后才能最终确定嵌入式系统基本的功能、性能要求是否能实现。

2 软件测试过程中遇到的问题

从预防为主的角度出发, 软件测试工作开展得越早对软件的质量控制越有利。

传统的软件测试工作分为单元测试、部件测试、配置项测试、系统集成测试四个层次, 对可以脱离硬件平台的纯软件产品, 这一测试方法无疑是可以实现的, 但在嵌入式软件开发过程中, 如何开展软件测试工作遇到了一些问题, 主要问题有:

(1) 在嵌入式软件开发过程中, 由于产品功能性能的实现是软硬件相互结合的过程, 在软硬件结合过程中会根据软硬件的实际情况进行大量的调整, 在没有通过硬件平台验证以前单纯对软件进行正式合格性测试是没有意义的, 但在贯彻预防为主的软件质量管理过程中又要求尽早安排软件测试工作, 如何协调这一矛盾需要进一步的明确。

(2) 对于重大修改或新研设备, 由于算法、功能、性能要求没有在实际平台上进行验证, 产品功能性能需进一步验证, 其新开发的软件一些算法、性能需要在整机功能性能试验期间确定、验证;另一方面在C3I等控制软件开发过程中, 由于各设备与指控中心均为独立开发, 往往由于对接口协议理解的不一致性或协议的周全性不够, 在系统对接联调过程中对软件进行较大改动, 用早期的软件版本进行测试对实际软件质量起不到太大作用。

(3) 在软件测试工作中单元测试、部件测试、配置项测试、系统集成测试等, 每项测试中均包含有功能测试和性能测试内容, 但在嵌入式软件实际开发过程中由于绝大多数装备在软件开发过程中只有单台套装备, 没有测试平台, 因此对嵌入式系统软件的功能测试和性能测试的安排在实际工作中无法实现, 造成了诸多矛盾。

种种矛盾和问题使嵌入式软件测试成了无从下手的死循环:一方面要求软件必须经过单元、部件和配置项测试才能与硬件结合开展调试工作, 另一方面由于软件单元、部件和配置项没有装入硬件实际平台的测试, 又无法最终确认软件的功能性能是否符合要求, 无法完成软件测试工作。

注:全部指全部的单元、部件或配置项;部分指成熟、可预见不会再有变化的单元、部件或配置项;剩余部分指剩下未测的全部单元、部件或配置项。部分的划分, 以部件为基础, 根据各设备的实际情况确定。

3 对嵌入式软件开发过程软件测试工作的过程分解

为解决这一问题, 在贯彻海军装备软件质量管理要求和软件质量测试实施细则过程中, 本着预防为主、实事求是的原则, 针对嵌入式软件开发的特殊情况, 综合考虑测试成本、时间、有效性, 重新明确软件测试阶段与硬件研制阶段的对应关系, 在软件开发过程中, 根据软件开发过程实际情况, 在承制单位软件测试工作中软件测试内容重新划分, 打破单元、部件、配置项测试界限, 各类测试不一刀切, 各部分交叉分批进行, 以推进软件测试工作的进展, 提高软件开发质量水平和过程控制能力。

具体方法和思路:

(1) 对软件测试项目分类, 打破原先单元、部件、配置项测试的过程模式, 除按软件测试要求中将软件测试工作分为单元测试、部件测试、配置项测试、系统集成测试四个过程外, 再将单元测试、部件测试按静态测试、动态测试两部分进行区分, 具体分类见表1。

(2) 对单元测试、部件测试中凡能脱离硬件平台进行的软件测试工作, 如文档审查、代码审查等, 统称为静态测试, 这部分测试内容均应尽量安排在软硬件联调前进行并完成回归。

(3) 对在单元测试、部件测试中需结合硬件真实环境进行测试的内容如性能测试等, 统称为动态测试, 这部分测试内容根据设备是否存在硬件平台, 是否属成熟产品等实际情况, 可以安排在前期进行, 也可与配置项测试、系统集成测试内容一起安排在软硬件调试完成, 通过相关试验验证功能性能达到要求后开始。

各部分软件测试工作具体开展时机见表2。

4 结语

要做好嵌入式软件测试工作, 即要贯彻预防为主的方针, 按软件工程的方法开展软件开发和测试工作, 又要综合考虑软件测试的成本、进度、风险、有效性等因素, 以保证测试的可靠性。在实际工作中我们根据实际产品特点和软件开发过程, 对通用的软件测试过程重新进行了分解和细化, 将事前预防和提高软件测试质量, 减少重复性劳动, 提高工作效率等有机地结合起来, 我们认为这会有助于进一步缩短开发时间, 减少开发成本, 进一步提高军品软件质量水平。

摘要:软件测试工作是软件开发过程的一个重要组成部分。在军品嵌入式软件开发过程中, 特别是在并行工程中, 无法按常规的软件工程方法开展软件测试工作, 需对软件测试工作流程重新进行策划和设计, 以适应军品嵌入式软件开发过程的特殊性。本文提出了嵌入式软件开发过程软件测试流程的一种思路。

嵌入式软件面试 第4篇

关键词:嵌入式软件;开发模式与软件架构;系统安全

中图分类号:TP311 文献标识码:A 文章编号:1006-8937(2016)06-0064-01

信息社会的互联网在发展过程中面临着越来越复杂的问题,嵌入式软件在开发和架构过程中随着功能需求的加大,嵌入式软件也更加广泛地应用于各种设备上,这种广泛的应用对嵌入式软件操作和运行过程中的稳定性和安全性问题提出了更高的要求,然而受到当前技术水平的制约,在软件开发和研制的过程中还存在着较多的问题,它与其他的软件比如说桌面软件等存在着较大的差异,由于其技术还不够成熟,因此在开发和软件架构的过程仍旧是嵌入式软件需要进行解决的关键问题。

1 嵌入式软件开发开发和架构问题简述

首先,在软件的开发阶段,为了减少系统资源的过度消耗,嵌入式的软件在代码的制作过程中主要针对的是用户使用过程中的问题,其复用度比较低,这就导致了软件在实际使用过程中实现用户多项的应用要求时发生困难,这是在开发过程中必须要进行统筹的问题。

其次,嵌入式软件在具体的应用过程中通过与硬件驱动的接口进行对接操作,由于面对的对象硬件驱动等应用对象的差别比较大,在这个过程中不同的设备之间的差异需要嵌入式软件要有与之比较高的兼容性,这需要在软件的开发过程中对常见的的对接的硬件进行操作系统进行代码的编写。

在软件的使用过程中为了解决使用过程中软件本身存在的问题以及满足新的用户要求需要对软件进行升级扩展其功能,并且保证在使用过程中软件的工作效率和安全性,需要向被嵌入的操作系统进行代码的植入,这个问题降低了软件在使用过程中的效率问题,在研发过程中,这造成软件的开发周期延长和开发效率的降低。

2 开发模式和软件架构

嵌入式软件的开发模式与一般的桌面型软件的开发模式的开发过程存在着较大的差异,它首先表现在开发过程中,它首先要考虑到代码在不同接入的硬件系统的兼容性,同时需要在代码的编译过程中交叉编译,这些问题给软件的研发带来很多问题和要求,导致在软件的研发过程中,无法灵活地适应市场的变化随时发生调整。

利用多平台的研发条件以及套件式交付的方式能够最大限度上利用研发平台和实现资源的共享,有效提高产品的质量和减少研发的时间以适应市场的需求,降低研发成本,这是未来嵌入式软件研发的趋势。

在嵌入式软件的研发过程中,准备阶段包括获取开发套件和与开发环境集成,编码的阶段是一个利用终端模拟器进行反馈的系统,在这个过程中,工程师进行相关的应用程序的编写以及进行运行程序的编译,完成后进行初步的运行和调试,通过自动写入终端模拟器进行反馈,如果有缺陷则会重新进行缺陷的部分程序的重新编写。

集成调试的反馈建立在编码基础,调试正常的编码进行应用程序的归档,归档完成后进行集成的编译,并进行运行和调试,集成的编译通过编入目标系统完成试运行,并完成整个过程的试用报告,在运行过程中如果存在漏洞则会重新进入终端模拟器寻找发生漏洞的编码并进行漏洞的修复。

嵌入式软件在应用架构过程中分为三个层面:接入层、应用层和基础层。用户通常通过三种常见的方式进入软件构架实现多种功能的应用层面,电脑接入、手机接入和遥控接入进入用户的数据管理、节能优化、充值服务以及安全控制等应用层面,应用层面通过控制、采集以及通讯等手段实现对电子锁、电器、仪表等接入系统中的控制实现用户的所要求的功能。嵌入式软件系统结构图,如图1所示。

嵌入式软件的各个层面通过协调完成设备的预定功能,通过接入目标设备的接口以及各个设备之间的实现整个系统的运行。在接口层首先存在着接入的要求,这些要求是实现功能的预设。可以通过接入以及用户的功能要求进行具体的配置制定出符合特定要求的软件系统。

进行功能控制和管理的是内核层,这个层面主要进行任务的管理和分配调度,而其他的应用组件比如网络协议和数据库等可以通过存储实现复用以尽量减少软件的进行系统烧入的时间,同时用户可以根据自己的需求进行配置,这就使得软件的应用范围更加广阔。

设备的操作层中对硬件的功能进行封装,通过提供对各种操作系统的硬件功能提供统一的软件接口能够保证软件在烧入的过程中中成功移植的关键所在,这个过程实际上也是实现了硬件操作过程中代码的复用的过程。这种方式可以应用到其他的嵌入嵌入系统的开发利用中,针对不同的芯片进行对应的编码的编写并进行存放实现对不同系统中同一功能元件的代码复用。

3 嵌入式软件开发模式和架构中有关升级和升级的 效果评估

在软件的开发模式和软件架构过程中必须考虑的关键问题就是在后期用户使用过程中的软件升级问题,嵌入式的软件适用不同类型的设备,但是其自身并不存在升级的功能,因此在使用过程中出现的缺陷和漏洞系统无法进行修复,而且在使用过程中,用户会逐渐产生新的功能需求而这种需求在软件的开发和架构过程中往往是无法预期的,这就需要利用远端进行软件的升级。

目前市场上运用的方式需要在软件在开发和架构过程中就进行控制,远端接收到嵌入软件运行过程中的漏洞以及用户发送的升级要求,针对这些问题进行相关的代码的改写以及增加功能代码的写入,这个过程中主机实现了二进制的解析以及命令的下达,需要升级的软件所在的设备实现了与主机的通信并进行数据包的传送,通过数据的传送进行软件升级的准备以及进行必要的软件漏洞和缺陷地弥补等,目前主要通过多次的数据的传输来保证传输数据的完整,同时也对文件长度进行确定保证软件省局数据的准确。

4 结 语

嵌入式软件目前已经占据了较大的市场份额,但是过高的软件研发的经费阻碍了其研究发展的进程,随着市场对于嵌入式软件功能的需求的扩大以及软件质量要求的提高,这对软件的开发模式和软件架构方式的革新提出更高的要求,这要求在软件靠法过程中实现缩短产品的开发周期和成本,另外软件复用通过在计算机系统中进行控制来实现软件研发过程中的大规模应用问题,这对软件的研发成本的降低以及更好地满足用户更为复杂的功能要求具有非常重要的意义。因此,对于软件的开发模式和软件架构的问题的研究还需要进一步的投资和工程人员投入,以实现其大规模的应用。

参考文献:

[1] 吴慧婷,綦志勇.一种简单可靠的嵌入式软件升级方法[J].信息技术与 信息化,2015,(9).

嵌入式软件面试 第5篇

2008-12-09 11:291、LINUX下的Socket套接字和Windows下的WinSock有什么共同点?请从C/C++语言开发的角度描述,至少说出两点共同点。(10分,说得好的每点加5分,没有上限。精通SOCK编程者破格录用。)

本题的目的就是考考应试者的SOCK功底,以及应用能力。答案可谓是五花八门,但是答对的少得可怜。其实答案很多,也很好回答。可见面试者功底确实一般,对SOCK编程只是一知半解。更有甚者,把TCP/IP的原理搬出来讲了一大堆,却无一条符合要求。

参考答案:

第1题,答中一个得5分,答出其它正确答案的,也得5分。

a)都基于TCP/IP协议,都提供了面向连接的TCP SOCK和无连接的UDP SOCK。b)都是一个sock结构体。

c)都是使用sock文件句柄进行访问。

d)都具有缓冲机制。

2、请编写一个标准Shell脚本testd,实现如下功能:

A、在Linux操作系统启动的时候,自动加载/mnt/test/test程序。

B、当test异常退出之后,自动重新启动。

C、当test程序重启次数超过100次,自动复位操作系统。

假设你所拥有的资源:

A、目标机器是一台具有标准shell的嵌入式计算机,CPU为ARM7 56MB,内存16MB,软件环境基于Linux2.6.11和BusyBox1.2构建。

B、当前已有11个用户进程在运行,占用了大部分的CPU时间和内存,你可使用的内存只有2MB左右,CPU时间由系统分派。

(本题满分20分,程序15分,注释5分。程序不能运行的0分,能够运行但有BUG的10分,能够正确无误的运行的15分。清楚编写注释的5分。)

本题是考查LINUX和嵌入式编程功底的,写出程序来的不少,但是95%以上的人竟无视我假设的资源,不知道在重启test程序的时候需要加上一个适当的掩饰时间,以便资源紧张的操作系统有时间回收资源。85%的人不知道写完testd之后,要在init里边加载这个脚本,才能实现启动时自动加载的功能。有人甚至在脚本开头使用bash作为脚本解析器,我已经清清楚楚说明了用“标准shell”!用sh不就完了吗?是习惯作祟吗?

参考答案:

########################################

#testd is a daemon script to start and watch the program test ########################################

#!/bin/sh

#load *.so that may need

if [-r /sbin/ldconfig ];then

ldconfig

fi

#add the libs PATH that may need

export LD_LIBRARY_PATH=“/lib”

#count is the counter of test started times count=0

#main loop

while [ 1 ];do

#add execute attribute for /mnt/test/test chmod +x /mnt/test/test

#run test

/mnt/test/test

#a running times counter

let count=count+1

echo “test running times is $count”

#Is test runs too many times?

if [ “$count”-gt 100 ];then

echo “Will reboot when test runs too many times” reboot

fi

#waiting for test stop...sleep 3

done

嵌入式软件面试 第6篇

嵌入式实时软件可以运用在计算机软件的预测指令执行、动态分配、缓存机制等设计中,以此来提升计算机软件系统设计的科学合理性和实时处理功能。当然,嵌入式实时软件之所以能够在计算机软件中充分发挥作用,主要是其核心嵌入式微处理器可以实时支持软件系统的多任务,且在短时间内快速中断,实现多任务操作及计算机存储区保护。嵌入式实时软件应用到计算机软件设计中,包括软件部分和硬件部分,在嵌入式微处理器的作用下,软件与硬件之间可以交互,促使计算机软件系统具有修复功能、检测功能等,从而大大提高计算机软件系统的应用性[2]。

1.2应用原理

嵌入式实时软件在计算机软件中之所以能够有效应用,主要是计算机科学技术和实时处理技术相融合,如此可以形成CORBA模型,加之嵌入式实时软件在计算机软件中可以远程调节等作用的支持,使得计算机软件设计的过程中可以合理地运用CORBA模型,进而科学、合理地规划计算机软件的个各方面,促使计算机软件充分发挥作用。

1.3嵌入式软件的技术特征

基于以上对计算机软件设计中嵌入式实时软件的概述,确定嵌入式实时软件具有以下技术特征。

1.4可靠性

相对于计算机操作系统来说,嵌入式实时软件是一种操作方式,在计算机软件系统中科学、合理地设计嵌入式实时软件,可以提高计算机软件系统的可靠性。因为计算机软件系统中的嵌入式实时软件可以结合计算机软件系统的实际情况,对系统操作任务进行合理分配与调整,并且有效地强化计算机软件系统,如此可以使计算机软件系统在规定的时间内完成各项任务[3]。

1.5系统可靠性

只有安全的工作环境,嵌入式实时软件系统在计算机运行的过程中,才能保证计算机软件系统安全、可靠;反之,将会影响嵌入式实施软件系统的工作效果。所以,为了保证嵌入式实时软件系统在计算机运行中充分发挥作用,一定要设置安全的、良好的外界环境。

1.6时限性

上一篇:技术负责人工作证明下一篇:你是好人也是个坏人