第1页(共3页)《嵌入式系统原理及应用》复习一、填空题1、一般而言,嵌入式系统的构架可以分为4个部分:分别是处理器、存储器、输入/输出和软件,一般软件亦分为操作系统相关和应用软件两个主要部分。2、根据嵌入式系统使用的微处理器,可以将嵌入式系统分为嵌入式微控制器,嵌入式DSP处理器,嵌入式微处理器以及片上系统。3、操作系统是联接硬件与应用程序的系统程序,其基本功能有任务管理、任务间通信与同步、内存管理。4、从嵌入式操作系统特点可以将嵌入式操作系统分为实时操作系统和分时操作系统,其中实时系统亦可分为硬实时系统和软实时系统。5、内核负责管理各个任务,或者为每个任务分配CPU时间,并且负责任务之间的通信,内核的基本服务是任务切换。6、嵌入式开发一般采用宿主机/目标机方式方式,其中宿主机一般是指PC机或者台式机。7、哈佛体系结构数据空间和地址空间分开,ARM7TDMI采用冯诺依曼体系的内核架构。8.ARM7TDMI采用3级流水线结构,ARM920TDMI采用5级流水线。9.按操作系统的分类可知,Dos操作系统属于顺序执行操作系统,Unix操作系统属于分时操作系统,VxWorks属于实时嵌入式操作系统。10.uC/OS-II可以管理64个任务,其中2个系统任务,分别是:空闲任务和统计任务,只有56个应用任务。11.堆栈向上增长还是向下增长是由处理器决定的12.试列出几个免费的RTOSeCos、RTEMS、uclinux.二、判断题1、所有的电子设备都属于嵌入式设备。(X)2、冯诺依曼体系将被哈佛总线所取代。(X)3、嵌入式linux操作系统属于免费的操作系统。()4、移植操作系统时需要修改操作系统中与处理器直接相关的程序。()5、USB2.0的最大通信速率为12M/S。()6、CISC将被RISC所取代。(X)7、移植操作系统时需要修改操作系统中与处理器直接相关的程序。()8、嵌入式开发需要专门的软件和硬件设备。()三选择题第2页(共3页)1、下面哪种操作系统不属于商用操作系统。(B)A.windowsxpB.LinuxC.VxWorksD.WinCE2.下面哪点不是嵌入式操作系统的特点。(C)A.内核精简B.专用性强C.功能强大D.高实时性3.下面哪种不属于嵌入式系统的调试方法。(D)A.模拟调试B.软件调试C.BDM/JTAG调试D.单独调试4.在嵌入式ARM处理器中,下面哪种中断方式优先级最高。(A)A.ResetB.数据中止C.FIQD.IRQ5.NANDFLASH和NORFLASH的区别正确的是。(D)A.NOR的读速度比NAND稍慢一些B.NAND的写入速度比NOR慢很多C.NAND的擦除速度远比NOR的慢D.大多数写入操作需要先进行擦除操作6.下面哪种嵌入式操作系统很少用在手机上。(D)A.SymbianB.linuxC.WinCED.VxWorks7、0X17&0X03的运算结果是。(A)(A)0X01(B)0X11(C)0X17(D)0X078、以下哪种方式不属于文件系统的格式。(B)(A)FAT(B)DOS(C)NTFS(D)ELF9、在将UC/OS操作系统移植到ARM处理器上时,以下哪些文件不需要修改。(A)(A)OS_CORE.C(B)INCLUDE.H(C)OS_CPU.H(D)OSTASKINIT10、UC/OS操作系统不包含以下哪几种状态。(C)(A)运行(B)挂起(C)退出(D)休眠11、以下哪种方式不是UC/OS操作系统中任务之间通信方式。(C)(A)信号量(B)消息队列(C)邮件(D)邮箱三、设计题(共51分)1.已知ucos的就绪表、优先级位掩码查找表OSMapTbl,优先级索引查找表OSUnMapTbl。完成以下功能:让一个任务就绪从就绪表中删除一个任务在就绪表中找到最高优先级任务让一个任务就绪:OSRdyGrp|=OSMapTbl[prio3];//prio任务优先级OSRdyTbl[Prio]|=OSMapTbl[prio&0x07];从就绪表中删除一个任务:if((OSRdyTbl[prio3]&=~OSMapTbl[Prio&0x07])==0)OSRdyGrp&=~OSMapTbl[prio3];第3页(共3页)在就绪表中找到最高优先级任务:y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];Prio=(y3)+x;2.学完MC/OS-II及ARM处理器后,谈一下自己对任务堆栈的认识答:在UC/OS-II中每个任务都有自己的任务堆栈,用于存储任务的局部变量、任务切换时的现场环境等。任务堆栈可以静态开辟,即在编译时便分配好的内存空间,在程序运行开始到结束都不会被释放,其优点是管理方便,节省分配与释放时间。另外一种任务堆栈分配方式是动态分配,即通过C编译器提供的malloc()函数分配一定大少的内存空间作为堆栈使用,它可以通过free()释放,因此可以反复利用。但它的缺点是会因为反复申请、释放产生内存碎片。当然,通过规定好每个任务只申请相同大少的内存作为堆栈便可以解决以上问题(或使用uCOS提供的内存管理函数)arm堆栈的组织结构是满栈降的形式,满栈即sp是要停留在最后一个进栈元素,降:就是堆栈的增长方向是从高地址向低地址发展寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。3.根据下面的程序,假设时钟节拍为25毫秒,使用邮箱实现一每灯闪1秒流水灯。结合uclinux90,已发班级邮箱#includeincludes.h/*uC/OSinterface*/#includes3c4510.h#includeserial.h#includetimer.h#includeethernetif.h#includelwipthread.h/*allocatememoryfortasks'stacks*///voidOS_CPU_IRQ_ISR();#defineSTACKSIZE8196//256*4Bytes的堆栈大少OS_STKStack1[STACKSIZE];//定义了4个静态任务堆栈,最后一个没有用到,多余的OS_STKStack2[STACKSIZE];OS_STKStack3[STACKSIZE];OS_STKStack4[STACKSIZE];/*mailboxeventcontrolblocks*/OS_EVENT*Mbox1;//定义4个指向事件控制块的指针,最后一个没有用到,多余的OS_EVENT*Mbox2;//注意:这里的事件控制块可以直接理解为邮箱,邮箱=事件控制块OS_EVENT*Mbox3;OS_EVENT*MComRx;charPassMsg[]=Example1;//定义了一个字符串,用于初始化邮箱消息voidTask1(void*Id)第4页(共3页){char*Msg;//定义一个指针,存放事件任务块指针INT8Uerr;//用于存放错误类型Printf(\nTask1()called\r);for(;;){/*waitforamessagefromtheinputmailbox*/Msg=(char*)OSMboxPend(Mbox1,0,&err);//接收邮箱事件控制块Mbox1指针//存于Msg,等待时间为0,接收错误类型于err/*printtask'sid*/Printf(%c,*(char*)Id);outport(IOPDATA,0x2ddd);//点亮灯1OSTimeDly(40);延时/*posttheinputmessagetotheoutputmailbox*/OSMboxPost(Mbox2,Msg);//发送刚才接收的事件Msg到邮箱Mbox2}}voidTask2(void*Id){char*Msg;INT8Uerr;Printf(\nTask2()called\r);for(;;){/*waitforamessagefromtheinputmailbox*/Msg=(char*)OSMboxPend(Mbox2,0,&err);//接收邮箱事件控制块Mbox2指针//存于Msg,等待时间为0,接收错误类型于err/*printtask'sid*/Printf(%c,*(char*)Id);outport(IOPDATA,0x2ccc);//点亮灯OSTimeDly(40);延时/*posttheinputmessagetotheoutputmailbox*/OSMboxPost(Mbox3,Msg);//发送刚才接收的事件Msg到邮箱Mbox3}}voidTask3(void*Id){char*Msg;INT8Uerr;Printf(\nTask3()called\r);for(;;){第5页(共3页)/*waitforamessagefromtheinputmailbox*/Msg=(char*)OSMboxPend(Mbox3,0,&err);//接收邮箱事件控制块Mbox2指针//存于Msg,等待时间为0,接收错误类型于err/*printtask'sid*/Printf(%c,*(char*)Id);outport(IOPDATA,0x2bbb);OSTimeDly(40);//延时25msmodifiedbyLJF/*posttheinputmessagetotheoutputmailbox*/OSMboxPost(Mbox1,Msg);//发送刚才接收的事件Msg到邮箱Mbox1}}intmain(void)//#pragmaimport(__use_no_semihosting_swi){charId1='1';charId2='2';charId3='3';OSInit();Mbox1=OSMboxCreate(PassMsg);//创建邮箱,初始化邮箱消息(事件块消息)为PassMsg,Mbox2=OSMboxCreate((void*)0);//这些初始化为0Mbox3=OSMboxCreate((void*)0);OSTaskCreate(Task1,(void*)&Id1,Stack1+STACKSIZE,2);//创建任务OSTaskCreate(Task2,(void*)&Id2,Stack2+STACKSIZE,3);OSTaskCreate(Task3,(void*)&Id3,Stack3+STACKSIZE,4);OSStart();return0;}这里简单说明一下这个程序,三个任务控制了流水灯的三个状态,任务的运行顺序通过邮件的传递顺序决定,即邮箱1—邮箱2—邮箱3—邮箱1……………只要看明白了第一个任务task1的蓝字部分,其它的都一样4.熟悉内控制块的数据结构,空内存控制块链表及OSMemCreate函数OS_MEM*OSMemCreate(void*addr,INT32Unblks,INT32Ublksize,INT8U*err){#ifOS_CRITICAL_METHOD==3/*允许分配变量来存储CPU状态*/OS_CPU_SRcpu_sr;#endifOS_MEM*pmem;INT8U*pblk;void**plink;INT32Ui;#ifOS_ARG_CHK_EN0if(addr==(void*)0){/*检查传递的内存首地址是否合法*/*err=OS_MEM_INVALID_ADDR;/*指明错误类型*/return((OS_MEM*)0);第6页(共3页)}if(nblks2){/*所分配的内存分区至少有两块内存块*/*err=OS_MEM_INVALID_BLKS;/*指明错误类型*/return((OS_MEM*)0);}if(blksizesizeof(void*)){/*内存块必须拥有能存放一个指针的大少*/*err=OS_MEM_INVALID_S