书签 分享 收藏 举报 版权申诉 / 24
上传文档赚钱

类型课件:原理1-任务管理-.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:3481451
  • 上传时间:2022-09-05
  • 格式:PPT
  • 页数:24
  • 大小:1.67MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《课件:原理1-任务管理-.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    课件 原理 任务 管理
    资源描述:

    1、C/OS-II中的任务管理 任务的状态及其转换正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态 系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,这时任务的状态叫做就绪状态。处于就绪状态的任务如果经调度器判断获得了CPU的使用权,则任务就进入运行状态 一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态 前面谈到,一个任务的任务控制块的主要作用就是保存该任务的虚拟处理器的堆栈指针寄存器SP。其实

    2、,随着任务管理工作的复杂性的提高,它还应该保存一些其他信息。任务控制块任务在系统中的身份证 由于系统存在着多个任务,于是系统如何来识别并管理一个任务就是一个需要解决的问题。识别一个任务的最直接的办法是为每一个任务起一个名称。由于C/OS-II中的任务都有一个惟一的优先级别,因此C/OS-II是用任务的优先级来作为任务的标识的。所以,任务控制块还要来保存该任务的优先级别。另外,前面也谈到,一个任务在不同的时刻还处于不同的状态,显然,记录了任务状态的数据也应该保存到任务控制块中。基于上述原因,系统必须为每个任务创建一个保存与该任务有关的相关信息的数据结构,这个数据结构就叫做该任务的任务控制块(TC

    3、B)。任务控制块结构的主要成员typedef struct os_tcb OS_STK OS_STK *OSTCBStkPtrOSTCBStkPtr;/指向任务堆栈栈顶的指针 INT8U INT8U OSTCBStatOSTCBStat;/任务的当前状态标志 INT8U INT8U OSTCBPrioOSTCBPrio;/任务的优先级别 OS_TCB;任务控制块是不是像我们人在一个国家中的身份证?(其实,系统中的所有资源都应该有身份证。)任务在内存中的结构 用户任务代码的用户任务代码的 一般结构一般结构 void MyTask(void*pdata)for(;)可以被中断的用户代码;可以被中断

    4、的用户代码;OS_ENTER_CRITICAL();/进入临界段(关中断)进入临界段(关中断)不可以被中断的用户代码;不可以被中断的用户代码;OS_EXIT_CRITICAL();/退出临界段(开中断)退出临界段(开中断)可以被中断的用户代码;可以被中断的用户代码;临界段临界段无限循无限循环环于是可以这样说,C/OS-II任务的代码结构是一个可以带有临界段的无限循环。系统提供的空闲任务 在多任务系统运行时,系统经常会在某个时间内无用户任务可运行而处于所谓的空闲状态,为了使CPU在没有用户任务可执行的时候有事可做,C/OS-II提供了一个叫做空闲任务OSTaskIdle()的系统任务 void

    5、OSTaskIdle(void*pdata)#if OS_CRITICAL_METHOD=3OS_CPU_SR cpu_sr;#endif pdata=pdata;/防止某些编译器报错for(;)OS_ENTER_CRITICAL();/关闭中断OSdleCtr+;/计数OS_EXIT_CRITICAL();/开放中断 空闲任务只是做了一个计数工作注意!空闲任务中没有调用任务延时函数C/OS-II规定,一个用户应用程序必须使用这个空闲任务,而且这个任务是不能用软件来删除的 系统提供的另一个任务 统计任务C/OS-II提供的另一个系统任务是统计任务OSTaskStat()。这个统计任务每秒计算一

    6、次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便应用程序通过访问它来了解CPU的利用率,所以这个系统任务OSTaskStat()叫做统计任务 任务的优先权 及优先级别 C/OS_II 把任务的优先权分为64个优先级别,每一个级别都用一个数字来表示。数字0表示任务的优先级别最高,数字越大则表示任务的优先级别越低 用户可以根据应用程序的需要,在文件OS_CFG.H中通过给表示最低优先级别的常数OS_LOWEST_PRIO赋值的方法,来说明应用程序中任务优先级别的数目。该常数一旦被定义,则意味着系统中可供使用的优先级别为:0,1,2,OS_LOWEST

    7、_PRIO,共OS_LOWEST_PRIO+1个 固定地,系统总是把最低优先级别OS_LOWEST_PRIO自动赋给空闲任务。如果应用程序中还使用了统计任务,系统则会把优先级别OS_LOWEST_PRIO-1自动赋给统计任务,因此用户任务可以使用的优先级别是:0,1,2OS_LOWEST_PRIO-2,共OS_LOWEST_PRIO-1个 任 务 堆 栈 保存CPU寄存器中的内容及存储任务私有数据的需要,每个任务都应该配有自己的堆栈,任务堆栈是任务的重要的组成部分 在应用程序中定义任务堆栈的栈区非常简单,即定义一个OS_STK类型的一个数组并在创建一个任务时把这个数组的地址赋给该任务就可以了。

    8、例如:/定义堆栈的长度#defineTASK_STK_SIZE 512/定义一个数组来作为任务堆栈OS_STK TaskStkTASK_STK_SIZE;typedef unsigned int OS_STK;/这是系统定义的一个数据类型 void main(void)OSTaskCreate(MyTask,/任务的指针&MyTaskAgu,/传递给任务的参数&MyTaskStkMyTaskStkN-1,/任务堆栈栈顶地址20/任务的优先级别);在创建用户任务时,要传递任务的堆栈指针和任务优先级别使用函数OSTaskCreate()创建任务时,一定要注意所使用的处理器对堆栈增长方向的支持是向上

    9、的还是向下的 任务堆栈的初始化应用程序在创建一个新任务的时候,必须把在系统启动这个任务时CPU各寄存器所需要的初始数据(任务指针、任务堆栈指针、程序状态字等等),事先存放在任务的堆栈中 C/OS-II在创建任务函数OSTaskCreate()中通过调用任务堆栈初始化函数OSTaskStkInit()来完成任务堆栈初始化工作的 它的原型如下:OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdato,OS_STK*ptos,INT16U opt);由于各种处理器的寄存器及对堆栈的操作方式不尽相同,因此该函数需要用户在进行C/OS-II的移植时,按所使

    10、用的处理器由用户来编写。实现这个函数的具体细节,将在本书有关C/OS-II移植的章节中做进一步的介绍 其实,任务堆栈的初始化就是对该任务的虚拟处理器的初始化(复位)。任务控制块(OS_TCB)及任务控制块链表C/OS-II用来记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性的表就叫做任务控制块 任务控制块就相当于是一个任务的身份证,没有任务控制块的任务是不能被系统承认和管理的 任务控制块结构的主要成员typedef struct os_tcb OS_STK *OSTCBStkPtr;/指向任务堆栈栈顶的指针 struct os_tcb*OSTCBNext;/指向后一

    11、个任务控制块的指针 struct os_tcb*OSTCBPrev;/指向前一个任务控制块的指针 INT16U OSTCBDly;/任务等待的时限(节拍数)INT8U OSTCBStat;/任务的当前状态标志 INT8U OSTCBPrio;/任务的优先级别 OS_TCB;任务控制块链表空任务控制块链表当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块,然后用任务的属性对任务控制块各个成员进行赋值,最后再把这个任务控制块链入到任务控制块链表的头部 当进行

    12、系统初始化时,初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表。由于这些任务控制块还没有对应的任务,故这个链表叫做空任务块链表。即相当于是一些空白的身份证。任务就绪表及任务调度 多任务操作系统的核心工作就是任务调度。所谓调度,就是通过一个算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器。C/OS_II进行任务调度的思想是“近似地每时每刻总是让优先级最高的就绪任务处于运行状态”。为了保证这一点,它在系统或用户任务调用系统函数及执行中断服务程序结束时总是调用调度器,来确定应该运行的任务并运行它。C/OS_II进行任务调度的依据就是任务就绪表 为了

    13、能够使系统清楚地知道,系统中哪些任务已经就绪,哪些还没有就绪,C/OS_II在RAM中设立了一个记录表,系统中的每个任务都在这个表中占据一个位置,并用这个位置的状态(1或者0)来表示任务是否处于就绪状态,这个表就叫做任务就绪状态表,简称叫任务就绪表 任务就绪表就是一个二维数组OSRdyTbl 为加快访问任务就绪表的速度,系统定义了一个变量OSRdyGrp来表明就绪表每行中是否存在就绪任务。OSRdyTbl 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/

    14、0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/01/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0任务就绪表的示意图01234567xy01234567OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 11110000prio=29D7 D6 D5

    15、 D4 D3 D2 D1 D0 1D7 D6 D5 D4 D3 D2 D1 D0 1OSRdyTbl3 把prio为29的任务置为就绪状态YXOSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio&0 x07;在程序中,可以用类似下面的代码把优先级别为prio的任务置为就绪状态:OSRdyGrp|=OSMapTblprio3;OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio&0 x07;OSRdyTblprio3|=OSMapTblprio&0 x07;如果要使一个优先级别为prio的任务脱离

    16、就绪状态则可使用如下类似代码:if(OSRdyTblprio3&=if(OSRdyTblprio3&=OSMapTblprio&0 x07)=OSMapTblprio&0 x07)=0)0)OSRdyGrp&=OSRdyGrp&=OSMapTblprio3;OSMapTblprio3;OSRdyGrp D7 D6 D5 D4 D3 D2 D1 D0 11110000prio=29D7 D6 D5 D4 D3 D2 D1 D0 1D7 D6 D5 D4 D3 D2 D1 D0 1OSRdyTbly x=OSUnMapTalOSRdyTbly;11000000000000y=OSUnMapTalO

    17、SRdyGrp;图5-6 在就绪表中查找最高优先级别任务的过程从任务就绪表中获取优先级别最高的就绪任务可用如下类似的代码:y=OSUnMapTalOSRdyGrp;/D5、D4、D3位x=OSUnMapTalOSRdyTbly;/D2、D1、D0位prio=(y3)+x;/优先级别 或 y=OSUnMapTblOSRdyGrp;prio=(INT8U)(y 3)+OSUnMapTblOSRdyTbly);优先级判定表OSUnMapTbl256(os_core.c)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

    18、,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

    19、,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;举例:举例:如如OSRdyGrpOSRdyGrp的值为的值为00101000B00101000B,即,即0X280X28,则查得,则查得OSUnMapTblOSRdyGrpOSUnMapTblOSRdyGrp的值的值是是3 3,它相应于,它相应于OSRdyGrp

    20、OSRdyGrp中的中的第第3 3位置位置1 1;如如OSRdyTbl3OSRdyTbl3的值是的值是11100100B11100100B,即,即0XE40XE4,则查,则查OSUnMapTblOSRdyTbl3OSUnMapTblOSRdyTbl3的的值是值是2 2,则进入就绪态的最高,则进入就绪态的最高任务优先级任务优先级 Prio=3Prio=3*8+2=268+2=26 小结系统通过查找任务就绪表来获取待运行任务的优先级优先级任务切换过程获得待运行任务的任务控制块恢复待运行任务的运行环境处理器的PC=任务堆栈中的断点地址处理器的SP=任务块中保存的SP如何获得待运行任务的任务控制块?根

    21、据就绪表获得待运行任务的任务控制块指针其实,调度器在进行调度时,在这个位置还要进行一下判断:究竟是待运行任务是否为当前任务,如果是,则不切换;如果不是才切换,而且还要保存被中止任务的运行环境。1 任务切换宏 OS_TASK_SW()任务切换就是中止正在运行的任务(当前任务),转而去运行另外一个任务的操作,当然这个任务应该是就绪任务中优先级别最高的那个任务 先保护被中止任务的断点数据后恢复待运行任务的断点数据不要企图用PUSH和POP指令来使程序计数器PC压栈和出栈,因为没有这样的指令。只好变通一下了。中断动作和过程调用指令可以使PC压栈;中断返回指令可以使PC出栈。因此任务切换OSCtxSw(

    22、OSCtxSw()必定是一个中断服务程序。需要由宏OS_TASK_SW()来引发一次中断或者一次调用来使OSCtxSw(OSCtxSw()执行任务切换工作调度时机很容易想到的调度时机就是定时调度。对于实时系统来说,应该尽可能地实现即时调度。用函数OSTaskCreate()创建任务 应用程序通过调用OSTaskCreate()函数来创建一个任务,OSTaskCreate()函数的原型如下:INT8U OSTaskCreate(void(*task)(void*pd),/指向任务的指针 void*pdata,/传递给任务的参数 OS_STK*ptos,/指向任务堆栈栈顶的指针 INT8U pri

    23、o/任务的优先级)创建任务 的一般方法 一般来说,任务可以在调用函数OSStart()启动任务调度之前来创建,也可以在任务中来创建。但是,C/OS-II有一个规定:在调用启动任务函数OSStart()之前,必须已经创建了至少一个任务。因此,人们习惯上在调用函数OSStart()之前先创建一个任务,并赋予它最高的优先级别,从而使它成为起始任务。然后在这个起始任务中,再创建其他各任务。如果要使用系统提供的统计任务,则统计任务的初始化函数也必须在这个起始任务中来调用 void main(void)OSInit();/对C/OS-II进行初始化OSTaskCreate(TaskStart,);/创建任

    24、务TaskStartOSStart();/开始多任务调度 void TaskStart(void*pdata)/在这个位置安装并启动C/OS-II的时钟OSStatInit();/初始化统计任务/在这个位置创建其他任务for(;)起始任务TaskStart的代码 C/OS-II的初始化在使用C/OS-II的所有服务之前,必须要调用C/OS-II的初始化函数OSInit()对C/OS-II自身的运行环境进行初始化。函数OSInit()将对C/OS-II的所有的全局变量和数据结构进行初始化,同时创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永远的就绪状态。如果用户应用程序还要使用统计任务的话(常数OS_TASK_STAT_EN=1),则OSInit()还要以优先级别为OS_LOWEST_PRIO-1来创建统计任务 初始化函数OSInit()对数据结构进行初始化时,主要要创建包括空任务控制块链表在内的5个空数据缓冲区。同时,为了可以快速地查询任务控制块链表中的各个元素,初始化函数OSInit()还要创建一个数组OSTCBPrioTblOS_LOWEST_PRIO+1,在这个数组中,按任务的优先级别的顺序把任务控制块的指针存放在了对应的元素中

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:课件:原理1-任务管理-.ppt
    链接地址:https://www.163wenku.com/p-3481451.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库