1嵌入式系统AnIntroductiontoEmbeddedSystem第七课、嵌入式实时多任务软件开发基础浙江大学计算机学院人工智能研究所航天科技-浙江大学基础软件研发中心2课程大纲嵌入式多任务软件开发过程简介嵌入式多任务软件开发实例3嵌入式多任务软件开发过程任务/中断划分任务/中断优先级设计任务/中断总体关联图、关联性分析(同步/互斥设计、优先级逆转分析)任务可调度性分析出错处理及恢复设计任务代码详细设计4任务划分的目标满足“实时性”指标任务数目合理满足操作系统裁剪要求降低系统资源需求5将系统中的各类输入、输出设备、控制系统封装成任务。例如,针对手机系统的任务划分:键盘任务射频收发任务麦克风任务扬声器任务摄像头任务触摸屏显示任务有线通信任务电源管理任务任务划分的方法-设备依赖性任务的划分(1/2)键盘麦克风扬声器触摸屏射频收发电源有线6例如,车载导航系统的任务划分:GPS信号接收实时导航信息接收导航语音提示电源管理任务路径规划任务人机交互任务实时交通GPS电源任务划分的方法-设备依赖性任务的划分(2/2)人机交互路径规划语音提示7“关键”功能的任务指:系统中的这种功能若不能正常实现,将造成重大影响,因此,必须得到运行机会。例如,超市的火警检测系统工作过程为:烟雾传感器-自动报警-启动喷淋灭火-保存火警记录-打印火警记录其中的关键功能是:对烟雾传感器的检测任务划分的方法-关键任务的分离8对烟雾传感器的检测,或者封装成中断服务程序(ISR),或者封装成足够高优先级的任务实现。任务划分的方法-关键任务的分离烟雾传感器触发中断中断服务子程序通信机制通信机制通信机制通信机制自动报警任务喷淋灭火任务保存火警任务打印火警任务烟雾传感器状态查询状态查询与任务分发通信机制通信机制通信机制通信机制自动报警任务喷淋灭火任务保存火警任务打印火警任务9“紧迫”功能的任务指:这种功能需在规定的时间内得到运行权,并在规定的时间内完成,即,具有严格的实时性。例如,放射性测量中的能谱分析仪:将γ射线转换为电脉冲,对脉冲的密集程度与信号幅度进行分析。其中,能谱数据的采集是紧迫任务,希望不遗漏一个脉冲。任务划分的方法-紧迫任务的分离峰值检测电路触发中断中断服务子程序消息队列能谱统计分析任务10用户应用系统中消耗机时最多的是各类数据处理功能单元,应该将这些单元划分出来,分别封装成不同的任务。这些任务的优先级可以安排得比较低。例如:任务划分的方法-数据处理任务的分离数据处理任务11功能关联的任务聚合:将数据关联密切或时序衔接密切的功能单元组合为一个任务,减少数据通讯与任务同步。触发条件相同的任务聚合:将相同事件触发的功能单元组合为一个任务,减少事件分发工作量。运行周期相同的任务聚合。任务划分的方法-任务的聚合12任务划分方法-总结设备依赖性划分任务任务1任务2任务n……关键任务分离紧迫任务分离任务1任务2任务r……ISR-1ISR-2ISR-m……任务的聚合任务1任务2任务P……ISR-1ISR-2ISR-o……数据任务分离13任务/中断优先级设计任务的优先级安排原则如下中断关联性关键性紧迫性中断的优先级安排原则如下关键性紧迫性频繁性快捷性频繁性快捷性传递性14任务/中断关联性分析明确每一个任务与其他任务、中断服务程序间的关联关系,包括:行为同步关系、资源(数据)同步关系两类。行为同步关系,主要包括:本任务(或ISR)的执行需要等待哪些任务(或ISR)发出的信号量或消息?本任务(或ISR)的执行可以向哪些任务(或ISR)发出信号量或消息?资源同步关系,主要包括:本任务(或ISR)的执行需要等待哪些任务(或ISR)提供的数据?本任务(或ISR)的执行可以向哪些任务(或ISR)提供数据?15任务/中断总体关联图当确定了任务划分后,需进一步把这些任务、中断服务程序之间的关联关系分析清楚,可以使用系统总体任务关联图来表示。例如,放射性测量中的能谱分析仪原理框图如下:能谱分析仪键盘输入信号输入液晶显示屏RS-232串口通讯接上位机16任务/中断总体关联图-能谱分析仪能谱分析仪键盘输入信号输入液晶显示屏RS-232接上位机采集ISR键盘任务串口ISR消息队列能谱计算任务能谱显示任务能谱发送任务创建创建创建信号量消费消费生产能谱数据(互斥信号量)任务/中断总体关联图17任务可调度性分析任务划分及优先级安排后,需要进行“任务的可调度性分析”,以便确定是否可以在操作系统调度下正常运行。任务的可调度性分析方法理论分析法:如RM算法中任务可调度性分析的一个充分条件实验仿真法:)-(12n11nTCniCPU使用率上界18多任务软件开发相关错误由于多任务开发中的缺陷所产生的问题,是嵌入式系统开发中最难解决的问题之一,直接影响到系统的可靠性、健壮性、执行效率和可维护性。嵌入式多任务环境下可能出现的问题包括:划分问题:任务~中断优先级设置问题:任务~任务、任务~中断同步问题:中断~任务、任务~任务互斥问题:中断~任务、任务~任务通讯问题:中断~任务、任务~任务异常处理问题:出错与恢复、执行任务取消19课程大纲嵌入式多任务软件开发过程简介嵌入式多任务软件开发实例20多任务软件开发实例-自动售茶机显示屏钱币输入输出系统外形结构图内部结构图自动取茶装置自动倒茶装置21自动售茶机-任务划分根据设备依赖原则,以及关键任务分离,将系统的任务划分如下:钱币输入系统:关键任务,ISR作业分发任务:重要任务,分发售茶任务显示屏:面板显示任务,一般任务自动倒茶装置:自动倒茶任务,一般任务自动取茶装置:自动取茶任务,一般任务22自动售茶机-任务优先级确定系统的任务优先级由高至低,依次确定如下:投币输入请求:ISR作业分发任务:响应0.1s(依据:中断相关性、快捷性、传递性)面板显示任务:响应0.15s(依据:快捷性)自动倒茶任务:响应5s(依据:传递性)自动取茶任务:响应10s23自动售茶机-任务/中断总体关联图自动售茶机的任务/中断总体关联图如下所示:投币ISR系统初始化任务消息队列作业分发任务自动倒茶任务自动取茶任务创建创建创建消费消费生产正在服务的热茶数量(互斥信号量)面板显示任务创建消息队列消息队列24多任务创建静态化:所有任务最好能在初始化时创建完成,而不是动态创建,减小内存碎片;优先级避免动态调整:任务优先级不要动态改变,有利于提高系统稳定性。自动售茶机-多任务编程经验法则1系统初始化任务作业分发任务自动倒茶任务自动取茶任务创建创建创建消息队列消息队列作业分发任务自动倒茶任务自动取茶任务创建创建投币ISR消息队列多任务静态创建多任务动态创建25单条高级语言的操作不一定具有操作原子性,仍需进行互斥保护自动售茶机-多任务编程经验法则2作业分发任务自动倒茶任务自动取茶任务消费消费生产正在服务的热茶数量(互斥信号量)面板显示任务消息队列消息队列Job_undo++Job_undo--LDRR0,JOB_UNDOSUBR0,R0,#1STRJOB_UNDO,R0自动取茶任务:。。。/*Job_undo--*/LDRR0,JOB_UNDO/*10*/SUBR0,R0,#1STRJOB_UNDO,R0。。。作业分发任务JOB_UNDO++/*11*/JOB_UNDO=9任务抢占26信号量任务同步的规范模式:采用信号量进行ISR~任务、任务~任务之间同步的规范模式包括:1:1、n:1、1:n;在实际应用中,n:m的信号量同步最好避免,可以采用事件机制。自动售茶机-多任务编程经验法则3信号量作业分发任务自动倒茶任务自动取茶任务发送发送发送n:1信号量同步其他任务接收信号量作业分发任务自动倒茶任务自动取茶任务发送发送发送n:m信号量同步其他任务接收其他任务接收27基于RISC芯片的多任务共享变量、中断与任务共享变量时,必须使用volatile限定符,强制变量从内存中读取值。例如,取茶设备必须在倒茶设备初始化完成后方能进行:自动售茶机-多任务编程经验法则4取茶设备初始化:。。。while(autotea_initflag!=1)taskSleep(100);。。。倒茶设备初始化:。。。if倒茶设备初始化成功autotea_initflag=1;。。。volatileintautotea_initflag=0;28中断服务程序的处理时间要短:一般应小于100微妙,如果超过1毫秒,应将数据处理部分进行分离,或直接改为高优先级任务方式来执行。例如:USB1.1协议标准的数据传输率为12Mbps,采用中断方式进行传输,每次传输数据块64byte,每秒中断数为:总数据传输量(12×1024×1024)÷每次中断传输数据量(64×8)=24576次/秒;中断服务时间=1÷24576=40.69微妙若ISR执行时间为1毫秒,它的传输速度仅为:64×8×1000=512000bps=500Kbps自动售茶机-多任务编程经验法则529中断服务程序不能被阻塞:ISR不能执行malloc/free、I/O库函数,或是接收信号量函数,在使用消息队列发送、接收函数时,一定要增加发送、接收失败后立即返回参数。自动售茶机-多任务编程经验法则6(1/2)投币ISR系统初始化任务消息队列作业分发任务自动倒茶任务自动取茶任务创建创建创建消费消费生产正在服务的热茶数量(互斥信号量)面板显示任务创建消息队列消息队列若消息队列已满,需立即返回进行异常处理30C/OSII等操作系统,则对ISR不能执行的阻塞式系统调用,直接采取返回出错标志的处理方式。自动售茶机-多任务编程经验法则6(2/2)void*OSQPend(OS_EVENT*pevent,INT16Utimeout,INT8U*perr){……if(pevent-OSEventType!=OS_EVENT_TYPE_Q){*perr=OS_ERR_EVENT_TYPE;return((void*)0);}if(OSIntNesting0){/*SeeifcalledfromISR...*/*perr=OS_ERR_PEND_ISR;/*...can'tPENDfromanISR*/return((void*)0);}if(OSLockNesting0){/*Seeifcalledwithschedulerlocked...*/*perr=OS_ERR_PEND_LOCKED;/*...can'tPENDwhenlocked*/return((void*)0);}OS_ENTER_CRITICAL();……OS_EXIT_CRITICAL();……}C/OSII的消息队列发送代码若在ISR中等待消息队列中消息,则返回错误31多任务环境下的共享库需考虑可重入性:采用局部变量和函数参数来实现,是安全的;对全局变量和全局数据结构进行互斥保护,是安全的;采用任务变量。自动售茶机-多任务编程经验法则7(1/2)多任务运行过程中,可能需要对每个任务有不同值的全局或静态变量。嵌入式操作系统提供了任务变量机制,在任务的控制块TCB中增加一个变量,该变量的值,在任务切换时,被设置为任务的私有值。任务变量切换过程32如果全局数据结构规模较小,而利用该数据结构进行数据处理的时间可能较长,可以先对全局数据结构进行复制,后处理。自动售茶机-多任务编程经验法则7(2/2)例如,需要实现一个基于字典编码的LZW压缩算法库函数,需要一个4096表项的数据字典。对数据字典作为全局数据结构进行保护,可能导致高优先级的压缩任务无法及时处理;可以对数据字典先进行复制,后进行压缩处理的方法进行。33多任务环境下的出错及恢复处理:在单任务系统中出错处理和恢复比较容易,但多任务系统中的出错处理和恢复通常很困难。多任务系统中的出错处理,可以串行处理法,或并行处理法。例如,自动售茶过程中用户多