嵌入式实时操作系统μCOS原理与实践(1).ppt

上传人:赵** 文档编号:65361249 上传时间:2022-12-05 格式:PPT 页数:27 大小:1.12MB
返回 下载 相关 举报
嵌入式实时操作系统μCOS原理与实践(1).ppt_第1页
第1页 / 共27页
嵌入式实时操作系统μCOS原理与实践(1).ppt_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《嵌入式实时操作系统μCOS原理与实践(1).ppt》由会员分享,可在线阅读,更多相关《嵌入式实时操作系统μCOS原理与实践(1).ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 2012.03.03 卢有亮嵌入式实时操作系统嵌入式实时操作系统C/OSC/OS原理与实践原理与实践教材教材:嵌入式实时操作系统:嵌入式实时操作系统C/OS原理与实践原理与实践电子工业出版社电子工业出版社 作者作者:卢有亮卢有亮 电子科技大学能源科学与工程学院电子科技大学能源科学与工程学院作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践第二章第二章 任务管理任务管理2.1 任务

2、管理数据结构2.2 任务控制块初始化2.3 操作系统初始化2.4 任务的创建2.5 任务的删除2.6 任务挂起和恢复2.7 任务的调度和多任务的启动2.8 特殊任务作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.12.1任务管理数据结构任务管理数据结构任务管理的数据结构包括任务控制块,任务空闲链表和任务就绪链表,任任务管理的数据结构包括任务控制块,任务空闲链表和任务就绪链表,任务优先级指针表,任务堆栈等,是务优先级指针表,任务堆栈等,是C/OS-II内核的核心部分之一。内核的核心部分之一。2.1.1任务控

3、制块任务控制块 任务控制块是任务管理的核心数据结构,操作系统在启动的时候,首先要任务控制块是任务管理的核心数据结构,操作系统在启动的时候,首先要在内存中创建一定是数量的任务控制块。任务控制块的最大数量等于操作在内存中创建一定是数量的任务控制块。任务控制块的最大数量等于操作系统能同时管理的最多任务数系统能同时管理的最多任务数。C/OS将任务控制块划分为两个链表,就绪链表和空闲链表。将任务控制块划分为两个链表,就绪链表和空闲链表。表表2.1,任务控制块的源代码,任务控制块的源代码,定义结构,定义结构OS_TCBOS_TCB作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/

4、 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.12.1任务管理数据结构任务管理数据结构2.1.1任务控制块任务控制块 任务控制块任务控制块实体实体的声明如下:的声明如下:OS_TCB OSTCBTblOS_MAX_TASKS+OS_N_SYS_TASKS该代码在该代码在usos_ii.H中中,OS_MAX_TASKS为最多的用户任务数为最多的用户任务数,OS_N_SYS_TASKS为系统任务数为系统任务数,一般情况下为一般情况下为2。作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.1.2空

5、闲链表和就绪链表空闲链表和就绪链表 C/OS-II将任务控制块分成两个链表来管理,这就是空闲任务链表和就绪任务链表。其中,空闲任务链表包含了所有空闲的任务控制块。所谓空闲任务控制块,是指未分配给某个任务的任务控制块。创建一个新任务,前提条件就是系统里还有这样的空闲任务块。就绪链表则是将所有的就绪任务拴在一起,如果有新的任务就绪,就要将其任务控制块从空闲链表中取出,加入到就绪链表中。作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.1.3任务表任务表 C/OS-II将任务控制块分成两个链表来管理,这就是空闲任

6、务链表和就绪任务链表。其中,空闲任务链表包含了所有空闲的任务控制块。所谓空闲任务控制块,是指未分配给某个任务的任务控制块。创建一个新任务,前提条件就是系统里还有这样的空闲任务块。就绪链表则是将所有的就绪任务拴在一起,如果有新的任务就绪,就要将其任务控制块从空闲链表中取出,加入到就绪链表中。作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.1.3任务优先级指针表任务优先级指针表任务优先级指针表也就是任务优先级指针数组,在C/OS-II任务管理中频繁使用,代码中随处可见。它是用来获取某优先级的任务的任务控制块地

7、址。它的定义为:OS_TCB *OSTCBPrioTblOS_LOWEST_PRIO+1OS_LOWEST_PRIO为最低优先级的任务的优先级,因为低优先级的任务数值最为最低优先级的任务的优先级,因为低优先级的任务数值最大,而任务优先级是从大,而任务优先级是从0开始的,所以其实开始的,所以其实OS_LOWEST_PRIO+1就是任务的数就是任务的数量。量。数组数组OSTCBPrioTbl就具有最多任务数个元素,它的类型是指向任务控制块的指针就具有最多任务数个元素,它的类型是指向任务控制块的指针 作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计

8、与实践嵌入式实时操作系统设计与实践2.1.4 任务堆栈任务堆栈所谓堆栈,就是在存储器中按数据“后进先出LIFO(Last In First Out)”的原则组织的连续存储空间。因此,堆栈这种数据结构最大的特点就是最后进去的最先出来。任务堆栈的定义:任务堆栈的定义:#define TASK_STK_SIZE 512 typedef unsigned int OS_STK;OS_STK TaskStkOS_MAX_TASKSTASK_STK_SIZE;TASK_STK_SIZE是每个任务堆栈的大小,这里设置为512,根据具体的情况做移植时,可修改这个值。OS_MAX_TASKS是用户任务的数量。作

9、者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.1.4 任务堆栈任务堆栈任务堆栈演示任务堆栈演示如果堆栈是向下增长,也就是从高地址向低地址增长,那么在任务刚开始创建后,堆栈是空的。如图中例子,栈顶在为TaskStk0511,栈底为在TaskStk00。相反,如果堆栈是向下增长的,栈顶在为TaskStk00,栈底为在TaskStk0511。那么,如果我们向堆栈中压入数据,例如推入0 x0012ff78后,堆栈变化为图2.6。如图2.6,压栈后,若堆栈向下增长,在原来栈顶位置插入数据0 x0012ff78,然后

10、栈顶位置向低地址方向移4个字节,指向TaskStk0510。若堆栈向上增长,在原来栈顶位置压如0 x0012ff78,栈顶变为TaskStk01。作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.1.5任务就绪表和就绪组任务就绪表和就绪组内核在进行任务调度的时候,必须知道哪个任务在运行,哪个任务是就绪的最高优先级的任务。实时任务调度的关键在于速度,要求无论系统的运行情况如何,调度的时间是确定的,不能把时间都用在调度上。因此就需要设计高效的多任务调度方法。查找高优先级的任务,与正在运行任务的优先级进行比较以确

11、定是否进行任务切换是内核在每个时钟中断都需要做的事情。为满足这样的需要,C/OS-II的开发者采用了就绪表和就绪组这样的数据结构,围绕他们又定义了两张查找表。作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.1.5 任务就绪表和就绪组任务就绪表和就绪组-设置任务就绪设置任务就绪作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.1.5 任务就绪表和就绪组任务就绪表和就绪组-获取就绪任务中的最高优先级获取就绪任务中的最高优先

12、级 空间换时间!作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.2 任务控制块初始化任务控制块初始化 任务控制块的初始化是在创建任务的时候必须要执行的操作,对任务控制块的初始化是在创建任务的时候必须要执行的操作,对任务控制块和一些相关的数据结果进行了处理。任务控制块和一些相关的数据结果进行了处理。参数参数 :prio 被创建的任务的优先级被创建的任务的优先级 ptos 任务

13、堆栈栈顶的地址任务堆栈栈顶的地址 pbos 任务堆栈栈底的地址,如果是用任务堆栈栈底的地址,如果是用OSTaskCreate()来创建来创建的任务,那么是没有扩展功能的,不能进行堆栈检查,就不主要适用这的任务,那么是没有扩展功能的,不能进行堆栈检查,就不主要适用这个参数,这个参数可以传递为个参数,这个参数可以传递为NULL id 任务的任务的ID,16位,取值范围是位,取值范围是0到到65535stk_size 堆栈的大小堆栈的大小pext 任务控制块的扩展块的地址任务控制块的扩展块的地址 opt 其他的选项其他的选项返回值返回值:OS_ERR_NONE 成功调用成功调用OS_ERR_TASK

14、_NO_MORE_TCB 如果没有空闲的任务控制块如果没有空闲的任务控制块作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.3 操作系统初始化操作系统初始化 操作系统初始化函数操作系统初始化函数OS_INIT是操作系统在开始运行的最初,对是操作系统在开始运行的最初,对全局变量、任务控制块、就绪表、事件及消息队列等重要数据结全局变量、任务控制块、就绪表、事件及消息队列等重要数据

15、结构进行的初始化操作,并创建空闲任务、统计任务等系统任务。构进行的初始化操作,并创建空闲任务、统计任务等系统任务。该函数必须在创建用户对象及调用该函数必须在创建用户对象及调用OSStart()启动实时任务调度启动实时任务调度之前运行。之前运行。操作系统初始化函数见表操作系统初始化函数见表2.15OS_InitMisc实现对操作系统一些混杂的全局变量的初始化 OS_InitRdyList对就绪表进行初始化的工作 OS_InitTCBList 控制块链表初始化OS_InitTaskIdle创建操作系统空闲任务作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操

16、作系统设计与实践嵌入式实时操作系统设计与实践创建一个任务,任务从无到有。任务创建函数分两种,创建一个任务,任务从无到有。任务创建函数分两种,一种是基本的创建函数一种是基本的创建函数OSTaskCreate,另一种是扩展的任务创建函数另一种是扩展的任务创建函数OSTaskCreateExt。着重讲解着重讲解OSTaskCreate。表表2.20 创建任务创建任务OS_TaskCreat。表表2.21 堆栈初始化函数堆栈初始化函数OSTaskStkInit的一个版本的一个版本 2.4 任务的创建任务的创建 作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作

17、系统设计与实践嵌入式实时操作系统设计与实践2.4 任务的删除任务的删除 删除任务是创建任务的逆过程,删除任务是创建任务的逆过程,任务创建设置就绪表,就绪组,任务删除则取消设置;任务创建设置就绪表,就绪组,任务删除则取消设置;任务创建将任务控制块从空闲链表移到就绪链表;删除操任务创建将任务控制块从空闲链表移到就绪链表;删除操作则相反。作则相反。作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.4 任务的删除任务的删除 作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作

18、系统设计与实践嵌入式实时操作系统设计与实践2.4 任务的删除任务的删除-请求删除请求删除 当以其他任务的优先级作为参数的时候,当以其他任务的优先级作为参数的时候,OsTaskDel粗暴地删除粗暴地删除了任务,这在某些情况下是有效的,但是却不是必须这么做。通了任务,这在某些情况下是有效的,但是却不是必须这么做。通知对方任务,告诉它要删除你了,请任务自己删除自己是一种更知对方任务,告诉它要删除你了,请任务自己删除自己是一种更好的做法。因为这么做,任务可以在删除自己之前先放弃自己使好的做法。因为这么做,任务可以在删除自己之前先放弃自己使用的资源,如缓冲区、信号量、邮箱、队列等。如果总是用用的资源,如

19、缓冲区、信号量、邮箱、队列等。如果总是用OsTaskDel删除一个任务,这个任务占用的资源不能得到释放,删除一个任务,这个任务占用的资源不能得到释放,系统就会产生内存泄漏,在内存泄漏累积到比较大的时候最后,系统就会产生内存泄漏,在内存泄漏累积到比较大的时候最后,系统就会因为没有可用的内存崩溃。系统就会因为没有可用的内存崩溃。OsTaskDelReq名称虽然是请求,却是集请求和响应于一段代名称虽然是请求,却是集请求和响应于一段代码的。该代码的功能是:码的。该代码的功能是:1.请求删除某任务请求删除某任务2.查看是否有任务要删除自己查看是否有任务要删除自己作者卢有亮作者卢有亮 图书图书PPT和全部

20、代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.4 任务的挂起和恢复任务的挂起和恢复 OSTaskSuspend将任务阻塞,也就是被剥夺将任务阻塞,也就是被剥夺CPU的使用权而暂的使用权而暂时终止运行,转到阻塞状态。通过时终止运行,转到阻塞状态。通过OSTaskSuspend将任务转到将任务转到阻塞态被称为挂起任务。阻塞态被称为挂起任务。被挂起的任务不能运行,直到其他任务以该任务的优先级作为参被挂起的任务不能运行,直到其他任务以该任务的优先级作为参数调用数调用OSTaskResume来恢复它,才能将该任务的状态重新设置来恢复它,才能将该任务的状态

21、重新设置为就绪状态。为就绪状态。作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.4 任务的挂起和恢复任务的挂起和恢复流程流程 作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.7 任务的调度和多任务的启动任务的调度和多任务的启动C/OS-II操作系统是实时操作系统,而且是基于优先级调度的实时操作系统,操作系统是实时操作系统,而且是基于优先级调度的实时操作系统,因此在启动多任务以后,每个时钟中断,都要执行任务的调度。至于

22、如何实现时因此在启动多任务以后,每个时钟中断,都要执行任务的调度。至于如何实现时钟中断,对不同的硬件环境是不同的。钟中断,对不同的硬件环境是不同的。如果时间片是如果时间片是20毫秒,那么在每毫秒,那么在每20毫秒,执行一次任务调度。这个任务调度的函毫秒,执行一次任务调度。这个任务调度的函数就是数就是OSTimeTick。OSTimeTick是与硬件无关是与硬件无关.表表2.30给出给出OSTimeTick的基本代码解析。的基本代码解析。2.7.1任务调度器任务调度器 作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计

23、与实践就绪的任务进入获得就绪的任务进入获得CPU才能运行。任务切换函数就是执行这样的操作系统服务才能运行。任务切换函数就是执行这样的操作系统服务功能:如果正在运行的任务不是优先级最高的或即将被阻塞,需选择一个优先级功能:如果正在运行的任务不是优先级最高的或即将被阻塞,需选择一个优先级最高的就绪的任务运行。该过程中非常重要的一点是,要保留正在运行任务运行最高的就绪的任务运行。该过程中非常重要的一点是,要保留正在运行任务运行的上下文,也就是运行环境,如的上下文,也就是运行环境,如CPU寄存器的值,以便在任务重新开始运行之前寄存器的值,以便在任务重新开始运行之前能恢复能恢复CPU寄存器的值。当然还要

24、将将要运行的任务的上下文恢复到寄存器的值。当然还要将将要运行的任务的上下文恢复到CPU寄存器。寄存器。OS_SchedNew这个函数被其他这个函数被其他C/OS-II系统服务调用,用来确定最高优先级的系统服务调用,用来确定最高优先级的就绪任务。该函数运行的结果就是给全局变量就绪任务。该函数运行的结果就是给全局变量OSPrioHighRdy赋值。显然,赋值。显然,OSPrioHighRdy是最高优先级任务的优先级。是最高优先级任务的优先级。表表2.31 OS_SchedNew代码分析代码分析 OS_Sched的分析的分析 表表2.32 OS_Sched代码分析代码分析2.OS_TASK_SW的分

25、析的分析 2.7.1任务切换函数任务切换函数 作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.OS_TASK_SW的分析 (1)80 x86CPU 2.OS_TASK_SW的分析 (2)表2.33 OS_TASK_SW代码分析 2.OS_TASK_SW的分析 (3)举例 例如现在系统中运行了任务A和任务B。任务A的优先级是4,任务B的优先级为5。系统创建了任务A和任务B,创建之后,任务A由于优先级高而获得运行,假设任务A调用OsTaskSuspend挂起自己,这时候任务B就将被操作系统调度获得运行。这时候

26、首先要保存任务A的运行环境,首先将任务A恢复运行的时候继续运行的的地址nextstart推入堆栈,然后使用pushfd将标志寄存器,接着使用pushad将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI依次压入堆栈中。因为经过进栈的操作,所以堆栈的地址变了,所以将当前任务堆栈的地址重新写回任务控制块的第一项,如表2.1所示的任务堆栈指针OSTCBStkPtr。这样,将任务A的CPU的运行环境保存在自己的堆栈里了,并且将重新获得运行后将要运行的代码的地址nextstart也保存在堆栈里,栈顶的地址也保存在控制块中。我们设这时候nextstart的地址是AddressForContu

27、nue,图示压入堆栈的内容如图:之后,任务B的运行环境被恢复并获得运行。任务B调用OsTaskResume恢复任务A时,由于任务A的优先级高,将被调 度执行。操作系统将再一次执行表2.33的代码。作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践2.8 特殊任务特殊任务统计任务统计任务OS_TaskStat是是C/OS-II的另一个重要的系统任务,我们可以通过宏设的另一个重要的系统任务,我们可以通过宏设置取消统计任务,但一般情况下我们不会这么做,因为统计任务执行的统计工作置取消统计任务,但一般情况下我们不会这么

28、做,因为统计任务执行的统计工作是比较重要的。统计任务的主要功能就是计算是比较重要的。统计任务的主要功能就是计算CPU的利用率。如果没有统计任务,的利用率。如果没有统计任务,我们就不可知道多任务环境下系统的运行情况是否良好。我们就不可知道多任务环境下系统的运行情况是否良好。1.表表2.39 统计任务统计任务OS_TaskStat涉及的全局变量涉及的全局变量2.表表2.40 统计任务初始化函数统计任务初始化函数OSStatInit3.表表2.41 统计任务统计任务OS_TaskStat代码分析代码分析2.8.2统计任务统计任务OS_TaskStatOSCPUUsage =100uL-OSIdleC

29、trRun/OSIdleCtrMax 2-1OSCPUUsage =100*(1-OSIdleCtrRun/OSIdleCtrMax)2-2 作者卢有亮作者卢有亮 图书图书PPT和全部代码下载和全部代码下载http:/ 嵌入式实时操作系统设计与实践嵌入式实时操作系统设计与实践习题习题1.任务控制块是一个什么样的数据结构?请用C语言定义一个任务控制块数组,并对其进行初始化。2.论述任务控制块初始化过程中构建任务控制块空闲链表的过程。3.就绪表和就绪组的用途是什么?论述他们之间的关系。4.编写代码实现将优先级为13,23,33的任务就绪,然后取消优先级为25的任务的就绪标志。5.使用C语言创建一个任务堆栈,将这个堆栈赋值给一个任务控制块。6.论述任务堆栈的增长方向对入栈出栈操作的影响。7.解析任务调度的过程8.任务创建函数OSTaskCreate和OSTaskCreateEXT有哪些区别?9.任务是如何挂起和恢复的?10.为什么要请求删除任务而不直接删除?请求删除任务函数有哪些功能,流程是什么?11.论述统计任务是如何进行CPU利用率统计的。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁