嵌入式实时操作系统uCOSⅡ分析_第1页
嵌入式实时操作系统uCOSⅡ分析_第2页
嵌入式实时操作系统uCOSⅡ分析_第3页
嵌入式实时操作系统uCOSⅡ分析_第4页
嵌入式实时操作系统uCOSⅡ分析_第5页
已阅读5页,还剩114页未读 继续免费阅读

下载本文档

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

文档简介

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

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

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

4、部分提供统一的调用接口 nHALHAL可以提供可以提供BSPBSP规范,提供跨平台可移植性规范,提供跨平台可移植性 7 硬件抽象层接口定义和代码设计特点硬件抽象层接口定义和代码设计特点 n硬件抽象层具有与硬件密切相关性硬件抽象层具有与硬件密切相关性 n硬件抽象层具有与操作系统无关性硬件抽象层具有与操作系统无关性 n接口定义的功能应包含硬件或系统所需硬件支接口定义的功能应包含硬件或系统所需硬件支 持的所有功能持的所有功能 n接口定义简单明了,太多接口函数会增加软件接口定义简单明了,太多接口函数会增加软件 模拟的复杂性模拟的复杂性 n具有可测性的接口设计有利于系统的软硬件测具有可测性的接口设计有利

5、于系统的软硬件测 试和集成试和集成 8 HAL设计目标 n支持多种的国际主流嵌入式芯片支持多种的国际主流嵌入式芯片 n支持数字电视机顶盒、智能手机、数字化音视频、数字仪表等数字化产支持数字电视机顶盒、智能手机、数字化音视频、数字仪表等数字化产 品中常见外设的驱动品中常见外设的驱动 n基于甚高端通讯设备的硬件抽象层,能够支持多基于甚高端通讯设备的硬件抽象层,能够支持多CPUCPU体系结构(体系结构(SMPSMP),), 以及基于网络元素以及基于网络元素NENE的甚高端通讯设备的甚高端通讯设备 n基于智能手机的硬件抽象层,能够支持以基于智能手机的硬件抽象层,能够支持以Intel PCAIntel

6、PCA体系结构为内核的体系结构为内核的 智能手机、以智能手机、以Intel EIAIntel EIA体系结构为内核的智能手机,以及以体系结构为内核的智能手机,以及以MotorolaMotorola 的的8800088000系列为内核的系列为内核的PDAPDA n基于基于ICIC卡的汇编级硬件抽象层,能够支持数字电视条件接收卡的汇编级硬件抽象层,能够支持数字电视条件接收CACA的的 8/16/328/16/32位位CPU ICCPU IC设计和机器码级汇编抽象层设计和机器码级汇编抽象层 9 通用操作系统和嵌入式(实时)操作系统通用操作系统和嵌入式(实时)操作系统 n通用操作系统:Windows/

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

8、系统内核 文件系统文件系统 驱动程序和固件驱动程序和固件 API GUI 应用程序应用程序 操作系统内核操作系统内核 文件系统文件系统 驱动程序和固件驱动程序和固件 API GUI 应用程序应用程序 通信协议通信协议库函数库函数 80年代初期年代初期80年代中期年代中期-90年代中年代中 期期 90年代末期年代末期-21世纪世纪 11 常见的嵌入式操作系统 实时嵌入式操作系统的种类繁多,大体 上可分为两种,商用型和免费型。 n商用型的实操作系统功能稳定、可靠,有 完善的技术支持和售后服务,但往往价格 昂贵,如Vxworks、QNX、WinCE、Palm OS 等。 n免费型的实时操作系统在价格

9、方面具有优 势,目前主要有Linux,C/OS是一种源码 开放的商业RTOS 12 学习嵌入式操作系统 n学习一种实时操作系统RTOS,如 C/OS-,掌握实时系统的概念和设 计方法 n嵌入式系统以应用为中心,要选择 “适用”的操作系统 n嵌入式Linux n自己尝试“写”RTOS 13 RTOS在嵌入式系统中的位置 嵌入式硬件平台 BSP KERNEL FS TCP/IP 设备驱动设备驱动设备设备I/O 调试工具调试工具 其它组件其它组件 应用 RTOS C/C+ 14 主要内容 n嵌入式操作系统嵌入式操作系统 n C/OS-简介简介 n C/OS-内核结构内核结构 n C/OS-任务管理任

10、务管理 n C/OS-时间管理时间管理 n C/OS-任务通信与同步任务通信与同步 15 C/OSC/OS简介简介 1、C/OSMicro Controller O S,微控制器操作系统 2、 C/OS简介简介 n美国人Jean Labrosse 1992年完成 n应用面覆盖了诸多领域,如照相机、医疗器械、音响 设备、发动机控制、高速公路电话系统、自动提款机 等 n1998年C/OS-II,目前的版本C/OS -II V2.61, 2.72 n2000年,得到美国航空管理局(FAA)的认证,可以用 于飞行器中 n网站www.ucos-II.com() 16 u公开源代码 u可移植性(Porta

11、ble) 绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微 处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部 分已经压到最低限度,使得 C/OS-II便于移植到其他微处理器 上。 C/OS-II可以在绝大多数8位、16位、32位以至64位微处理 器、微控制器 、数字信号处理器(DSP)上运行。 u可固化(ROMable) C/OS-II是为嵌入式应用而设计的,这就意味着,只要用户有 固化手段(C编译、连接、下载和固化), C/OS-II可以嵌入 到用户的产品中成为产品的一部分。 u可裁剪(Scalable) 可以只使用 C/OS-II中应用程序需要的那些系统服务。也就

12、是 说某产品可以只使用很少几个 C/OS-II调用,而另一个产品则 使用了几乎所有 C/OS-II的功能,这样可以减少产品中的 C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠 条件编译实现的。 C/OSC/OS的性能特点(一)的性能特点(一) 17 u占先式(Preemptive) u多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应 用程序最多可以有56个任务 u可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性。 u任务栈 每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈空间,以 便压低应用程序对RAM的需求。

13、 u系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固 定的内存的申请与释放、时间相关函数等。 u中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断 唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层 数可达255层。 u稳定性与可靠性 C/OSC/OS的性能特点(二)的性能特点(二) 18 C/OS-II图籍 n描述了C/OS-II内部的工作原理 n随书的CD中包含了源代码 n工业界最清晰的源代码 n除英文版外,有中文和韩文版 ChineseKoreanEnglish ISBN 1-57820-103-9 美国CMP BOOK I

14、SBN 7-81077-290-2 北京航空航天大学出版社 ISBN 89-951540-5-5 19 C/OS-IIC/OS-II的各种商业应用的各种商业应用 n全世界有数百种产品在应用全世界有数百种产品在应用: : nAvionics(航空电子设备)(航空电子设备) nMedical nCell phones nRouters and switches nHigh-end audio equipment nWashing machines and dryers nUPS (Uninterruptible Power Supplies) nIndustrial controllers nGP

15、S Navigation Systems nMicrowave Radios nInstrumentation nPoint-of-sale terminals n更多 20 C/OS-IIC/OS-II提供的系统服务提供的系统服务 n信号量 n带互斥机制的信号量 n减少优先级倒置的问题 n事件标志 n消息信箱 n消息队列 n内存管理 n时钟管理 n任务管理 21 主要内容 n嵌入式操作系统嵌入式操作系统 n C/OS-简介简介 n C/OS-内核结构内核结构 n C/OS-任务管理任务管理 n C/OS-时间管理时间管理 n C/OS-任务通信与同步任务通信与同步 22 C/OSC/OS-I

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

17、微处理器通常具有关中断/ /开中断操作。开中断操作。C C编译器须具有某编译器须具有某 种机制,能够在种机制,能够在c c中直接实现关中断中直接实现关中断/ /开中断操作开中断操作 nC C源代码中插入汇编语言的语句,易实现关中断源代码中插入汇编语言的语句,易实现关中断/ /开中断操作开中断操作 n关中断关中断/ /开中断操作作为语言的扩展部分,直接从开中断操作作为语言的扩展部分,直接从C C语言中可以语言中可以 关中断关中断/ /开中断开中断 C/OSC/OS-II-II开关中断的方法开关中断的方法 25 C/OSC/OS-II-II开关中断的方法(续开关中断的方法(续1 1) n C/OS

18、C/OS-II-II定义了两个宏调用来开关中断定义了两个宏调用来开关中断: : 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

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

20、ENTER_CRITICAL() n用开中断指令完成用开中断指令完成OS_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 函数返回时,中断仍然是关着的。函数返回时,中断仍然是关着的。这时,这种方法就不妥当。这时

21、,这种方法就不妥当。 n对特定的处理器,这种办法是唯一的选择对特定的处理器,这种办法是唯一的选择 C/OSC/OS-II-II中采用了中采用了3 3种开关中断的方法种开关中断的方法 29 C/OSC/OS-II-II中采用了中采用了3 3种开关中断的方法(续种开关中断的方法(续1 1) nOS_CRITICAL_METHOD=2OS_CRITICAL_METHOD=2 n在堆栈中保存中断的开在堆栈中保存中断的开/ /关状态,然后再关中断关状态,然后再关中断 n实现实现OS_ENTER_CRITICAL()OS_ENTER_CRITICAL()时,先在堆栈中保存中断的开时,先在堆栈中保存中断的开

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

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

24、S_CPU_SR cpu_sr; ; cpu_sr=get_processor_psw cpu_sr=get_processor_psw();(); disable_interrupts disable_interrupts();(); / /* *临界段代码临界段代码* */ / set_processor_psw(cpu_sr set_processor_psw(cpu_sr);); 32 任务(任务(tasktask) 典型的任务:一个无限循环典型的任务:一个无限循环 void mytask(void *pdata) for (;) do something; waiting; do s

25、omething; 33 Task Structure void YourTask (void *pdata) (1) for (;) (2) /* 用户代码 */ 调用uC/OS-II的某种系统服务: OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用户代码 */ 34 n 用户应用程序的一般结构 n“用户任务用户任务” 代码形式上很像代码形式上很像 C函数,但他不是函数,但他不是 函数!函数

26、! n“任务任务” 不能被主函数不能被主函数 main( ) 或其他函数调用,或其他函数调用, 只能被主函数或已激活任务只能被主函数或已激活任务创建创建。 n任务的运行由操作系统调度管理。任务的运行由操作系统调度管理。 35 void MyTask1(void *pdata) void MyTask2(void *pdata) void main( ) OSInit( ); OSTaskCreate( MyTask1, ); OSTaskCreate( MyTask2, ); OSStart( ); 36 nOSTaskCreate( ) 函数原型:函数原型: INT8U OSTaskCrea

27、te( void (*task)(void *pd) , /指向任务的指针指向任务的指针 void *pdata , /传递给任务的参数传递给任务的参数 OS_STK *ptos , /任务堆栈栈顶的指针任务堆栈栈顶的指针 INT8U prio /任务的优先级别任务的优先级别 ) 37 OSTaskCreate( ) 函数使用举例: 定义任务定义任务 task_A void task_A(void* pdata) ; /任务初始化部分 while (1) ; /任务功能代码 在系统在系统 “创建创建” 任务任务 task_A void main(void) OSInit(); /系统初始化部分

28、 OSTaskCreate( task_A, void * 0, OSStart(); 38 任务的基本概念任务的基本概念 n系统任务 n空闲任务(空闲任务(OSTaskIdel( )) n统计任务(统计任务(OSTaskStat( )) 原型:原型:void OSTaskIdel(void* pdata) 原型:原型:void OSTaskStat(void* pdata) 39 n 空闲任务(空闲任务(OSTaskIdel( ))使用说明:)使用说明: 1、uC/OS-II规定用户程序中必须使用规定用户程序中必须使用OSTaskIdel。 2、该任务不能用软件删除。、该任务不能用软件删除。

29、 3、该任务是、该任务是uC/OS-II初始化时自动创建,其任务优先初始化时自动创建,其任务优先 级固定为最低级,用户也可修改该任务的业务。级固定为最低级,用户也可修改该任务的业务。 4、目的、目的 - 使使 CPU 在没有用户任务可执行时也有事可在没有用户任务可执行时也有事可 做。做。 40 n 统计任务(统计任务(OSTaskStat( ))使用说明:)使用说明: 1、功能完成用户任务、功能完成用户任务 CPU 使用率的统计,结果以百分使用率的统计,结果以百分 比的形式存放在变量比的形式存放在变量 OSCPUsage 中。中。 2、该任务用户可选择使用。、该任务用户可选择使用。OS_CFG

30、.H文件中的常数文件中的常数 OS_TASK_STAT_EN 设置为设置为 1,使能该函数。,使能该函数。 3、用户在、用户在OS_CFG.H中使能该任务后,系统自动创建中使能该任务后,系统自动创建 该任务,但在用户使用统计数据前必须调用系统该任务,但在用户使用统计数据前必须调用系统 函数函数 OSStatInit() 先进行初始化。先进行初始化。 4、该任务固定拥有次末任务优先级。、该任务固定拥有次末任务优先级。 41 n任务的优先权和优先级别任务的优先权和优先级别 nuC/OS-II 的每个任务都必须有唯一的优先级。 nuC/OS-II 最多可以管理64个优先级别分配给64个任务。 nuC

31、/OS-II 中用一个8b的整型数来表示优先级别,数字越 小,优先级越高,prio = 0 的任务优先级最高。 nuC/OS-II 中使用任务的优先级(prio)作为任务句柄。 n用户通过修改 OS_CFG.H 中的宏定义常数 OS_LOWEST_PRIO 的值,约定本用户系统的最大优先 级数。 42 任务堆栈任务堆栈 n堆栈堆栈 - FIFO访问原则组织的连续存储器。访问原则组织的连续存储器。 n任务堆栈在任务堆栈在 uC/OS-II 中的应用:中的应用: n任务堆栈是任务的三大组成部分之一。任务堆栈是任务的三大组成部分之一。 n保存保存 CPU 寄存器现场(寄存器现场(R0R12、LR、S

32、PSR 等)。等)。 n本本 Task 的私有数据。的私有数据。 43 n任务堆栈的创建任务堆栈的创建 - 在创建任务的同时,任务堆栈即被创建。在创建任务的同时,任务堆栈即被创建。 举例举例: #define MyTaskStkSize 64 OS_STK MyTaskStk MyTaskStkSize /在在 OS_CPU.H中定义中定义 OS_STK / typedef INT32U OS_STK INT8U OSTaskCreate( void (*task) (void *pd), /指向任务的指针指向任务的指针 void * pdata, /传递给任务的参数传递给任务的参数 MyTa

33、skStk MyTaskStkSize 1 /任务堆栈任务堆栈栈顶栈顶的指针的指针 INT8U prio /任务的优先级别任务的优先级别 ) 44 n任务堆栈的使用注意事项任务堆栈的使用注意事项 _ 存在两种堆栈形式存在两种堆栈形式 n递增堆栈递增堆栈 - 进栈操作进栈操作 向大地址方向发展。向大地址方向发展。 n递减堆栈递减堆栈 - 进栈操作进栈操作 向小地址方向发展。向小地址方向发展。 OSTaskCreate( 46 任务状态任务状态 n在任一给定的时刻,任务的状态一定是在任一给定的时刻,任务的状态一定是 以下五种状态之一:以下五种状态之一: n睡眠态(睡眠态(task dormantt

34、ask dormant) n就绪态(就绪态(task readytask ready) n运行态(运行态(task runningtask running) n等待状态(等待状态(task waitingtask waiting) n中断服务态(中断服务态(ISR running)ISR running) 47 睡眠态(睡眠态(task dormanttask dormant) n指任务驻留在程序空间(指任务驻留在程序空间(ROMROM或或RAMRAM),还没有),还没有 交给系统来管理的状态交给系统来管理的状态 n任务交给系统通过调用以下函数之一来实现:任务交给系统通过调用以下函数之一来实现

35、: nOSTaskCreateOSTaskCreate()() nOSTaskCreateExtOSTaskCreateExt()() n告知系统:告知系统: n任务的起始地址任务的起始地址 n任务建立时,用户给任务赋予的优先级任务建立时,用户给任务赋予的优先级 n任务要使用的栈空间大小等任务要使用的栈空间大小等 48 就绪态(就绪态(task readytask ready) n任务一旦创建就进入就绪态,准备运行任务一旦创建就进入就绪态,准备运行 n任务的创建可以是在多任务开始之前,也可以任务的创建可以是在多任务开始之前,也可以 动态地由一个运行着的任务创建动态地由一个运行着的任务创建 n若

36、刚创建任务的优先级高于创建它的任务的优若刚创建任务的优先级高于创建它的任务的优 先级,它将立即获得先级,它将立即获得cpucpu的使用权的使用权 n任务可通过任务可通过OSTaskDelOSTaskDel()返回睡眠态;或调()返回睡眠态;或调 用该函数让另一个任务进入睡眠态用该函数让另一个任务进入睡眠态 49 运行态(运行态(task runningtask running) n就绪的任务只有当所有优先级高于它的任务都转为等就绪的任务只有当所有优先级高于它的任务都转为等 待状态,或被删除后,才能进入运行态待状态,或被删除后,才能进入运行态 n任何时刻只有一个任务处于运行态任何时刻只有一个任务

37、处于运行态 n调用调用OSStartOSStart()可以启动多任务。该函数只能在启动()可以启动多任务。该函数只能在启动 时调用一次时调用一次 nOSStartOSStart()运行用户初始化代码中已经建立的、进入()运行用户初始化代码中已经建立的、进入 就绪态的优先级最高的任务就绪态的优先级最高的任务 50 等待状态(等待状态(task waitingtask waiting) n正在运行的任务可以通过下面的调用进入等待状态。延迟时间到,正在运行的任务可以通过下面的调用进入等待状态。延迟时间到, 立即强制执行任务切换,让下一个优先级最高、并进入就绪态的任立即强制执行任务切换,让下一个优先级

38、最高、并进入就绪态的任 务执行。务执行。 nOSTimeDlyOSTimeDly()() nOSTimeDlyHMSMOSTimeDlyHMSM()() n等待时间过去后,系统服务(内部)函数等待时间过去后,系统服务(内部)函数OSTimeTickOSTimeTick()使延迟了()使延迟了 的任务进入就绪态的任务进入就绪态 n用户无需在应用程序代码中调用这个函数用户无需在应用程序代码中调用这个函数 51 等待状态(续)等待状态(续) n正在运行的任务可能需要通过调用函数等待某正在运行的任务可能需要通过调用函数等待某 一事件发生。如果该事件并未发生,任务就进一事件发生。如果该事件并未发生,任务

39、就进 入等待状态入等待状态 nOSFlagPendOSFlagPend();();OSMutexPendOSMutexPend()() nOSSemPendOSSemPend();();OSMboxPendOSMboxPend()() n当事件发生或等待超时,被挂起的任务就进入当事件发生或等待超时,被挂起的任务就进入 就绪态就绪态 52 中断服务态(中断服务态(ISR running)ISR running) n正在执行的任务是可以被中断的正在执行的任务是可以被中断的,除非该,除非该 任务将中断关闭,或系统将中断关闭。被任务将中断关闭,或系统将中断关闭。被 中断的任务便进入了中断服务态中断的任

40、务便进入了中断服务态 n响应中断后,正在运行的任务被挂起,中响应中断后,正在运行的任务被挂起,中 断服务子程序控制了断服务子程序控制了CPUCPU的使用权的使用权 53 中断服务态(中断服务态(ISR running)ISR running) n中断服务子程序可能会报告一个或多个事件的发生,中断服务子程序可能会报告一个或多个事件的发生, 而使一个或多个任务进入就绪态而使一个或多个任务进入就绪态 n上述情况下,从中断服务子程序返回之前,上述情况下,从中断服务子程序返回之前, C/OSC/OS IIII 要判定:要判定: n被中断的任务是否还是就绪态任务中优先级最高的被中断的任务是否还是就绪态任务

41、中优先级最高的 n如果中断服务子程序使另一个优先级更高的任务进入了如果中断服务子程序使另一个优先级更高的任务进入了 就绪态,则新进入就绪态的这个优先级更高的任务将得就绪态,则新进入就绪态的这个优先级更高的任务将得 以运行;否则,原来被中断了的任务将继续运行。以运行;否则,原来被中断了的任务将继续运行。 54 任务状态任务状态 n当所有的任务都在等待时间发生或等待 延迟时间结束时,C/OS II 执行被称 为空闲任务(Idle Task)的内部函数, 即:OSTaskIdle() 55 任务状态 任务的任务的CPU使用权使用权 被剥夺被剥夺 中断中断 恢复恢复 任务任务 56 任务控制块(任务控

42、制块(TCBTCB) n任务控制块任务控制块 OS_TCBOS_TCB是一个数据结构,保存该任务的相关是一个数据结构,保存该任务的相关 参数,包括任务堆栈指针、状态、优先级、任务表位置、参数,包括任务堆栈指针、状态、优先级、任务表位置、 任务链表指针等任务链表指针等 n所有的任务控制块分为两条链表:所有的任务控制块分为两条链表: n空闲链表空闲链表 n使用链表使用链表 n当任务的当任务的CPUCPU使用权被剥夺时,系统用它来保存该任务的使用权被剥夺时,系统用它来保存该任务的 状态状态 n全部驻留在全部驻留在RAMRAM中中 n空任务控制块链表空任务控制块链表 - - 未被分配的未被分配的 TC

43、B TCB 链链 OSTCBFreeListOSTCBFreeList。 n任务控制块链表任务控制块链表 - - 已分配的已分配的 TCB TCB 链链 OSTCBListOSTCBList。 57 C/OS-II任务控制块. typedef struct os_tcb OS_STK *OSTCBStkPtr(当前任务堆栈栈顶指针); #if OS_TASK_CREATE_EXT_EN0 void *OSTCBExtPtr; (指向用户定义的任务控制块扩展) OS_STK *OSTCBStkBottom;(指向任务堆栈栈底指针) INT32U OSTCBStkSize;(存有栈中可容纳的指针元

44、数目) INT16U OSTCBOpt; INT16U OSTCBId; (存储任务的识别码ID,备用) #endif struct os_tcb *OSTCBNext; (任务控制块OS-TCB双向链表的后链接) struct os_tcb *OSTCBPrev; (任务控制块OS-TCB双向链表的前链接) #if (OS_Q_EN (指向事件控制块的指针) #endif 58 #if (OS_Q_EN (指向传递给任务的消息的指针) #endif INT16U OSTCBDly; INT8U OSTCBStat;(任务的状态字) INT8U OSTCBPrio; (任务的优先级) INT8

45、U OSTCBX; INT8U OSTCBY; INT8U OSTCBBitX; INT8U OSTCBBitY; #if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq; #endif OS_TCB; 59 任务控制块及任务控制块链表任务控制块及任务控制块链表 n任务控制块链表任务控制块链表 空任务块链表是在空任务块链表是在 uC/OS-II 初始化(初始化(OSInit())时系)时系 统自建的,用户可依据目标系统的实际需求,设定其链表统自建的,用户可依据目标系统的实际需求,设定其链表 长度。长度。 nOS_CFG.H 文件中的宏常数文件中的宏常数 OS_MAX_TA

46、SKS - 用于用于 定义最大用户任务数。定义最大用户任务数。 nUCOS_II.H 文件中的宏常数文件中的宏常数 OS_N_SYS_TASKS - 用用 于约定系统任务数,其值固定为于约定系统任务数,其值固定为 2 。 当应用程序调用函数OSTaskCreate( )创建 一个任务时,这个函数会调用系统函数 OSTCBInit( )来为任务控制块进行初始化。 这个函数首先为被创建任务从空任务控制块 链表获取一个任务控制块,然后用任务的属 性对任务控制块各个成员进行赋值,最后再 把这个任务控制块链入到任务控制块链表的 头部。 当进行系统初始化时,初始化函数 会按用户提供的任务数为系统创建具 有

47、相应数量的任务控制块并把它们链 接为一个链表。 由于这些任务控制块还没有对应的 任务,故这个链表叫做空任务块链表。 即相当于是一些空白的身份证。 60 空任务列表 n所有的任务控制块都被放置在任务控制块列表数组所有的任务控制块都被放置在任务控制块列表数组OSTCBTbl 中中 n系统初始化时,所有任务控制块被链接成空任务控制块的单向链表系统初始化时,所有任务控制块被链接成空任务控制块的单向链表 n任务建立后,任务建立后,空任务控制块指针空任务控制块指针OSTCBFreeList指向的任务控制块就指向的任务控制块就 赋给了该任务,然后赋给了该任务,然后OSTCBFreeList的值调整为指向链表

48、中的下一个空的值调整为指向链表中的下一个空 任务控制块任务控制块 n任务一旦被删除,任务控制块就还给空任务链表任务一旦被删除,任务控制块就还给空任务链表 61 uC/OS-II 中提供了系统函数 OSTaskDel( ), 用于删除一个任务 - 实质就是将该任务 的TCB从“任务控制块列表” 移到了 “空任务控制块列表” 。 任务控制块及任务控制块链表任务控制块及任务控制块链表 任务控制块就相当于是 一个任务的身份证,没有任 务控制块的任务是不能被系 统承认和管理。 n任务控制块链表任务控制块链表 62 63 任务控制块及任务控制块链表任务控制块及任务控制块链表 n任务控制块链表其他相关系统管

49、理变量任务控制块链表其他相关系统管理变量 nOSTCBPrioTbl :OS_TCB* 数据类型的数组,数据类型的数组, 以以 Prio 为下标存放已使能的为下标存放已使能的 TCB 指针。用指针。用 于加速于加速 TCB 的访问。的访问。 nOSTCBCur:全局系统变量,指向当前正在:全局系统变量,指向当前正在 运行的任务的运行的任务的 TCB 。 OSTCBFreeList、OSTCBList OSTCBTbl - OSInit()建立的任务控制块数组建立的任务控制块数组 OSTCBPrioTbl - 任务控制块优先级数组任务控制块优先级数组 OSTCBCur 64 任务控制块链表 空任

50、务控制块链表 65 任务级的任务调度任务级的任务调度-OSSched-OSSched n C/OSC/OS是是占先式实时多任务内核占先式实时多任务内核,优先级最高的任务一,优先级最高的任务一 旦准备就绪,则拥有旦准备就绪,则拥有CPUCPU的所有权即开始投入运行。的所有权即开始投入运行。 n C/OSC/OS中中不支持时间片轮转法不支持时间片轮转法,每个任务的优先级要求,每个任务的优先级要求 不一样且是唯一的。因此,任务调度就是:查找准备不一样且是唯一的。因此,任务调度就是:查找准备 就绪的最高优先级的任务并进行上下文切换。就绪的最高优先级的任务并进行上下文切换。 n C/OSC/OS任务调度

51、所花的时间为常数任务调度所花的时间为常数,与应用程序中建立,与应用程序中建立 的任务数无关。的任务数无关。 66 就绪表就绪表 根据就绪表确定最高优先级根据就绪表确定最高优先级 两个关键: n优先级数分解为高三位和低三位分别确定 n高优先级有着小的优先级号着小的优先级号 67 根据优先级找到任务在就绪任务表中的位置根据优先级找到任务在就绪任务表中的位置 每个就绪的任务都放入就绪表中(每个就绪的任务都放入就绪表中(ready listready list)中,就绪表用两个变)中,就绪表用两个变 量表示:量表示:OSRdyGrpOSRdyGrp、OSRdyTblOSRdyTbl OSRdyGrpO

52、SRdyGrp 1207 6 5 4 3 00X XX XX XY YY Y Y Y 任务优先级 20 0176543 108915 14 13 1212 11 18161723 22 2121 20 19 26242531 30 29 28 27 34323339 38 37 36 35 42404147 46 45 44 43 50484955 54 53 52 51 5856576363 62 61 60 59 0 1 2 3 4 5 6 7 OSRdyTbl7OSRdyTbl7 X X Y 优先级最低任务优先级最低任务 (空闲任务) 优先级最高任务优先级最高任务 任务优先级号任务优先级

53、号 000 00 01 10 0 0 0 001 10 01 10 00 0 1 1 12 21 68 采用查表法确定高优先级任务采用查表法确定高优先级任务 查表法具有确定的时间,增加了系统的可预测性, C/OS II中所有 的系统调用时间都是确定的 High3 =OSUnMapTblOSRdyGrp; Low3 =OSUnMapTblOSRdyTblHigh3; Prio =(High33)+Low3; OSRdyGrp 1207 6 5 4 3 00XXXYY Y 任务优先级 20176543 108915 14 13 12 11 18161723 22 21 20 19 26242531

54、 30 29 28 27 34323339 38 37 36 35 42404147 46 45 44 43 50484955 54 53 52 51 58565763 62 61 60 59 0 1 2 3 4 5 6 7 OSRdyTbl7 X Y 69 Task scheduler void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); (禁止中断的宏(禁止中断的宏) ) if (OSLockNesting =0) (否则,调度找出进 入就绪态且优先级最高的任务,就绪任务表相应的位置位) OSPrioHighRdy = (INT8U)(y 3)

55、 + OSUnMapTblOSRdyTbly) if (OSPrioHighRdy != OSPrioCur) (优先级最高的任务是否是 当前正在运行的任务,若是不调度) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;(若不是, 为了实现任务切换,指向优先级最高的任务控制块) OSCtxSwCtr+; (统计计数,跟踪任务切换次数) OS_TASK_SW(); (任务切换) OS_EXIT_CRITICAL(); (开放中断的宏(开放中断的宏) ) 70 void OSSchedLock (void) if (OSRunning = TRUE) OS_ENT

56、ER_CRITICAL(); if(OSLockNesting 0) OSLockNesting-; if (OSLockNesting=0) OSSched(); else OS_EXIT_CRITICAL(); else OS_EXIT_CRITICAL(); 72 任务切换任务切换 n将被挂起的任务寄存器入栈 n将较高优先级任务的寄存器出栈 73 任务级的任务切换任务级的任务切换OS_TASK_SW()OS_TASK_SW() nOS_TASK_SW()是宏调用,含有微处理器 的软中断指令。因为,系统假定任务切 换是靠中断级代码完成的。 nOS_TASK_SW()将处理器相关的软件中断

57、机制封装起来,便于操作系统移植 74 调用调用OS_TASK_SW()OS_TASK_SW()前的数据结构前的数据结构 低优先级任务 OS_TCB OSTCBCur (1) 存贮器低地址 存贮器高地址 堆栈方向堆栈方向 SP R1 R2 R3 R4 PC PSW 存贮器低地址 存贮器高地址 高优先级任务(切换(切换 后运行的任务)后运行的任务) OS_TCB OSTCBHighRdy (3) (2) CPU (4) (5) PSW PC R1 R2 R3 R4 即将被挂起任务的栈顶 (即将被挂起任务)(即将被挂起任务) 指向即将 运行的任 务的栈顶 75 保存当前保存当前CPUCPU寄存器的值

58、寄存器的值 低优先级任务 OS_TCB OSTCBCur PSW PC R1 R2 R3 R4 存贮器低地址 存贮器高地址 堆栈方向堆栈方向 SP R1 R2 R3 R4 PC PSW PSW PC R1 R2 R3 R4 存贮器低地址 存贮器高地址 高优先级任务 OS_TCB OSTCBHighRdy (2) CPU (1) (3) (3) 76 重新装入要运行的任务重新装入要运行的任务 低优先级任务 OS_TCB OSTCBCur PSW PC R1 R2 R3 R4 存贮器低地址 存贮器高地址 堆栈方向堆栈方向 SP R1 R2 R3 R4 PC PSW PSW PC R1 R2 R3

59、R4 存贮器低地址 存贮器高地址 高优先级任务 OS_TCB OSTCBHighRdy OSTCBCur (1) (2) CPU (4) (4) (1) (3) (3) (4) 复制 77 任务切换任务切换OS_TASK_SW()OS_TASK_SW()的代码的代码 Void OSCtxSw(voidVoid OSCtxSw(void) ) 将将R1,R2,R3R1,R2,R3及及R4R4推入当前堆栈;推入当前堆栈; OSTCBCurOSTCBCurOSTCBStkPtrOSTCBStkPtr = SP; = SP; OSTCBCur = OSTCBHighRdy OSTCBCur = OST

60、CBHighRdy; ; SP = OSTCBHighRdy SP = OSTCBHighRdy OSTCBSTKPtrOSTCBSTKPtr; ; 将将R4,R3,R2R4,R3,R2及及R1R1从新堆栈中弹出;从新堆栈中弹出; 执行中断返回指令;执行中断返回指令; 78 C/OSC/OS-II-II中的中断中的中断 l中断:中断:由于某种事件的发生,而导致程序流程的改变。产生中断的由于某种事件的发生,而导致程序流程的改变。产生中断的 事件称为中断源。事件称为中断源。 lCPU响应中断的条件:响应中断的条件: n至少有一个中断源向至少有一个中断源向CPU发出中断信号;发出中断信号; n系统允

温馨提示

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

评论

0/150

提交评论