RTOS-uCOS-II-原理及应用----2

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

page12020/7/14嵌入式实时操作系统μC/OS-IIpage2020/7/14西安邮电学院计算机系2第2章uC/OS-II中的任务page西安邮电学院计算机系32020/7/14第2章目录1、任务的基本概念2、任务堆栈3、任务控制块及任务控制块链表4、任务就绪表及任务调度5、任务的创建6、任务的挂起和恢复7、其他任务管理函数8、uC/OS-II的初始化和任务的启动page西安邮电学院计算机系42020/7/14第2章补充.目录1、任务的特性2、任务的划分目标3、任务的划分方法4、任务的可调度性分析5、任务的执行分类和优先级安排6、任务设计中的问题7、系统设计编码实现过程8、中断服务程序的设计page西安邮电学院计算机系52020/7/14第2章目录1、任务的基本概念2、任务堆栈3、任务控制块及任务控制块链表4、任务就绪表及任务调度5、任务的创建6、任务的挂起和恢复7、其他任务管理函数8、uC/OS-II的初始化和任务的启动page西安邮电学院计算机系62020/7/142.1任务的基本概念复杂问题“分而治之”的问题解题思路。针对目标系统拆分后的“小且易”的问题的具体处理方法编码和数据结构----任务。uC/OS-II的两种任务:系统任务、用户任务。任务的组成:任务控制块----uC/OS-II进行任务管理用的一个数据结构。任务代码----描述任务算法的程序编码。任务堆栈----任务的工作现场环境。page西安邮电学院计算机系72020/7/142.1任务的基本概念page西安邮电学院计算机系82020/7/142.1任务的基本概念“宏观”上的多任务并发,实际上是用单CPU进行多任务处理,“微观”任何时刻,只能运行一个任务,存在CPU资源竞争----任务调度、任务现场。各个任务在多任务系统中也随着环境条件的情况而具有不同的状态。任务状态划分也是多任务操作系统的管理手段。任务的5种状态:Sleep----仅有编码未激活。Ready----已激活并“万事俱备,只欠调度”Running----正占用CPU运行自己。Wait----等待某事件发生。ISR_Sta----Running状态的任务被中断后进入的状态。page西安邮电学院计算机系92020/7/14任务的状态及其转换正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,这时任务的状态叫做就绪状态。处于就绪状态的任务如果经调度器判断获得了CPU的使用权,则任务就进入运行状态一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态page西安邮电学院计算机系102020/7/14用户任务代码的一般结构voidMyTask(void*pdata){……//任务的初始化for(;;)//超循环构成任务体{可被中断的用户代码片断;OS_ENTER_CRITICAL();//进入临界区(关中断)不可被中断的用户代码片断;OS_EXIT_CRITICAL();//退出临界区(开中断)可被中断的用户代码片断;}}page西安邮电学院计算机系112020/7/14用户应用程序的一般结构“用户任务”代码形式上很像C函数,但他不是函数!“任务”不能被主函数main()或其他函数调用,只能被主函数或已激活任务创建。任务的运行由操作系统调度管理。voidMyTask1(void*pdata){……}voidMyTask2(void*pdata){……}voidmain(){……OSInit();……OSTaskCreate(MyTask1,……);OSTaskCreate(MyTask2,……);……OSStart();……}page西安邮电学院计算机系122020/7/142.1任务的基本概念在此我们学习了uC/OS-II的3个系统函数和2个宏。OSInit()----初始化uC/OS-II环境。OSTaskCreate()----创建任务系统函数。OSStart()----启动uC/OS-II任务调度器。OS_ENTER_CRITICAL()----进入临界区(宏)OS_EXIT_CRITICAL()----退出临界区(宏)OSInit()函数原型:voidOSInit(void)OSStar()函数原型:voidOSStart(void)OSTaskCreate()函数原型:INT8UOSTaskCreate(void(*task)(void*pd),//指向任务的指针void*pdata,//传递给任务的参数OS_STK*ptos,//任务堆栈栈顶的指针INT8Uprio//任务的优先级别)page西安邮电学院计算机系132020/7/14OSTaskCreate()函数使用举例:定义任务task_Avoidtask_A(void*pdata){……;//任务初始化部分while(1){……;//任务功能代码}}在系统“创建”任务task_Avoidmain(void){OSInit();//系统初始化部分……OSTaskCreate(task_A,void*0,&MystackTop,8);OSStart();}page西安邮电学院计算机系142020/7/142.1任务的基本概念系统任务空闲任务(OSTaskIdel())统计任务(OSTaskStat())原型:voidOSTaskIdel(void*pdata)原型:voidOSTaskStat(void*pdata)空闲任务(OSTaskIdel())使用说明:1、uC/OS-II规定用户程序中必须使用OSTaskIdel。2、该任务不能用软件删除。3、该任务是uC/OS-II初始化时自动创建,其任务优先级固定为最低级,用户也可修改该任务的业务。4、目的----使CPU在没有用户任务可执行时也有事可做。统计任务(OSTaskStat())使用说明:1、功能完成用户任务CPU使用率的统计,结果以百分比的形式存放在变量OSCPUsage中。2、该任务用户可选择使用。OS_CFG.H文件中的常数OS_TASK_STAT_EN设置为1,使能该函数。3、用户在OS_CFG.H中使能该任务后,系统自动创建该任务,但在用户使用统计数据前必须调用系统函数OSStatInit()先进行初始化。4、该任务固定拥有次末任务优先级。page西安邮电学院计算机系152020/7/142.1任务的基本概念任务的优先权和优先级别uC/OS-II的每个任务都必须有唯一的优先级。uC/OS-II最多可以管理64个优先级别分配给64个任务。uC/OS-II中用一个8b的整型数来表示优先级别,数字越小,优先级越高,prio=0的任务优先级最高。uC/OS-II中使用任务的优先级(prio)作为任务句柄。用户通过修改OS_CFG.H中的宏定义常数OS_LOWEST_PRIO的值,约定本用户系统的最大优先级数。page西安邮电学院计算机系162020/7/14第2章目录1、任务的基本概念2、任务堆栈3、任务控制块及任务控制块链表4、任务就绪表及任务调度5、任务的创建6、任务的挂起和恢复7、其他任务管理函数8、uC/OS-II的初始化和任务的启动page西安邮电学院计算机系172020/7/142.2任务堆栈堆栈----LIFO访问原则组织的连续存储器。任务堆栈在uC/OS-II中的应用:任务堆栈是任务的三大组成部分之一。保存CPU寄存器现场(R0~R12、LR、SPSR等)。本Task的私有数据。page西安邮电学院计算机系182020/7/142.2任务堆栈任务堆栈的创建-----在创建任务的同时,任务堆栈即被创建。举例:#defineMyTaskStkSize64OS_STKMyTaskStk[MyTaskStkSize]//在OS_CPU.H中定义OS_STK……//typedefINT32UOS_STKINT8UOSTaskCreate(void(*task)(void*pd),//指向任务的指针void*pdata,//传递给任务的参数MyTaskStk[MyTaskStkSize-1]//任务堆栈栈顶的指针INT8Uprio//任务的优先级别)page西安邮电学院计算机系192020/7/142.2任务堆栈任务堆栈的使用注意事项__存在两种堆栈形式递增堆栈----进栈操作向大地址方向发展。递减堆栈----进栈操作向小地址方向发展。OSTaskCreate(……&MyTaskStk[StkSize-1],……)OSTaskCreate(……&MyTaskStk[0],……)备注:利用条件编译技术和OS_CPU.H中的宏定义常数OS_STK_GROWTH编写易移植用户系统;“1”---递减堆栈forARMCPU。page西安邮电学院计算机系202020/7/14第2章目录1、任务的基本概念2、任务堆栈3、任务控制块及任务控制块链表4、任务就绪表及任务调度5、任务的创建6、任务的挂起和恢复7、其他任务管理函数8、uC/OS-II的初始化和任务的启动page西安邮电学院计算机系212020/7/142.3任务控制块及任务控制块链表任务控制块(TCB)----任务在系统中的身份证TCB----uC/OS-II中用于记录任务信息(任务堆栈指针、任务当前状态、任务优先级别等)的数据结构。uC/OS-II将系统中的所有TCB构成两个链表(OSTCBList、OSTCBFreeList)进行任务管理。空任务控制块链表----未被分配的TCB链OSTCBFreeList。任务控制块链表----已分配的TCB链OSTCBList。page西安邮电学院计算机系222020/7/142.3任务控制块及任务控制块链表任务控制块(TCB)的结构任务控制块结构的主要成员typedefstructos_tcb{structos_tcb*OSTCBNext;//指向下一个TCB的指针structos_tcb*OSTCBPrev;//指向前一个TCB的指针OS_STK*OSTCBStkPtr;//指向任务堆栈栈顶的指针……INT16UOSTCBDly;//任务等待时间INT8UOSTCBStat;//任务的当前状态标志INT8UOSTCBPrio;//任务的优先级别……}OS_TCB;page西安邮电学院计算机系232020/7/142.3任务控制块及任务控制块链表任务控制块链表空任务控制块链表(OSTCBFreeList)任务控制块链表(OSTCBList)-----uC/OS-II用两个链表来管理TCBpage西安邮电学院计算机系242020/7/142.3任务控制块及任务控制块链表任务控制块链表空任务块链表是在uC/OS-II初始化(OSInit())时系统自建的,用户可依据目标系统的实际需求,设定其链表长度。OS_CFG.H文件中的宏常数OS_MAX_TASKS----用于定义最大用户任务数。UCOS_II.H文件中的宏常数OS_N_SYS_TASKS----用于约定系统任务数,其值固定为2。当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。这个函数首先为被创建任务从空任务控制块链表获取一个任务控制块,然后用任务的属性对任务控制块各个成员进行赋值,最后再把这个任务控制块链入到任务控制块链表的头部。当进行系统初始化时,初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表。由于这些任务控制块还没有对应的任务,故这个链表叫做空

1 / 113
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功