1 / 119

第六章 嵌入式操作系统 --- C/OS-Ⅱ

第六章 嵌入式操作系统 --- C/OS-Ⅱ. 一、操作系统 的分类. 一般分为三大类: 批处理操作系统  单头道和多道程序批处理系统 分时操作系统 实时操作系统 此外还有 网络操作系统 分布式操作系统 嵌入式操作系统. 批处理操作系统. 工作方式: 用户将作业交给系统操作员 系统操作员将许多用户的作业组成一批作业 之后输入到计算机中,在系统中形成一个自动转接的连续的作业流 启动操作系统 系统自动、依次执行每个作业 最后由操作员将作业结果交给用户. 分时操作系统. 工作方式 : 一台主机连接了若干个终端 每个终端有一个用户在使用

keon
Download Presentation

第六章 嵌入式操作系统 --- C/OS-Ⅱ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第六章 嵌入式操作系统---C/OS-Ⅱ

  2. 一、操作系统的分类 一般分为三大类: • 批处理操作系统  单头道和多道程序批处理系统 • 分时操作系统 • 实时操作系统 此外还有 • 网络操作系统 • 分布式操作系统 • 嵌入式操作系统

  3. 批处理操作系统 工作方式: • 用户将作业交给系统操作员 • 系统操作员将许多用户的作业组成一批作业 • 之后输入到计算机中,在系统中形成一个自动转接的连续的作业流 • 启动操作系统 • 系统自动、依次执行每个作业 • 最后由操作员将作业结果交给用户

  4. 分时操作系统 • 工作方式: • 一台主机连接了若干个终端 • 每个终端有一个用户在使用 • 交互式的向系统提出命令请求 • 系统接受每个用户的命令 • 采用时间片轮转方式处理服务请求 • 并通过交互方式在终端上向用户显示结果 • 用户根据上步结果发出下道命令

  5. 终端 主机

  6. 时间片: • 操作系统将CPU的时间划分成若干个片段,称为时间片 • 操作系统以时间片为单位,轮流为每个终端用户服务 • 每次服务一个时间片 • (其特点是利用人的错觉,使人感觉不到)

  7. 实时操作系统 主要追求目标: • 对外部请求在严格时间范围内作出反应 • 高可靠性 • 安全性 • 完整性 实时系统必须和先进的技术装备相结合

  8. 通用操作系统 同时提供分时系统、批处理系统、实时操作系统三种或其中的二种,称通用操作系统 原则:分时优先,批处理在后 “前台”:需频繁交互的作业 “后台”:时间性要求不强的作业

  9. 网络操作系统 • 它是基于计算机网络的, • 是在各种计算机操作系统上, • 按网络体系结构协议标准开发的软件, • 包括网络管理,通信,安全,资源共享 • 和各种网络应用。 • 目标:是相互通信及资源共享

  10. 分布式操作系统 特征: 1.是一个统一的操作系统 2.资源进一步共享 3.透明性: 资源共享,分布。用户并不知道,对用户来讲是透明的 4.自治性: 处于分布式系统的多个主机处于平等地位,无主从关系 5.处理能力增强、速度更快、可靠性增强

  11. 嵌入式操作系统 • 什么是嵌入式系统? • 在各种设备、装置或系统中,完成特定功能的软硬件系统 • 它们是一个大设备、装置或系统中的一部分,这个大设备、装置或系统可以不是“计算机” • 通常工作在反应式或对处理时间有较严格要求环境中 • 由于它们被嵌入在各种设备、装置或系统中,因此称为嵌入式系统

  12. 典型嵌入式操作系统的特性 • 完成某一项或有限项功能;不是通用型的 • 在性能和实时性方面有严格的限制 • 能源、成本和可靠性通常是影响设计的重要因素 • 占有资源少、易于连接 • 系统功能可针对需求进行裁剪、调整和生成 • 以便满足最终产品的设计要求

  13. 二、嵌入式实时操作系统C/OS • C/OS简介 • 内核结构 • 任务间通信 • C/OS的移植

  14. RTOS是32位的嵌入式CPU的软件基础 • RTOS内核 提供CPU的管理  硬件初时化,MMU,定时器,中断 • RTOS 内核提供任务,内存管理 • RTOS提供设备管理,文件和网络的支持 • RTOS提供C/C++,JAVA,图形模块等编程接口

  15. C/OS简介 1、C/OS——micro O S,微控制器操作系统 2、 C/OS简介 • 美国人Jean Labrosse 1992年完成 • 应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 • 1998年C/OS-II,目前的版本C/OS -II V2.61 • 2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中 • 网站www.ucos-II.com(www.micrium.com)

  16. C/OS的性能特点(一) • 公开源代码 • 可移植性(Portable) 绝大部分C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得C/OS-II便于移植到其他微处理器上。 C/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器 、数字信号处理器(DSP)上运行。 • 可固化(ROMable) C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(C编译、连接、下载和固化), C/OS-II可以嵌入到读者的产品中成为产品的一部分。 • 可裁剪(Scalable) 可以只使用C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个C/OS-II调用,而另一个产品则使用了几乎所有C/OS-II的功能,这样可以减少产品中的C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。

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

  18. µC/OS-II图书 • 描述了µC/OS-II内部的工作原理 • 随书的CD中包含了源代码 • 工业界最清晰的源代码 • 除英文版外,有中文和韩文版 English Chinese Korean ISBN 1-57820-103-9 美国CMP BOOK ISBN 7-81077-290-2 北京航空航天大学出版社 ISBN 89-951540-5-5

  19. µC/OS-II提供的系统服务 • 信号量 • 带互斥机制的信号量 • 减少优先级倒置的问题 • 事件标志 • 消息信箱 • 消息队列 • 内存管理 • 时钟管理 • 任务管理

  20. C/OS-II的文件结构

  21. C/OS-II的内核结构 • 内核结构 • 任务管理 • 时间管理 • 任务之间通信与同步 • C/OS的移植

  22. 嵌入式控制器硬件初始化 启动多任务调度 操作系统初始化 初始化用户界面、时钟 主任务 任务1 任务n LCD初始化 创建任务 用户程序 …… 装载字库 调用系统配置文件 消息处理 操作系统的启动和运行过程

  23. 任务task 典型的任务一个无限循环。 void mytask(void *pdata) { for (;;) { do something; waiting; do something; } } • C/OS–II 2.5版本支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小。 • 系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0。

  24. Task code Task code One or more calls from this list Argument is pointer to void – allows application to pass almost any kind of data Task Structure 等待一邮箱中的消息 等待一消息队列中的消息 等待一信号量 删除任务 挂起任务 任务延时函数 按时、分、秒延时函数

  25. Alternate Structure

  26. 删除任务 等待或挂起 OSTimeDly() OSSemPend() OSMboxPend() OSQPend() 收到消息 挂起时间到 等待消息 挂起 OSTimeTick() 创建任务 任务调度 中断 休眠 就绪 运行 中断服务 OSTaskCreate() 任务被占先 中断结束 删除任务 OSTaskDel() 删除任务 任务状态 休眠:任务驻留在程序空间,还没有交给uC/OS-II管理 就绪:任务建立后,进入就绪状态 等待或挂起:等待某一事件发生,或等待延时 删除任务

  27. 建立任务 Use one of two services • OS TaskCreate() • OSTaskCreateExt ()

  28. 分配给任务的优先级 任务代码指针 任务参数指针 分配任务堆栈的栈顶指针 check OSTaskCreate(Task1, (void *)0, &Stack1[STACKSIZE - 1], 2);

  29. As before

  30. 任务级的任务调度—OSSched • C/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。 • C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。 • C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。

  31. 任务优先级 0 0 Y Y Y X X X 优先级最高任务 X [0] 7 6 5 4 3 2 1 0 [1] 15 14 13 12 11 10 9 8 [2] 23 22 21 20 19 18 17 16 [3] 31 30 29 28 27 26 25 24 Y [4] 39 38 37 36 35 34 33 32 [5] 47 46 45 44 43 42 41 40 [6] 55 54 53 52 51 50 49 48 [7] 63 62 61 60 59 58 57 56 优先级最低任务 (空闲任务) 任务优先级号 任务就绪务表 1、任务就绪状态表 2、根据优先级确定就绪表 3、使任务进入就绪态 4、使任务脱离就绪态 5、根据就绪表确定最高优先级

  32. OSRdyGrp OSRdyTbl[7] 7 6 5 4 3 2 1 0 X [0] 7 6 5 4 3 2 1 0 [1] 15 14 13 12 11 10 9 8 [2] 23 22 21 20 19 18 17 16 [3] 31 30 29 28 27 26 25 24 Y [4] 39 38 37 36 35 34 33 32 [5] 47 46 45 44 43 42 41 40 [6] 55 54 53 52 51 50 49 48 [7] 63 62 61 60 59 58 57 56 任务优先级 0 0 Y Y Y X X X 任务就绪状态表 每个就绪的任务都放入就绪表中(ready list)中,就绪表有两个变量:OSRdyGrp、OSRdyTbl[] 优先级最高任务 优先级最低任务 (空闲任务) 任务优先级号

  33. 根据优先级确定就绪表(1) • 假设优先级为12的任务进入就绪状态,12=1 100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为: OSRdyGrp |=0x02; OSRdyTbl[1] |=0x10; • 而优先级为21的任务就绪21=10 101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为: OSRdyGrp |=0x04; OSRdyTbl[2] |=0x20;

  34. 根据优先级确定就绪表(2) • 从上面的计算我们可以得到:若OSRdyGrp及OSRdyBbl[]的第n位置1,则应该把OSRdyGrp及OSRdyBbl[]的值与2n 相或。uC/OS中,把2n的n=0-7的8个值先计算好存在数组OSMapTbl[7]中,也就是: OSMapTbl[0] =20=0x01(0000 0001) OSMapTbl[1] =21=0x02(0000 0010) …… OSMapTbl[7] =27=0x80(1000 0000)

  35. 使任务进入就绪态 • 如果prio是任务的优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是: OSRdyGrp |=OSMapTbl[prio>>3]; OSRdyTbl[prio>>3] |=OSMapTbl[prio & 0x07]; • 假设优先级为12——1 100b OSRdyGrp |=0x02; OSRdyTbl[1] |=0x10;

  36. 使任务脱离就绪态 • 将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。 If((OSRdyTbl[prio>>3]&=OSMapTbl[prio& 0x07])==0); OSRdyGrp&=OSMapTbl[prio>>3]; OSRdyTbl[prio>>3]=0;

  37. 根据就绪表确定最高优先级 两个关键: • 优先级数分解为高三位和低三位分别确定; • 高优先级有着小的优先级号 ;

  38. OSRdyGrp OSRdyTbl[7] 0 0 1 0 0 1 0 0 X [0] 7 6 5 4 3 2 1 0 [1] 15 14 13 12 11 10 9 8 [2] 0 0 0 1 0 0 1 0 [3] 31 30 29 28 27 26 25 24 Y [4] 39 38 37 36 35 34 33 32 [5] 47 46 45 44 43 42 41 40 [6] 55 54 53 52 51 50 49 48 [7] 63 62 61 60 59 58 57 56 任务最高优先级 0 0 0 1 0 0 0 1 根据就绪表确定最高优先级 • 通过OSRdyGrp值确定高3位,假设为OSRdyGrp=0x24=00100 100b, ---〉 对应OSRdyTbl[2] 和OSRdyTbl[5],高优先级为2 • 通过OSRdyTbl[2]的值来确定低3位, 假设为OSRdyTbl[2]=0x12=0001 0010b,---〉第1位和第4位,取高优先级为1,则最高优先级的任务为17

  39. OSRdyGrp OSRdyTbl[7] 7 6 5 4 3 2 1 0 X [0] 7 6 5 4 3 2 1 0 [1] 15 14 13 12 11 10 9 8 [2] 23 22 21 20 19 18 17 16 [3] 31 30 29 28 27 26 25 24 Y [4] 39 38 37 36 35 34 33 32 [5] 47 46 45 44 43 42 41 40 [6] 55 54 53 52 51 50 49 48 [7] 63 62 61 60 59 58 57 56 任务优先级 0 0 Y Y Y X X X 源代码中使用了查表法 查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的 High3 =OSUnMapTbl[OSRdyGrp]; Low3 =OSUnMapTbl[OSRdyTbl[High3]]; Prio =(High3<<3)+Low3;

  40. 优先级判定表OSUnMapTbl[256] 举例: 如OSRdyGrp的值为01101000B,即0X68,则查得OSUnMapTbl[OSRdyGrp]的值是3,它相应于OSRdyGrp中的第3位置1; 如OSRdyTbl[3]的值是11100100B,即0XE4,则查OSUnMapTbl[OSRdyTbl[3]]的值是2,则进入就绪态的最高任务优先级 Prio=3*8+2=26 INT8U const OSUnMapTbl[] = { 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 };

  41. 启动操作系统OSStart void OSStart (void) { INT8U y, x; if (OSRunning == FALSE) { 判断是否没有启动内核 y = OSUnMapTbl[OSRdyGrp]; x = OSUnMapTbl[OSRdyTbl[y]]; OSPrioHighRdy = (INT8U)((y << 3) + x); 找到优先级最高的准备就绪任务 OSPrioCur = OSPrioHighRdy; 当前运行任务优先级 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; 根据任务优先级找到任务 OSTCBCur = OSTCBHighRdy; OSStartHighRdy(); 让优先级最高的任务运行起来 } }

  42. 几个任务处理函数(宏) 1、OSStart (void)启动多任务 2、OS_TASK_SW()任务切换(P34) 中止当前正在运行的任务,去执行另一个任务的工作 3、OSSched (void)任务调度(P33) 按某种规则进行任务切换的工作 4、OSTaskCreate()任务创建(P37) OSTaskCreateExt()任务创建 5、OSTaskSuspend()任务的挂起(P46) 指停止这个任务的运行,使其处于等待状态 6、OSTaskResume()任务的恢复(P47) 从等待状态恢复到就绪状态

  43. 举 例 例1:P40(例2-6) 例2:P43(例2-7) 例3:P48(例2-8) 例4:P50(例2-9) 例5:P56(例2-10) 例6:P64(例2-11)

  44. 取 任务B 任务A 存储器 第四节 任务同步与间通信 例: 1、二任务执行的先后次序有要求 先执行A,后执行B

  45. 打印 打印 任务B 任务A 打印机 2、共享某一个资源 任务间的这种制约性的合作运行机制叫作任务间的同步 系统是依靠任务间的相互发送消息(通信)来保证同步的

  46. C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。 提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护 • OSSchedLock( )禁止调度保护任务级的共享资源。 • 提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。

  47. 事件控制块ECB 所有的通信信号都被看成是事件(event), 用一个称为事件控制块(ECB, Event Control Block)的数据结构来表征每一个具体事件,ECB的结构如下 程序4.5 ECB的结构如下 ----------------------------------------------------------------- typedef struct { INT8U OSEventType; /*事件类型:信号量、邮箱等*/ INT16U OSEventCnt; /*计数器(当事件是信号量时)*/ void *OSEventPtr; /*指向消息或消息队列的指针*/ INT8U OSEventGrp; /*等待任务组*/ INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /*等待任务列表*/ } OS_EVENT; 与TCB类似的结构,使用两个链表,空闲链表与使用链表

  48. OS_EVENT pevent .OSEventType .OSEventCnt 表示等待事件发生的任务 .OSEventPtr 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 .OSEventGrp 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24 39 38 37 36 35 34 33 32 47 46 45 44 43 42 41 40 .OSEventTbl[] 55 54 53 52 51 50 49 48 63 62 61 60 59 58 57 56 事件控制块(ECB)的数据结构 事件控制块可以是: 信号量 消息邮箱 消息队列

  49. 事件控制块ECB的操作 对事件控制器进行的操作包括 • 初始化一个事件控制块OS_EventWaitListInit(); • 使一个任务进入就绪态OS_EventTaskRdy(); • 使一个任务进入等待某事件的状态OS_EventTaskWait(); • 因为等待超时而使一个任务进入就绪态OS_EventTO()。

  50. 事件控制块的使用 任务 任务 信号 等待 超时结束 ECB 等待 信号 超时结束 任务 ISR

More Related