北航国家精品课程嵌入式系统Chap8嵌入式操作系统uCOS-Ⅱ分析_第1页
北航国家精品课程嵌入式系统Chap8嵌入式操作系统uCOS-Ⅱ分析_第2页
北航国家精品课程嵌入式系统Chap8嵌入式操作系统uCOS-Ⅱ分析_第3页
北航国家精品课程嵌入式系统Chap8嵌入式操作系统uCOS-Ⅱ分析_第4页
北航国家精品课程嵌入式系统Chap8嵌入式操作系统uCOS-Ⅱ分析_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1嵌入式系统嵌入式系统嵌入式嵌入式实时操作系统实时操作系统 C/OS-C/OS-分析分析2006年5月2主要内容n嵌入式操作系统嵌入式操作系统n C/OS-简介简介n C/OS-内核结构内核结构n C/OS-任务管理任务管理n C/OS-时间管理时间管理n C/OS-任务通信与同步任务通信与同步3为什么需要操作系统嵌入式嵌入式微处理器微处理器SDRAMSDRAMROMROMI/OI/OA/DA/DD/AD/A人机交互接口人机交互接口通用接口通用接口实时操作系统(实时操作系统(RTOS)RTOS)图形用户图形用户接口接口BSP/HAL 硬件抽象层/板极支持包BSP/HAL 硬件抽象层/板极支持包

2、任务管理任务管理文件系统文件系统应用程序应用程序嵌入式计算机系统嵌入式计算机系统硬件层硬件层软件层软件层中间层中间层功能层功能层4硬件抽象层的引入硬件抽象层的引入 n嵌入式实时系统自底向上包含三个部分 n硬件环境n嵌入式实时操作系统RTOSn嵌入式实时应用程序n由于嵌入式系统应用的硬件环境差异较大 n新增加的中间层中间层位于操作系统和硬件之间,包含了系统中与硬件相关的大部分功能 ,隐蔽了底层硬件的多样性 5 嵌入式系统的体系结构嵌入式系统的体系结构嵌入式嵌入式微处理器微处理器SDRAMSDRAMROMROMI/OI/OA/DA/DD/AD/A人机交互接口人机交互接口通用接口通用接口实时操作系统

3、(实时操作系统(RTOS)RTOS)图形用户图形用户接口接口BSP/HAL 硬件抽象层/板极支持包BSP/HAL 硬件抽象层/板极支持包任务管理任务管理文件系统文件系统应用程序应用程序嵌入式计算机系统嵌入式计算机系统硬件层硬件层软件层软件层中间层中间层功能层功能层6HAL简介n硬件抽象层(硬件抽象层(HALHAL)是体系结构相关的底层程序)是体系结构相关的底层程序n处理系统启动、硬件初始化以及中断与异常处理系统启动、硬件初始化以及中断与异常n硬件抽象层对内核其它部分提供统一的调用接口硬件抽象层对内核其它部分提供统一的调用接口 nHALHAL可以提供可以提供BSPBSP规范,提供跨平台可移植性规

4、范,提供跨平台可移植性 7硬件抽象层接口定义和代码设计特点硬件抽象层接口定义和代码设计特点 n硬件抽象层具有与硬件密切相关性硬件抽象层具有与硬件密切相关性n硬件抽象层具有与操作系统无关性硬件抽象层具有与操作系统无关性n接口定义的功能应包含硬件或系统所需硬件支接口定义的功能应包含硬件或系统所需硬件支持的所有功能持的所有功能n接口定义简单明了,太多接口函数会增加软件接口定义简单明了,太多接口函数会增加软件模拟的复杂性模拟的复杂性n具有可测性的接口设计有利于系统的软硬件测具有可测性的接口设计有利于系统的软硬件测试和集成试和集成 8HAL设计目标n支持多种的国际主流嵌入式芯片支持多种的国际主流嵌入式芯

5、片n支持数字电视机顶盒、智能手机、数字化音视频、数字仪表等数字化产支持数字电视机顶盒、智能手机、数字化音视频、数字仪表等数字化产品中常见外设的驱动品中常见外设的驱动 n基于甚高端通讯设备的硬件抽象层,能够支持多基于甚高端通讯设备的硬件抽象层,能够支持多CPUCPU体系结构(体系结构(SMPSMP),),以及基于网络元素以及基于网络元素NENE的甚高端通讯设备的甚高端通讯设备n基于智能手机的硬件抽象层,能够支持以基于智能手机的硬件抽象层,能够支持以Intel PCAIntel PCA体系结构为内核的体系结构为内核的智能手机、以智能手机、以Intel EIAIntel EIA体系结构为内核的智能手

6、机,以及以体系结构为内核的智能手机,以及以MotorolaMotorola的的8800088000系列为内核的系列为内核的PDAPDAn基于基于ICIC卡的汇编级硬件抽象层,能够支持数字电视条件接收卡的汇编级硬件抽象层,能够支持数字电视条件接收CACA的的8/16/328/16/32位位CPU ICCPU IC设计和机器码级汇编抽象层设计和机器码级汇编抽象层 9通用操作系统和嵌入式(实时)操作系统通用操作系统和嵌入式(实时)操作系统n通用操作系统:Windows/NT/XP、Linux、UNIX等,用于PC机、服务器,n嵌入式(实时)操作系统:用于嵌入式设备的操作系统,具有通用操作系统的基本特

7、点,又具有系统实时性、硬件的相关依赖性、软件固态化以及应用的专用性等特点;n嵌入式(实时)操作系统通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器Browser等;n嵌入式(实时)操作系统的重要指标:实时性(中断响应时间、任务切换时间等)、尺寸(可裁剪性 )、可扩展性(内核、中间件)10嵌入式操作系统的发展操作系统内核操作系统内核应用程序应用程序驱动程序和固件驱动程序和固件操作系统内核操作系统内核文件系统文件系统驱动程序和固件驱动程序和固件API GUI应用程序应用程序操作系统内核操作系统内核文件系统文件系统驱动程序和固件驱动程序和固件API GUI应

8、用程序应用程序通信协议通信协议库函数库函数80年代初期年代初期80年代中期年代中期-90年代中年代中期期90年代末期年代末期-21世纪世纪11常见的嵌入式操作系统 实时嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。n商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵,如Vxworks、QNX、WinCE、Palm OS等。n免费型的实时操作系统在价格方面具有优势,目前主要有Linux,C/OS是一种源码开放的商业RTOS12学习嵌入式操作系统 n学习一种实时操作系统RTOS,如 C/OS-,掌握实时系统的概念和设计方法n嵌入式系统以应用为中心,要选择“适

9、用”的操作系统n嵌入式Linuxn自己尝试“写”RTOS13RTOS在嵌入式系统中的位置嵌入式硬件平台BSPKERNELFSTCP/IP设备驱动设备驱动设备设备I/O调试工具调试工具其它组件其它组件应用RTOSC/C+14主要内容n嵌入式操作系统嵌入式操作系统n C/OS-简介简介n C/OS-内核结构内核结构n C/OS-任务管理任务管理n C/OS-时间管理时间管理n C/OS-任务通信与同步任务通信与同步15 C/OSC/OS简介简介1 1、 C/OSC/OSMicro Controller O SMicro Controller O S,微控制器操作系统微控制器操作系统2、 C/OS简

10、介简介n美国人Jean Labrosse 1992年完成n应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 n1998年C/OS-II,目前的版本C/OS -II V2.61,2.72n2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中n网站www.ucos-II.com()16u公开源代码u可移植性(Portable) 绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得 C/OS-II便于移植到其他微处理器上。 C/OS-II可以在绝大多

11、数8位、16位、32位以至64位微处理器、微控制器 、数字信号处理器(DSP)上运行。u可固化(ROMable) C/OS-II是为嵌入式应用而设计的,这就意味着,只要用户有固化手段(C编译、连接、下载和固化), C/OS-II可以嵌入到用户的产品中成为产品的一部分。u可裁剪(Scalable) 可以只使用 C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个 C/OS-II调用,而另一个产品则使用了几乎所有 C/OS-II的功能,这样可以减少产品中的 C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。 C/OSC/OS的性能特点(一)的

12、性能特点(一)17u占先式(Preemptive)u多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务u可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性。u任务栈 每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。u系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。u中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达2

13、55层。u稳定性与可靠性 C/OSC/OS的性能特点(二)的性能特点(二)18C/OS-II图籍n描述了C/OS-II内部的工作原理n随书的CD中包含了源代码n工业界最清晰的源代码n除英文版外,有中文和韩文版ChineseKoreanEnglishISBN 1-57820-103-9美国CMP BOOK ISBN 7-81077-290-2北京航空航天大学出版社ISBN 89-951540-5-519 C/OS-IIC/OS-II的各种商业应用的各种商业应用n全世界有数百种产品在应用全世界有数百种产品在应用: :nAvionics(航空电子设备)(航空电子设备)nMedicalnCell ph

14、onesnRouters and switchesnHigh-end audio equipmentnWashing machines and dryersnUPS (Uninterruptible Power Supplies)nIndustrial controllersnGPS Navigation SystemsnMicrowave RadiosnInstrumentationnPoint-of-sale terminalsn更多20 C/OS-IIC/OS-II提供的系统服务提供的系统服务n信号量n带互斥机制的信号量n减少优先级倒置的问题n事件标志n消息信箱n消息队列n内存管理n时钟

15、管理n任务管理21C/GUI and C/FSn C/GUIC/GUIn嵌入式的用户界面n用ANSI C书写n支持任何8, 16, 32-bits CPUn彩色,灰度等级或黑白显示n代码尺寸小n C/FSC/FSn嵌入式的文件系统n用ANSI C书写n支持任何8, 16, 32-bits CPUn支持SMC, MMC, SD, CF, IDE, Flash, RAM其他介质22主要内容n嵌入式操作系统嵌入式操作系统n C/OS-简介简介n C/OS-内核结构内核结构n C/OS-任务管理任务管理n C/OS-时间管理时间管理n C/OS-任务通信与同步任务通信与同步23 C/OSC/OS-II

16、-II的文件结构的文件结构24n内核结构n任务管理n时间管理n任务之间通信与同步nC/OS的移植 C/OSC/OS-II-II分析分析25n当处理临界段代码时,须关中断,处理完毕后,再开中断当处理临界段代码时,须关中断,处理完毕后,再开中断n关中断时间关中断时间是实时内核最重要的指标之一。它影响用户系是实时内核最重要的指标之一。它影响用户系统对实时事件的相应特性。统对实时事件的相应特性。n在实际应用中,关中断的时间很大程度上取决于微处理器在实际应用中,关中断的时间很大程度上取决于微处理器的结构和编译器生成的代码质量的结构和编译器生成的代码质量n微处理器通常具有关中断微处理器通常具有关中断/ /

17、开中断操作。开中断操作。C C编译器须具有某编译器须具有某种机制,能够在种机制,能够在c c中直接实现关中断中直接实现关中断/ /开中断操作开中断操作nC C源代码中插入汇编语言的语句,易实现关中断源代码中插入汇编语言的语句,易实现关中断/ /开中断操作开中断操作n关中断关中断/ /开中断操作作为语言的扩展部分,直接从开中断操作作为语言的扩展部分,直接从C C语言中可以语言中可以 关中断关中断/ /开中断开中断 C/OSC/OS-II-II开关中断的方法开关中断的方法26 C/OSC/OS-II-II开关中断的方法(续开关中断的方法(续1 1)n C/OSC/OS-II-II定义了两个宏调用来

18、开关中断定义了两个宏调用来开关中断: :nOS_ENTER_CRITICAL( ) OS_ENTER_CRITICAL( ) (禁止中断的宏(禁止中断的宏) ) nOS_EXIT_CRITICAL( ) OS_EXIT_CRITICAL( ) ( (启用中断的宏)启用中断的宏)n通常成对出现通常成对出现n上述宏定义取决于使用的微处理器。在文件上述宏定义取决于使用的微处理器。在文件OS_CPU.HOS_CPU.H有相应的宏定义有相应的宏定义n在在 C/OSC/OS-II-II中,每种微处理器都有自己的中,每种微处理器都有自己的OS_CPU.HOS_CPU.H文件文件27 C/OSC/OS-II-

19、II开关中断的方法(续开关中断的方法(续2 2)28 C/OSC/OS-II-II开关中断的方法(续开关中断的方法(续3 3)可以选择可以选择具体使用哪种方法具体使用哪种方法n该常数在与该常数在与CPUCPU类型有关的移植文件类型有关的移植文件OS_CPU.HOS_CPU.H中定义中定义29nOS_CRITICAL_METHOD=1OS_CRITICAL_METHOD=1n用最简单的方式来实现用最简单的方式来实现2 2个宏调用个宏调用n用处理器指令关中断,完成用处理器指令关中断,完成OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()n用开中断指令完成用开中断指令完成O

20、S_EXIT_CRITICAL()OS_EXIT_CRITICAL()n问题:问题:n如果调用如果调用 C/OSC/OS-II-II功能函数时,中断是关掉的,则从功能函数时,中断是关掉的,则从 C/OSC/OS-II-II函数返回时,函数返回时,中断就打开了中断就打开了n若调用若调用 C/OSC/OS-II-II功能函数之前已将中断关掉,那么功能函数之前已将中断关掉,那么用户往往希望用户往往希望从从 C/OSC/OS-II-II函数返回时,中断仍然是关着的。函数返回时,中断仍然是关着的。这时,这种方法就不妥当。这时,这种方法就不妥当。n对特定的处理器,这种办法是唯一的选择对特定的处理器,这种办

21、法是唯一的选择 C/OSC/OS-II-II中采用了中采用了3 3种开关中断的方法种开关中断的方法30 C/OSC/OS-II-II中采用了中采用了3 3种开关中断的方法(续种开关中断的方法(续1 1)nOS_CRITICAL_METHOD=2OS_CRITICAL_METHOD=2n在堆栈中保存中断的开在堆栈中保存中断的开/ /关状态,然后再关中断关状态,然后再关中断n实现实现OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()时,先在堆栈中保存中断的开时,先在堆栈中保存中断的开/ /关状态,然后再关中断关状态,然后再关中断n实现实现OS_EXIT_CRITICAL(

22、)OS_EXIT_CRITICAL()时,从堆栈中弹出原来中断的开时,从堆栈中弹出原来中断的开/ /关状态关状态n利用这种机制,不论用户在调用利用这种机制,不论用户在调用 C/OSC/OS-II-II功能函数功能函数之前中断是开或关,函数的进入和返回状态都得到之前中断是开或关,函数的进入和返回状态都得到了保护。即:调用前中断的开了保护。即:调用前中断的开/ /关状态,在调用之关状态,在调用之后保持不变后保持不变31 C/OSC/OS-II-II中采用了中采用了3 3种开关中断的方法(续种开关中断的方法(续2 2)nOS_CRITICAL_METHOD=3OS_CRITICAL_METHOD=3

23、n把当前处理器的状态字(把当前处理器的状态字(PSWPSW)保存在)保存在C C函数函数的局部变量中(如的局部变量中(如OS_CPU_SROS_CPU_SR)n关中断时保存,开中断时恢复关中断时保存,开中断时恢复32 C/OSC/OS-II-II中采用了中采用了3 3种开关中断的方法(续种开关中断的方法(续3 3)Void Some_ uCOSuCOS_II_Service(arguments_II_Service(arguments) ) OS_CPU_SR cpu_sr OS_CPU_SR cpu_sr; ; cpu_sr=get_processor_psw cpu_sr=get_proc

24、essor_psw();(); disable_interrupts disable_interrupts();(); / /* *临界段代码临界段代码* */ / set_processor_psw(cpu_sr set_processor_psw(cpu_sr);); 33任务(任务(tasktask) 典型的任务:一个无限循环典型的任务:一个无限循环void mytask(void *pdata) for (;) do something; waiting; do something; 34Task Structure void YourTask (void *pdata) (1) fo

25、r (;) (2) /* 用户代码 */ 调用uC/OS-II的某种系统服务: OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用户代码 */ 35任务完成后的自我删除任务完成后的自我删除n当任务完成后,任务可以自我删除当任务完成后,任务可以自我删除n任务代码并非真的删除了,系统只是简单地不再理会任务代码并非真的删除了,系统只是简单地不再理会这个任务这个任务n这个任务的代码也不会再运行了,即使任

26、务调用了这个任务的代码也不会再运行了,即使任务调用了OSTaskDelOSTaskDel(),这个任务也绝不会返回(),这个任务也绝不会返回 void YourTask (void *pdata) /* 用户代码 */ OSTaskDel(OS_PRIO_SELF); 36 C/OSC/OS II II中的任务中的任务n C/OSC/OS II 2.5 II 2.5版本支持版本支持6464个任务,每个任务一个特定的优先级。个任务,每个任务一个特定的优先级。数字越小,优先级越高数字越小,优先级越高n系统总是运行进入就绪态优先级最高的任务系统总是运行进入就绪态优先级最高的任务n任务优先级号就是任务

27、编号(任务优先级号就是任务编号(IDID). .优先级号也被一些内核功能优先级号也被一些内核功能函数调用。如函数调用。如OsTaskChangePrioOsTaskChangePrio( )( )及及OsTaskDelOsTaskDel( ).( ).n系统占用了系统占用了8 8个任务个任务,保留优先级为,保留优先级为0 0、1 1、2 2、3 3、OS_LOWEST_PRIO-3OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0OS_LOW

28、EST_PRIO-0n即:建议不使用上述最高即:建议不使用上述最高4 4个和最低个和最低4 4个优先级,用户任务仍可达个优先级,用户任务仍可达5656个个37任务状态任务状态n在任一给定的时刻,任务的状态一定是在任一给定的时刻,任务的状态一定是以下五种状态之一:以下五种状态之一:n睡眠态(睡眠态(task dormanttask dormant)n就绪态(就绪态(task readytask ready)n运行态(运行态(task runningtask running)n等待状态(等待状态(task waitingtask waiting)n中断服务态(中断服务态(ISR running)I

29、SR running)38睡眠态(睡眠态(task dormanttask dormant)n指任务驻留在程序空间(指任务驻留在程序空间(ROMROM或或RAMRAM),还没有),还没有交给系统来管理的状态交给系统来管理的状态n任务交给系统通过调用以下函数之一来实现:任务交给系统通过调用以下函数之一来实现: nOSTaskCreateOSTaskCreate()()nOSTaskCreateExtOSTaskCreateExt()()n告知系统:告知系统:n任务的起始地址任务的起始地址n任务建立时,用户给任务赋予的优先级任务建立时,用户给任务赋予的优先级n任务要使用的栈空间大小等任务要使用的栈

30、空间大小等39就绪态(就绪态(task readytask ready)n任务一旦创建就进入就绪态,准备运行任务一旦创建就进入就绪态,准备运行n任务的创建可以是在多任务开始之前,也可以任务的创建可以是在多任务开始之前,也可以动态地由一个运行着的任务创建动态地由一个运行着的任务创建n若刚创建任务的优先级高于创建它的任务的优若刚创建任务的优先级高于创建它的任务的优先级,它将立即获得先级,它将立即获得cpucpu的使用权的使用权n任务可通过任务可通过OSTaskDelOSTaskDel()返回睡眠态;或调()返回睡眠态;或调用该函数让另一个任务进入睡眠态用该函数让另一个任务进入睡眠态40运行态(运行

31、态(task runningtask running)n就绪的任务只有当所有优先级高于它的任务都转为等就绪的任务只有当所有优先级高于它的任务都转为等待状态,或被删除后,才能进入运行态待状态,或被删除后,才能进入运行态n任何时刻只有一个任务处于运行态任何时刻只有一个任务处于运行态n调用调用OSStartOSStart()可以启动多任务。该函数只能在启动()可以启动多任务。该函数只能在启动时调用一次时调用一次nOSStartOSStart()运行用户初始化代码中已经建立的、进入()运行用户初始化代码中已经建立的、进入就绪态的优先级最高的任务就绪态的优先级最高的任务41等待状态(等待状态(task

32、waitingtask waiting)n正在运行的任务可以通过下面的调用进入等待状态。延迟时间到,正在运行的任务可以通过下面的调用进入等待状态。延迟时间到,立即强制执行任务切换,让下一个优先级最高、并进入就绪态的任立即强制执行任务切换,让下一个优先级最高、并进入就绪态的任务执行。务执行。nOSTimeDlyOSTimeDly()()nOSTimeDlyHMSMOSTimeDlyHMSM()()n等待时间过去后,系统服务(内部)函数等待时间过去后,系统服务(内部)函数OSTimeTickOSTimeTick()使延迟了()使延迟了的任务进入就绪态的任务进入就绪态n用户无需在应用程序代码中调用这

33、个函数用户无需在应用程序代码中调用这个函数42等待状态(续)等待状态(续)n正在运行的任务可能需要通过调用函数等待某正在运行的任务可能需要通过调用函数等待某一事件发生。如果该事件并未发生,任务就进一事件发生。如果该事件并未发生,任务就进入等待状态入等待状态nOSFlagPendOSFlagPend();();OSMutexPendOSMutexPend()()nOSSemPendOSSemPend();();OSMboxPendOSMboxPend()()n当事件发生或等待超时,被挂起的任务就进入当事件发生或等待超时,被挂起的任务就进入就绪态就绪态43中断服务态(中断服务态(ISR runni

34、ng)ISR running)n正在执行的任务是可以被中断的正在执行的任务是可以被中断的,除非该,除非该任务将中断关闭,或系统将中断关闭。被任务将中断关闭,或系统将中断关闭。被中断的任务便进入了中断服务态中断的任务便进入了中断服务态n响应中断后,正在运行的任务被挂起,中响应中断后,正在运行的任务被挂起,中断服务子程序控制了断服务子程序控制了CPUCPU的使用权的使用权44中断服务态(中断服务态(ISR running)ISR running)n中断服务子程序可能会报告一个或多个事件的发生,中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态而使一个或多个任务进入就绪态n上

35、述情况下,从中断服务子程序返回之前,上述情况下,从中断服务子程序返回之前, C/OSC/OS IIII 要判定:要判定:n被中断的任务是否还是就绪态任务中优先级最高的被中断的任务是否还是就绪态任务中优先级最高的n如果中断服务子程序使另一个优先级更高的任务进入了如果中断服务子程序使另一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得就绪态,则新进入就绪态的这个优先级更高的任务将得以运行;否则,原来被中断了的任务将继续运行。以运行;否则,原来被中断了的任务将继续运行。45任务状态任务状态n当所有的任务都在等待时间发生或等待延迟时间结束时,C/OS II 执行被称为空闲任务(

36、Idle Task)的内部函数,即:OSTaskIdle()46任务状态任务的任务的CPU使用权使用权被剥夺被剥夺中断中断恢复恢复任务任务47任务控制块(任务控制块(TCBTCB)n任务控制块任务控制块 OS_TCBOS_TCB是一个数据结构,保存该任务的相关是一个数据结构,保存该任务的相关参数,包括任务堆栈指针、状态、优先级、任务表位置、参数,包括任务堆栈指针、状态、优先级、任务表位置、任务链表指针等任务链表指针等n所有的任务控制块分为两条链表:所有的任务控制块分为两条链表:n空闲链表空闲链表n使用链表使用链表n当任务的当任务的CPUCPU使用权被剥夺时,系统用它来保存该任务的使用权被剥夺时

37、,系统用它来保存该任务的状态状态n全部驻留在全部驻留在RAMRAM中中48 C/OS-II任务控制块.typedef struct os_tcb OS_STK *OSTCBStkPtr(当前任务堆栈栈顶指针);#if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; (指向用户定义的任务控制块扩展) OS_STK *OSTCBStkBottom;(指向任务堆栈栈底指针) INT32U OSTCBStkSize;(存有栈中可容纳的指针元数目) INT16U OSTCBOpt; INT16U OSTCBId; (存储任务的识别码ID,备用)#endif struc

38、t os_tcb *OSTCBNext; (任务控制块OS-TCB双向链表的后链接) struct os_tcb *OSTCBPrev; (任务控制块OS-TCB双向链表的前链接)#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;(指向事件控制块的指针)#endif49#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg;(指向传递给任务的消息的指针)#endif INT16U OSTCBDly; INT8

39、U OSTCBStat;(任务的状态字) INT8U OSTCBPrio; (任务的优先级) INT8U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;50空任务列表n所有的任务控制块都被放置在任务控制块列表数组所有的任务控制块都被放置在任务控制块列表数组OSTCBTbl 中中n系统初始化时,所有任务控制块被链接成空任务控制块的单向链表系统初始化时,所有任务控制块被链接成空任务控制块的单向链表n任务建立后,任务建立后,空任务控

40、制块指针空任务控制块指针OSTCBFreeList指向的任务控制块就指向的任务控制块就赋给了该任务,然后赋给了该任务,然后OSTCBFreeList的值调整为指向链表中的下一个空的值调整为指向链表中的下一个空任务控制块任务控制块n任务一旦被删除,任务控制块就还给空任务链表任务一旦被删除,任务控制块就还给空任务链表51任务级的任务调度任务级的任务调度-OSSched-OSSchedn C/OSC/OS是是占先式实时多任务内核占先式实时多任务内核,优先级最高的任务一,优先级最高的任务一旦准备就绪,则拥有旦准备就绪,则拥有CPUCPU的所有权即开始投入运行。的所有权即开始投入运行。n C/OSC/O

41、S中中不支持时间片轮转法不支持时间片轮转法,每个任务的优先级要求,每个任务的优先级要求不一样且是唯一的。因此,任务调度就是:查找准备不一样且是唯一的。因此,任务调度就是:查找准备就绪的最高优先级的任务并进行上下文切换。就绪的最高优先级的任务并进行上下文切换。n C/OSC/OS任务调度所花的时间为常数任务调度所花的时间为常数,与应用程序中建立,与应用程序中建立的任务数无关。的任务数无关。52就绪表就绪表根据就绪表确定最高优先级根据就绪表确定最高优先级两个关键:n优先级数分解为高三位和低三位分别确定n高优先级有着小的优先级号着小的优先级号 53根据优先级找到任务在就绪任务表中的位置根据优先级找到

42、任务在就绪任务表中的位置每个就绪的任务都放入就绪表中(每个就绪的任务都放入就绪表中(ready listready list)中,就绪表用两个变)中,就绪表用两个变量表示:量表示:OSRdyGrpOSRdyGrp、OSRdyTblOSRdyTblOSRdyGrpOSRdyGrp1207 6 5 4 300X XX XX XY YY Y Y Y任务优先级20 0176543108915 14 13 1212 1118161723 22 2121 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54

43、 53 52 515856576363 62 61 60 5901234567OSRdyTbl7OSRdyTbl7X XY优先级最低任务优先级最低任务(空闲任务)优先级最高任务优先级最高任务任务优先级号任务优先级号000 00 01 10 0 0 0001 10 01 10 00 0 1 1122154采用查表法确定高优先级任务采用查表法确定高优先级任务 查表法具有确定的时间,增加了系统的可预测性, C/OS II中所有的系统调用时间都是确定的High3 =OSUnMapTblOSRdyGrp;Low3 =OSUnMapTblOSRdyTblHigh3;Prio =(High33)+Low3;

44、OSRdyGrp1207 6 5 4 300XXXYY Y任务优先级20176543108915 14 13 12 1118161723 22 21 20 1926242531 30 29 28 2734323339 38 37 36 3542404147 46 45 44 4350484955 54 53 52 5158565763 62 61 60 5901234567OSRdyTbl7XY55任务调度器(task scheduler)56Task schedulervoid OSSched (void) INT8U y; OS_ENTER_CRITICAL(); (禁止中断的宏(禁止中断

45、的宏) ) if (OSLockNesting =0)&(OSIntNesting= 0) (如果调用来自中断服务程序,或者至少调用了一次给任务调度上锁函数,任务调度函数将退出,不做调度) y = OSUnMapTblOSRdyGrp; (否则,调度找出进入就绪态且优先级最高的任务,就绪任务表相应的位置位) OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly) if (OSPrioHighRdy != OSPrioCur) (优先级最高的任务是否是当前正在运行的任务,若是不调度) OSTCBHighRdy = OSTCBPrioTblO

46、SPrioHighRdy;(若不是,为了实现任务切换,指向优先级最高的任务控制块) OSCtxSwCtr+; (统计计数,跟踪任务切换次数) OS_TASK_SW(); (任务切换) OS_EXIT_CRITICAL(); (开放中断的宏(开放中断的宏) ) 57void OSSchedLock (void) if (OSRunning = TRUE) OS_ENTER_CRITICAL(); if(OSLockNesting 0) OSLockNesting-; if (OSLockNesting=0)&(OSIntNesting=0) OS_EXIT_CRITICAL(); OSS

47、ched(); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 59任务切换任务切换n将被挂起的任务寄存器入栈n将较高优先级任务的寄存器出栈60任务级的任务切换任务级的任务切换OS_TASK_SW()OS_TASK_SW()nOS_TASK_SW()是宏调用,含有微处理器的软中断指令。因为,系统假定任务切换是靠中断级代码完成的。nOS_TASK_SW()将处理器相关的软件中断机制封装起来,便于操作系统移植61调用调用OS_TASK_SW()OS_TASK_SW()前的数据结构前的数据结构低优先级任务 OS_TCBOSTCBCur(1)存贮器低

48、地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务(切换(切换后运行的任务)后运行的任务) OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)PSWPCR1R2R3R4即将被挂起任务的栈顶(即将被挂起任务)(即将被挂起任务)指向即将运行的任务的栈顶62保存当前保存当前CPUCPU寄存器的值寄存器的值低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRd

49、y(2)CPU(1)(3)(3)63重新装入要运行的任务重新装入要运行的任务低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)复制64任务切换任务切换OS_TASK_SW()OS_TASK_SW()的代码的代码Void OSCtxSw(voidVoid OSCtxSw(void) ) 将将R1,R2,R3R1,R2,R3及及R4R4推入当前

50、堆栈;推入当前堆栈; OSTCBCurOSTCBCurOSTCBStkPtrOSTCBStkPtr = SP; = SP; OSTCBCur = OSTCBHighRdy OSTCBCur = OSTCBHighRdy; ; SP = OSTCBHighRdy SP = OSTCBHighRdy OSTCBSTKPtrOSTCBSTKPtr; ; 将将R4,R3,R2R4,R3,R2及及R1R1从新堆栈中弹出;从新堆栈中弹出; 执行中断返回指令;执行中断返回指令; 65 C/OSC/OS-II-II中的中断中的中断l中断:中断:由于某种事件的发生,而导致程序流程的改变。产生中断的由于某种事件的

51、发生,而导致程序流程的改变。产生中断的事件称为中断源。事件称为中断源。lCPU响应中断的条件:响应中断的条件:n至少有一个中断源向至少有一个中断源向CPU发出中断信号;发出中断信号;n系统允许中断,且对此中断信号未予屏蔽系统允许中断,且对此中断信号未予屏蔽l中断类型:中断类型:n硬件中断硬件中断 n外部中断外部中断n陷井中断陷井中断n现场控制量的中断现场控制量的中断66 C/OSC/OS-II-II中的中断服务子程序中的中断服务子程序用户中断服务子程序:用户中断服务子程序: 保存全部保存全部CPUCPU寄存器;寄存器; 调用调用OSIntEnterOSIntEnter()()或或OSIntNe

52、stingOSIntNesting直接加直接加1 1; if(OSIntNestingif(OSIntNesting=1)=1) OSTCBCur-OSTCBStkPtr OSTCBCur-OSTCBStkPtr=SP;=SP; 清中断源;清中断源; 重新开中断;重新开中断; 执行用户代码做中断服务;执行用户代码做中断服务; 调用调用OSIntExitOSIntExit();(); 恢复所有恢复所有CPUCPU寄存器;寄存器; 执行中断返回指令;执行中断返回指令;67中断服务中断服务6869Search for highest priority similar to schedulerHalf

53、 context switch is done by interrupt response i.e. registers saved70中断与时钟节拍中断与时钟节拍n时钟节拍(时钟滴答)Tick,是一种定时器中断,可通过编程方式实现n时钟节拍是一种特殊的中断,操作系统的心脏。首先32位的整数OSTime加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。71时钟节拍中断服务子程序时钟节拍中断服务子程序Void OSTickISR(void) 保存处理器寄存器的值; 调用OSIntEnter(),或是将OSIntNesting加1 if(OSIntNesting

54、=1) OSTCBCur-OSTCBStkPtr=SP; 调用OSTimeTick(); 发出中断设备的中断; 重新允许中断(可选用) 调用OSIntExit(); 恢复处理器寄存器的值; 执行中断返回指令;72void OSTimeTick (void) OS_TCB *ptcb; OSTimeTickHook(); (1) ptcb = OSTCBList; (2) while (ptcb-OSTCBPrio != OS_IDLE_PRIO) (3) OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) i

55、f (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) (4) OSRdyGrp |= ptcb-OSTCBBitY; (5) OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL(); (6) OSTime+; (7) OS_EXIT_CRITICAL();时钟节拍函数OSTimeTick()73n 系统总要建立一个空闲任务,该任务在没有其它任务进入就绪状系统总要建立一个

56、空闲任务,该任务在没有其它任务进入就绪状态时投入运行态时投入运行n 空闲任务永远设为最低优先级空闲任务永远设为最低优先级n 空闲任务不可能被应用软件删除空闲任务不可能被应用软件删除void OSTaskIdle (void *pdata) pdata = pdata; for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); 空闲任务OSTaskIdle()74 C/OSC/OS-II-II初始化初始化l首先调用系统初始化函数首先调用系统初始化函数OSIint()。OSIint()初始化初始化C/OS-所有的所有的变量和数据结构(

57、见变量和数据结构(见OS_CORE.C)。)。lOSInit()建立空闲任务建立空闲任务idle task,这个任务总是处于就绪态的。空闲,这个任务总是处于就绪态的。空闲任务任务OSTaskIdle()的优先级总是设成()的优先级总是设成最低最低,即,即OS_LOWEST_PRIO。l如果统计任务允许如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为和任务建立扩展允许都设为1,则,则OSInit()还得建立统计任务还得建立统计任务OSTaskStat()并且让其进入就绪态并且让其进入就绪态。OSTaskStat的优先级总是设为的优先级总是设为OS_LOWEST_PRIO-1

58、 l空闲和统计任务的任务控制块(空闲和统计任务的任务控制块(OS_TCBs)是用双向链表链接在一)是用双向链表链接在一起的。起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。个任务总是被放在这个链表的起始处。75调用调用OSInitOSInit()()之后的数据结构之后的数据结构 76空闲缓冲区77CC/OS-/OS-的启动的启动void main (void) OSInit(); /* 初始化uC/OS-II */ . . 通过调用OSTaskCreate()或OSTaskCreateExt()创建至

59、少一个任务; . . OSStart(); /* 开始多任务调度!OSStart()永远不会返回 */78启动多任务void OSStart (void) INT8U y; INT8U x; if (OSRunning = FALSE) y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y OS_LOWEST_PRIO) (1) return (OS_PRIO_INVALID); OS_ENTER_CRITICAL(); if (OSTCBPrioTblprio = (OS_TCB *)0) (2)

60、 OSTCBPrioTblprio = (OS_TCB *)1; (3)84 OSTaskCtr+; OSTaskCreateHook(OSTCBPrioTblprio); OS_EXIT_CRITICAL(); if (OSRunning) OSSched(); else OS_ENTER_CRITICAL(); OSTCBPrioTblprio = (OS_TCB *)0; OS_EXIT_CRITICAL(); return (err); else OS_EXIT_CRITICAL(); return (OS_PRIO_EXIST); 85堆栈检验,堆栈检验,OSTaskStkChkOSTaskStkChk()()删除任务,删除任务,OS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论