嵌入式实时操作系统μCOS原理与实践2.ppt_第1页
嵌入式实时操作系统μCOS原理与实践2.ppt_第2页
嵌入式实时操作系统μCOS原理与实践2.ppt_第3页
嵌入式实时操作系统μCOS原理与实践2.ppt_第4页
嵌入式实时操作系统μCOS原理与实践2.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、嵌入式实时操作系统C/OS原理与实践,电子科技大学 卢有亮,新浪交流微群:,说明,书籍2012年2月在电子工业出版社面世来受到欢迎,除不能免费的书之外本人提供了 1.教学PPT 2.15个学时实验教学PPT 3.示例代码(含UCOSV2.91全部源码,用于实验和源码学习,可在VC下单步运行,直观方便) 4.29个视频 5.交流微群(人数无限制) 这些全部免费,最新的以上内容下载地址不清楚可以到本人博客留言!代码的下载地址也在博客提供(因为经常会更新会变化)! 配套代码请查看本人博客(另外微博昵称_90): 在网上观看视频(土豆、优酷) ,新浪交流微群:,第二章 任务管理,2.1 任务管理数据结

2、构 2.2 任务控制块初始化 2.3 操作系统初始化 2.4 任务的创建 2.5 任务的删除 2.6 任务挂起和恢复 2.7 任务的调度和多任务的启动 2.8 特殊任务,新浪交流微群:,2.1任务管理数据结构,任务管理的数据结构包括任务控制块,任务空闲链表和任务就绪链表,任务优先级指针表,任务堆栈等,是C/OS-II内核的核心部分之一。,2.1.1任务控制块,任务控制块是任务管理的核心数据结构,操作系统在启动的时候,首先要在内存中创建一定是数量的任务控制块。任务控制块的最大数量等于操作系统能同时管理的最多任务数 。 C/OS将任务控制块划分为两个链表,就绪链表和空闲链表。 表2.1,任务控制块

3、的源代码 ,定义结构OS_TCB,OS_TCB,新浪交流微群:,2.1任务管理数据结构,2.1.1任务控制块,任务控制块实体的声明如下: OS_TCB OSTCBTblOS_MAX_TASKS + OS_N_SYS_TASKS 该代码在usos_ii.H中,OS_MAX_TASKS为最多的用户任务数,OS_N_SYS_TASKS为系统任务数,一般情况下为2。,新浪交流微群:,2.1.2空闲链表和就绪链表,C/OS-II将任务控制块分成两个链表来管理,这就是空闲任务链表和就绪任务链表。其中,空闲任务链表包含了所有空闲的任务控制块。所谓空闲任务控制块,是指未分配给某个任务的任务控制块。创建一个新任

4、务,前提条件就是系统里还有这样的空闲任务块。就绪链表则是将所有的就绪任务拴在一起,如果有新的任务就绪,就要将其任务控制块从空闲链表中取出,加入到就绪链表中。,新浪交流微群:,2.1.3任务表,C/OS-II将任务控制块分成两个链表来管理,这就是空闲任务链表和就绪任务链表。其中,空闲任务链表包含了所有空闲的任务控制块。所谓空闲任务控制块,是指未分配给某个任务的任务控制块。创建一个新任务,前提条件就是系统里还有这样的空闲任务块。就绪链表则是将所有的就绪任务拴在一起,如果有新的任务就绪,就要将其任务控制块从空闲链表中取出,加入到就绪链表中。,新浪交流微群:,2.1.3任务优先级指针表,任务优先级指针

5、表也就是任务优先级指针数组,在C/OS-II任务管理中频繁使用,代码中随处可见。它是用来获取某优先级的任务的任务控制块地址。它的定义为: OS_TCB *OSTCBPrioTblOS_LOWEST_PRIO + 1 OS_LOWEST_PRIO为最低优先级的任务的优先级,因为低优先级的任务数值最大,而任务优先级是从0开始的,所以其实OS_LOWEST_PRIO + 1就是任务的数量。 数组OSTCBPrioTbl就具有最多任务数个元素,它的类型是指向任务控制块的指针,新浪交流微群:,2.1.4 任务堆栈,所谓堆栈,就是在存储器中按数据“后进先出LIFO(Last In First Out)”的

6、原则组织的连续存储空间。因此,堆栈这种数据结构最大的特点就是最后进去的最先出来。 任务堆栈的定义: #define TASK_STK_SIZE 512 typedef unsigned int OS_STK; OS_STK TaskStkOS_MAX_TASKSTASK_STK_SIZE; TASK_STK_SIZE是每个任务堆栈的大小,这里设置为512,根据具体的情况做移植时,可修改这个值。OS_MAX_TASKS是用户任务的数量。,新浪交流微群:,2.1.4 任务堆栈 任务堆栈演示,如果堆栈是向下增长,也就是从高地址向低地址增长,那么在任务刚开始创建后,堆栈是空的。如图中例子,栈顶在为Ta

7、skStk0511,栈底为在TaskStk00。相反,如果堆栈是向下增长的,栈顶在为TaskStk00,栈底为在TaskStk0511。 那么,如果我们向堆栈中压入数据,例如推入0 x0012ff78后,堆栈变化为图2.6。,如图2.6,压栈后,若堆栈向下增长,在原来栈顶位置插入数据0 x0012ff78,然后栈顶位置向低地址方向移4个字节,指向TaskStk0510。若堆栈向上增长,在原来栈顶位置压如0 x0012ff78,栈顶变为TaskStk01。,新浪交流微群:,2.1.5任务就绪表和就绪组,内核在进行任务调度的时候,必须知道哪个任务在运行,哪个任务是就绪的最高优先级的任务。实时任务调

8、度的关键在于速度,要求无论系统的运行情况如何,调度的时间是确定的,不能把时间都用在调度上。因此就需要设计高效的多任务调度方法。查找高优先级的任务,与正在运行任务的优先级进行比较以确定是否进行任务切换是内核在每个时钟中断都需要做的事情。为满足这样的需要,C/OS-II的开发者采用了就绪表和就绪组这样的数据结构,围绕他们又定义了两张查找表。,新浪交流微群:,2.1.5 任务就绪表和就绪组-设置任务就绪,新浪交流微群:,2.1.5 任务就绪表和就绪组-获取就绪任务中的最高优先级,空间换时间!,新浪交流微群:,新浪交流微群:,2.2 任务控制块初始化,任务控制块的初始化是在创建任务的时候必须要执行的操

9、作,对任务控制块和一些相关的数据结果进行了处理。,参数 : prio 被创建的任务的优先级 ptos 任务堆栈栈顶的地址 pbos 任务堆栈栈底的地址,如果是用OSTaskCreate()来创建的任务,那么是没有扩展功能的,不能进行堆栈检查,就不主要适用这个参数,这个参数可以传递为NULL id 任务的ID,16位,取值范围是0到65535 stk_size 堆栈的大小 pext 任务控制块的扩展块的地址 opt 其他的选项 返回值 : OS_ERR_NONE 成功调用 OS_ERR_TASK_NO_MORE_TCB 如果没有空闲的任务控制块,新浪交流微群:,新浪交流微群:,2.3 操作系统初

10、始化P44-50,操作系统初始化函数OS_INIT是操作系统在开始运行的最初,对全局变量、任务控制块、就绪表、事件及消息队列等重要数据结构进行的初始化操作,并创建空闲任务、统计任务等系统任务。该函数必须在创建用户对象及调用OSStart()启动实时任务调度之前运行。 操作系统初始化函数见教材P45页程序2.12 OS_InitMisc实现对操作系统一些混杂的全局变量的初始化程序2.13 OS_InitRdyList对就绪表进行初始化的工作程序2.14 OS_InitTCBList 控制块链表初始化程序2.15 OS_InitTaskIdle创建操作系统空闲任务程序2.16,新浪交流微群:,vo

11、latile 影响编译器编译的结果,volatile 变量是随时可能发生变化 的,与volatile变量有关的运算,不要进行编译优化,以免出错, (VC+ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化) 例如: volatile int i=10; int j = i; . .int k = i volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上

12、次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。,新浪交流微群:,创建一个任务,任务从无到有。任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCreateExt。 2.4.1任务创建代码解析 程序2.17 创建任务OS_TaskCreat。 P51 程序2.18 堆栈初始化函数OSTaskStkInit的一个版本。P52 2.4.2任务OS_TaskCreat流程分析 图2.14 OS_TaskCreat的流程 P5

13、5 2.4.3任务OS_TaskCreatExt流程分析 程序2.21 创建任务OS_TaskCreatExt。 P57 2.4.4任务OS_TaskCreatExt流程分析 图2.15 OS_TaskCreatExt的流程P59,2.4 任务的创建,新浪交流微群:,1.被调用的位置和方法 int main(int argc, char *argv) VCInit();/编译环境的初始化 OSInit(); OSTaskCreate(TaskStart, 0, 2.程序分析: 创建任务OS_TaskCreat。 P51 3.程序分析:堆栈初始化函数OSTaskStkInit的一个版本。P52,

14、2.4.1 OSTastCreate代码解析,新浪交流微群:,任务创建中堆栈初始化的结果,新浪交流微群:,OSTaskCreateExt,新浪交流微群:,例程的运行,1.编译查看运行的结果 2.请同学说明为什么产生这样的结果?,新浪交流微群:,任务OS_TaskCreatExt,2.4.3任务OS_TaskCreatExt代码分析 程序2.19 OS_TaskCreatExt的声明 P56 程序2.20 为OS_TASK_OPT定义的4个宏 P56 程序2.21 创建任务OS_TaskCreatExt。 P57 程序2.22 堆栈清空函数OS_TaskStkClr。 P58 2.4.4任务OS

15、_TaskCreatExt流程分析 图2.15 OS_TaskCreatExt的流程P59,新浪交流微群:,关于OPT,#define OS_POST_OPT_NONE 0 x00u /* NO option selected */ #define OS_TASK_OPT_STK_CHK 0 x0001u /* Enable stack checking for the task */ #define OS_TASK_OPT_STK_CLR 0 x0002u /* Clear the stack when the task is create */ #define OS_TASK_OPT_SA

16、VE_FP 0 x0004u Opt=0 x0003u *0011,新浪交流微群:,新浪交流微群:,2.4 任务的删除,删除任务是创建任务的逆过程, 任务创建设置就绪表,就绪组,任务删除则取消设置; 任务创建将任务控制块从空闲链表移到就绪链表;删除操作则相反。,新浪交流微群:,2.4 任务的删除,新浪交流微群:,2.4 任务的删除-请求删除,当以其他任务的优先级作为参数的时候,OsTaskDel粗暴地删除了任务,这在某些情况下是有效的,但是却不是必须这么做。通知对方任务,告诉它要删除你了,请任务自己删除自己是一种更好的做法。因为这么做,任务可以在删除自己之前先放弃自己使用的资源,如缓冲区、信号

17、量、邮箱、队列等。如果总是用OsTaskDel删除一个任务,这个任务占用的资源不能得到释放,系统就会产生内存泄漏,在内存泄漏累积到比较大的时候最后,系统就会因为没有可用的内存崩溃。 OsTaskDelReq名称虽然是请求,却是集请求和响应于一段代码的。该代码的功能是: 1.请求删除某任务 2.查看是否有任务要删除自己,新浪交流微群:,2.6 任务的挂起和恢复,OSTaskSuspend将任务阻塞,也就是被剥夺CPU的使用权而暂时终止运行,转到阻塞状态。通过OSTaskSuspend将任务转到阻塞态被称为挂起任务。 被挂起的任务不能运行,直到其他任务以该任务的优先级作为参数调用OSTaskRes

18、ume来恢复它,才能将该任务的状态重新设置为就绪状态。,新浪交流微群:,2.4 任务的挂起和恢复流程,新浪交流微群:,2.7 任务的调度和多任务的启动,C/OS-II操作系统是实时操作系统,而且是基于优先级调度的实时操作系统, 因此在启动多任务以后,每个时钟中断,都要执行任务的调度。至于如何实现时钟中断,对不同的硬件环境是不同的。 如果时间片是20毫秒,那么在每20毫秒,执行一次任务调度。这个任务调度的函数就是OSTimeTick。OSTimeTick是与硬件无关. 程序2.27给出OSTimeTick的基本代码解析。 P74-75,2.7.1任务调度器,新浪交流微群:,任务切换函数OS_Sc

19、hed执行这样的操作系统服务功能: 如果正在运行的任务不是优先级最高的或将被阻塞,需选择一个优先级最高的就绪的任务运行。该过程中非常重要的一点是,要保留正在运行任务运行的上下文,也就是运行环境,如CPU寄存器的值,以便在任务重新开始运行之前能恢复CPU寄存器的值。当然还要将将要运行的任务的上下文恢复到CPU寄存器。 1 OS_Sched和OS_SchedNew分析 程序2.30是OS_Sched代码解析 P74 操作系的任务切换函数,调用OS_SchedNew、 OS_TASK_SW 程序2.29是OS_SchedNew代码解析 P74 这个函数被其他C/OS-II系统服务调用,用来确定最高优

20、先级的就绪任务。该函数运行 结果就是给全局变量OSPrioHighRdy赋值。显然,OSPrioHighRdy是最高优先级任务的 优先级。,2.7.2任务切换函数,新浪交流微群:,2. 程序2.31是OS_TASK_SW代码解析 P78-79 汇编语言编程,真正的压栈退栈,新浪交流微群:,2.8 特殊任务,空闲任务是C/OS-II 的系统任务,因为它占据了最低优先级63,所以只有在其他的任务都因为等待事件的发生而被阻塞的时候才能得到运行 从空闲任务的代码可见,空闲任务除了不停地将空闲计数器OSIdleCtr的值加1之外,几乎什么都没有做。当没有任何其他任务能够运行的时候,操作系统就会执行这段代码。而OSTaskIdleHook默认的情况下也只是一个空函数,没有特殊需要我们也不需要去填写它,该函数的另一作用就是占据一点时间,给系统足够的时间响应中断。接下来我们来研究一下比空闲任务优先级仅仅高于空闲任务的另一重要系统任务,统计任务。 表2.38 空闲任务OS_TaskIdle代码分析,2.8.1空闲任务,新浪交流微群:,2.8 特殊任务,统计任务OS_TaskStat是C/OS-II的

温馨提示

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

评论

0/150

提交评论