1、Embedded Software Embedded Software Embedded Software Embedded Software ProgrammingProgrammingProgrammingProgramming陶陶陶陶 凯凯凯凯DirectoryDirectoryDirectoryDirectory Embedded SW Programming Priority InversionWhat is embedded system?Embedded Processor 1What is embedded system?What is embedded system?What
2、 is embedded system?What is embedded system?嵌入式系统一般指有计算机功能但又不称之为嵌入式系统一般指有计算机功能但又不称之为计算机的设备或器材。它是以应用为中心,软计算机的设备或器材。它是以应用为中心,软硬件可裁减的,适应应用系统对功能、可靠性、硬件可裁减的,适应应用系统对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计成本、体积、功耗等综合性严格要求的专用计算机系统。简单地说,嵌入式系统集系统的应算机系统。简单地说,嵌入式系统集系统的应用软件与硬件于一体,具有软件代码小、高度用软件与硬件于一体,具有软件代码小、高度自动化、响应速度快等特点,特
3、别适合于要求自动化、响应速度快等特点,特别适合于要求实时和多任务的体系。实时和多任务的体系。2嵌入式系统主要由嵌入式处理器、相关支撑硬嵌入式系统主要由嵌入式处理器、相关支撑硬件、嵌入式操作系统及应用软件系统等组成,件、嵌入式操作系统及应用软件系统等组成,它是可独立工作的它是可独立工作的“器件器件”。嵌入式系统几乎包括了生活中的所有电器设嵌入式系统几乎包括了生活中的所有电器设备,如掌上电脑、移动计算设备、电视机顶备,如掌上电脑、移动计算设备、电视机顶盒、手机、数字电视、汽车控制系统、微波盒、手机、数字电视、汽车控制系统、微波炉、数码相机、家庭自动化系统、电梯、安炉、数码相机、家庭自动化系统、电梯
4、、安全系统、自动售货机、蜂窝式电话、工业自全系统、自动售货机、蜂窝式电话、工业自动化仪表与医疗仪器等。动化仪表与医疗仪器等。3WhatWhatWhatWhat is embedded system?is embedded system?is embedded system?is embedded system?WhatWhatWhatWhat is embedded system?is embedded system?is embedded system?is embedded system?4嵌入式系统的硬件部分,包括处理器嵌入式系统的硬件部分,包括处理器/微处理微处理器、存储器及外设器件和
5、器、存储器及外设器件和I/O端口、图形控制端口、图形控制器等。嵌入式系统有别于一般的计算机处理器等。嵌入式系统有别于一般的计算机处理系统,它不具备像硬盘那样大容量的存储介系统,它不具备像硬盘那样大容量的存储介质,而大多使用质,而大多使用eprom、eeprom或闪存或闪存(flash memory)作为存储介质。软件部分包括操作作为存储介质。软件部分包括操作系统软件系统软件(要求实时和多任务操作要求实时和多任务操作)和应用程序和应用程序编程。应用程序控制着系统的运作和行为;编程。应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交而操作系统控制着应用程序编程与硬件的交互作用。
6、互作用。Embedded ProcessorEmbedded ProcessorEmbedded ProcessorEmbedded Processor5特点:特点:(1)对实时和多任务有很强的支持能力,对实时和多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时操作系统的执行时间减而使内部的代码和实时操作系统的执行时间减少到最低限度;少到最低限度;(2)具有功能很强的存储区保护具有功能很强的存储区保护功能,这是由于嵌入式系统的软件结构已模块功能,这是由于嵌入式系统的软件结构已模块化,而为了避免在软件模块之间出现错误的交化
7、,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断;时也有利于软件诊断;(3)可扩展的处理器结构,可扩展的处理器结构,以能迅速地扩展出满足应用的高性能的嵌入式以能迅速地扩展出满足应用的高性能的嵌入式微处理器;微处理器;(4)嵌入式微处理器的功耗必须很低,嵌入式微处理器的功耗必须很低,尤其是用于便携式的无线及移动的计算和通信尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统更是如此,功设备中靠电池供电的嵌入式系统更是如此,功耗只能为耗只能为mw甚至甚至w级。级。Embedded Process
8、orEmbedded ProcessorEmbedded ProcessorEmbedded Processor6种类:l嵌入式微处理器(microprocessor unit),如arm、Power PCl嵌入式微控制器(microcontroller unit),俗称单片机lDSP处理器(digital signal processor),对系统结构和指令进行了特殊设计,使其适合于实时地进行数字信号处理l片上系统(system on chip)EmbeddedEmbeddedEmbeddedEmbedded SWSWSWSW ProgrammingProgrammingProgrammin
9、gProgramming7背景知识:l必备硬件组件:必备硬件组件:FlashFlash和和RAMRAM,前者用于存储程序,后者则,前者用于存储程序,后者则是程序运行时指令及数据的存放位置。是程序运行时指令及数据的存放位置。l开发环境:嵌入式系统需要良好的软件开发环境的支持,开发环境:嵌入式系统需要良好的软件开发环境的支持,由于嵌入式系统的目标机资源受限,不可能在其上建立庞由于嵌入式系统的目标机资源受限,不可能在其上建立庞大、复杂的开发环境,因而其开发环境和目标运行环境相大、复杂的开发环境,因而其开发环境和目标运行环境相互分离。因此,嵌入式应用软件的开发方式一般是,在宿互分离。因此,嵌入式应用软
10、件的开发方式一般是,在宿主机主机(Host)(Host)上建立开发环境,进行应用程序编码和交叉编上建立开发环境,进行应用程序编码和交叉编译,然后宿主机同目标机译,然后宿主机同目标机(Target)(Target)建立连接,将应用程序建立连接,将应用程序下载到目标机上进行交叉调试,经过调试和优化,最后将下载到目标机上进行交叉调试,经过调试和优化,最后将应用程序固化到目标机中实际运行应用程序固化到目标机中实际运行。l模块划分:模块划分:硬件驱动模块,一种特定硬件对应一个模块。硬件驱动模块,一种特定硬件对应一个模块。软件功能模块,模块划分应满足低耦合、高内聚的要求。软件功能模块,模块划分应满足低耦合
11、、高内聚的要求。l多任务还是单任务:多任务还是单任务:“单任务单任务”是指系统不能支持多任务并发操作,宏观串行是指系统不能支持多任务并发操作,宏观串行地执行一个任务。地执行一个任务。“多任务多任务”地并发执行通常依赖一个多任务地并发执行通常依赖一个多任务OS(Vxworks/ucLinux)OS(Vxworks/ucLinux)。“多任务多任务”OSOS的核心是系统调度器,使用任务控制块的核心是系统调度器,使用任务控制块(TCB)(TCB)来管理任务调度功能。来管理任务调度功能。任务上下文任务上下文(context)(context),就是当一个执行中的任务被停止,就是当一个执行中的任务被停止
12、时,要保存的所有信息时,要保存的所有信息(各个寄存器的内容各个寄存器的内容)。Embedded SW ProgrammingEmbedded SW ProgrammingEmbedded SW ProgrammingEmbedded SW Programming8Embedded SW ProgrammingEmbedded SW ProgrammingEmbedded SW ProgrammingEmbedded SW Programming9单任务程序典型架构:单任务程序典型架构:(1)(1)从从CPUCPU复位时的指定地址开始执行;复位时的指定地址开始执行;(2)(2)跳转至汇编代码跳转
13、至汇编代码startupstartup处执行;处执行;(3)(3)跳转至用户主程序跳转至用户主程序mainmain执行,在执行,在mainmain中完成:中完成:a.a.初始化硬件设备初始化硬件设备 b.b.初始化各种软件模块初始化各种软件模块 c.c.进入无限循环,调用各模块的处理函数进入无限循环,调用各模块的处理函数注意:几个注意:几个“著名著名”的死循环:的死循环:操作系统;操作系统;WIN32WIN32程序;嵌入式系统软件;多线程程程序;嵌入式系统软件;多线程程序的线程处理函数序的线程处理函数10Embedded SW ProgrammingEmbedded SW Programmin
14、gEmbedded SW ProgrammingEmbedded SW Programming中断服务程序要求:中断服务程序要求:(1)不能返回值;不能返回值;(2)不能向不能向ISR传递参数;传递参数;(3)ISR应该尽可能的短小精悍;应该尽可能的短小精悍;(4)printf(char*lpFormatString,)函数会带来重函数会带来重入和性能问题,不能在入和性能问题,不能在ISR中采用。中采用。/*存放中断的队列存放中断的队列*/typedefstructtagIntQueueintintType;/*中断类型中断类型*/structtagIntQueue*next;IntQueue
15、;IntQueuelpIntQueueHead;_interruptISRexample()intintType;intType=GetSystemType();QueueAddTail(lpIntQueueHead,intType);/*在队列尾加入新的中断在队列尾加入新的中断*/Embedded SW ProgrammingEmbedded SW ProgrammingEmbedded SW ProgrammingEmbedded SW Programming在主程序循环中判断是否有中断:在主程序循环中判断是否有中断:While(1)If(!IsIntQueueEmpty()intType
16、=GetFirstInt();switch(intType)/*是不是很象是不是很象WIN32程序的消息解析函数程序的消息解析函数?*/*对,我们的中断类型解析很类似于消息驱动对,我们的中断类型解析很类似于消息驱动*/casexxx:/*我们称其为我们称其为“中断驱动中断驱动”吧?吧?*/break;casexxx:break;11Embedded SW ProgrammingEmbedded SW ProgrammingEmbedded SW ProgrammingEmbedded SW ProgrammingC的面向对象化:的面向对象化:利用函数指针将利用函数指针将struct模拟为一个包
17、含数据和操作的模拟为一个包含数据和操作的“类类”。下面的。下面的C程序程序模拟了一个最简单的模拟了一个最简单的“类类”:#ifndefC_Class#defineC_Classstruct#endifC_ClassAC_ClassA*A_this;/*this指针指针*/void(*Foo)(C_ClassA*A_this);/*行为:函数指针行为:函数指针*/inta;/*数据数据*/intb;/*解决某些情况下使用解决某些情况下使用C语言编程时程序整体框架结构分散、数据和函数语言编程时程序整体框架结构分散、数据和函数脱节的问题脱节的问题*/12Embedded SW Programming
18、Embedded SW ProgrammingEmbedded SW ProgrammingEmbedded SW Programming内存操作:内存操作:l数据指针数据指针l函数指针函数指针l数组数组vsvs动态申请动态申请 内存空间往往十分有限,不经意的内存泄露会很快导致系统崩内存空间往往十分有限,不经意的内存泄露会很快导致系统崩溃溃(C+(C+中,智能指针中,智能指针);产生内存碎片;产生内存碎片(解决办法:解决办法:Memory Memory Pool)Pool)l关键字关键字const/volatileconst/volatileEx.inta,b,c;a=inWord(0 x10
19、0);b=a;a=inWord(0 x100);c=a;很可能被编译器优化为:很可能被编译器优化为:inta,b,c;a=inWord(0 x100);b=a;c=a;13Priority InversionPriority InversionPriority InversionPriority Inversion问题由来:问题由来:RTOS绝大多数都是多任务实时微内核的结构,采用的是基绝大多数都是多任务实时微内核的结构,采用的是基于优先级的可抢占式调度策略。于优先级的可抢占式调度策略。系统为每一个任务分配一个系统为每一个任务分配一个优先权,调度程序保证当前运行的进程是优先权最高的进程。优先权
20、,调度程序保证当前运行的进程是优先权最高的进程。但是,有时候会出现一种比较奇怪的现象:由于多进程共享但是,有时候会出现一种比较奇怪的现象:由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。崩溃。14Priority InversionPriority InversionPriority InversionPriority InversionEx:(理解理解semaphore,PV操作)操作)Semaphore(信号量)
21、用来解决线程间同步和互斥,包括一个称为信号量的变量(信号量)用来解决线程间同步和互斥,包括一个称为信号量的变量以及对它的两个原语操作(以及对它的两个原语操作(P操作和操作和V操作)操作)P(S):):将信号量将信号量S的值减的值减1,即,即S=S-1;如果如果S=0,则该进程继续执行;否则该进程置为等待状态,排入等待,则该进程继续执行;否则该进程置为等待状态,排入等待队列。队列。V(S):):将信号量将信号量S的值加的值加1,即,即S=S+1;如果如果S0,则该进程继续执行;否则释放队列中第一个等待信号量的,则该进程继续执行;否则释放队列中第一个等待信号量的进程。进程。利用信号量和利用信号量和
22、PV操作实现进程互斥的一般模型是:操作实现进程互斥的一般模型是:进程进程P1进程进程P2进程进程PnP(S););P(S););P(S););临界区;临界区;临界区;临界区;临界区;临界区;V(S););V(S););V(S););思考思考:(1)一个生产者,一个消费者,公用一个缓冲区一个生产者,一个消费者,公用一个缓冲区/n个环形缓冲区。个环形缓冲区。(2)一组生产者,一组消费者,公用一组生产者,一组消费者,公用n个环形缓冲区。个环形缓冲区。15Priority InversionPriority InversionPriority InversionPriority Inversion定义
23、两个同步信号量:定义两个同步信号量:empty表示缓冲区是否为空,初值为表示缓冲区是否为空,初值为1。full表示缓冲区中是否为满,初值为表示缓冲区中是否为满,初值为0。生产者进程生产者进程while(TRUE)生产一个产品生产一个产品;P(empty);产品送往产品送往Buffer;V(full);消费者进程消费者进程while(TRUE)P(full);从从Buffer取出一个产品取出一个产品;V(empty);消费该产品消费该产品;16Priority InversionPriority InversionPriority InversionPriority Inversionempty
24、表示缓冲区是否为空,初值为表示缓冲区是否为空,初值为n。full表示缓冲区中是否为满,初值为表示缓冲区中是否为满,初值为0。mutex1生产者之间的互斥信号量,初值为生产者之间的互斥信号量,初值为1。mutex2消费者之间的互斥信号量,初值为消费者之间的互斥信号量,初值为1。设缓冲区的编号为设缓冲区的编号为1n 1,定义两个指针,定义两个指针in和和out,分别是生产者进程和消费者,分别是生产者进程和消费者进程使用的指针,指向下一个可用的缓冲区。进程使用的指针,指向下一个可用的缓冲区。生产者进程生产者进程while(TRUE)生产一个产品生产一个产品;P(empty);P(mutex1);产品
25、送往产品送往buffer(in);in=(in+1)modn;V(mutex1);V(full);消费者进程消费者进程while(TRUE)P(full);P(mutex2);从从buffer(out)中取出产品中取出产品;out=(out+1)modn;V(mutex2);V(empty);消费该产品消费该产品;17Priority InversionPriority InversionPriority InversionPriority Inversion(1)Task2就绪就绪(2)Task1就绪,系统调用就绪,系统调用Task1执行执行(3)Task1因等待因等待Task3占有的信号量
26、而被阻塞,此时占有的信号量而被阻塞,此时Task2就绪,系统调度就绪,系统调度Task2执行执行(4)Task2结束,由于结束,由于Task3任占有任占有Task1需要的信号量,因此系统调度需要的信号量,因此系统调度Task3执行执行(5)Task3释放占有的信号量,释放占有的信号量,Task1得到需要的信号量而再次被调度执行得到需要的信号量而再次被调度执行(6)Task1结束结束(7)Task3结束结束18Priority InversionPriority InversionPriority InversionPriority Inversion解决方法:解决方法:(1)优先级继承)优先级
27、继承当高优先级任务在等待低优先级的任务占有的信号量时,让低优先级任务继承当高优先级任务在等待低优先级的任务占有的信号量时,让低优先级任务继承高优先级任务的优先级;当低优先级任务释放高优先级任务等待的信号量时,高优先级任务的优先级;当低优先级任务释放高优先级任务等待的信号量时,立即把其优先权降低到原来的优先权。立即把其优先权降低到原来的优先权。(2)优先级极限)优先级极限系统把每一个临界资源与系统把每一个临界资源与1个极限优先权相联系。这个极限优先权等于系统此个极限优先权相联系。这个极限优先权等于系统此时最高优先权加时最高优先权加1。当。当1个任务进入临界区时,系统便把这个极限优先权传递给个任务
28、进入临界区时,系统便把这个极限优先权传递给这个任务,使得这个任务的优先权最高;当这个任务退出临界区后,系统立即这个任务,使得这个任务的优先权最高;当这个任务退出临界区后,系统立即把它的优先权恢复正常,从而保证系统不会出现优先权反转的情况。把它的优先权恢复正常,从而保证系统不会出现优先权反转的情况。19Priority InversionPriority InversionPriority InversionPriority Inversion(1)Task1要获得要获得Task3占有的信号量,占有的信号量,Task3继承继承Task1的优先级的优先级(2)Task3释放释放Task1需要的信号量后,系统恢复其原来的优先级需要的信号量后,系统恢复其原来的优先级(3)Task1完成,系统调度完成,系统调度Task2执行执行20ThanksThanks!21