1、嵌入式操作系统基础 第四章 嵌入式实时操作系统1 第四章 嵌入式实时操作系统 uC/OS-II及其任务uuC/OS-II概述概述uuC/OS-II的任务的任务uuC/OS-II任务的存储结构任务的存储结构uuC/OS-II任务的状态任务的状态u任务的优先级别任务的优先级别u任务控制块任务控制块u任务堆栈任务堆栈u系统任务系统任务u临界区临界区嵌入式操作系统基础 第四章 嵌入式实时操作系统2第四章 嵌入式实时操作系统uC/OS-II及其任务一、uC/OS-II的特点4.1 uC/OS-II概述嵌入式操作系统基础 第四章 嵌入式实时操作系统3二、uC/OS-II的文件结构1.几个应用程序相关头文件
2、(1)includes.h(1)includes.h#include#include#include#include#include#include#include /*与应用程序相关*/#include“softwareucosiiix86bc31os_cpu.h”#include“os_cfg.h”#include“softwareuscos-iisourceucos_ii.h”#include“softwareblockspcbc31pc.h”由具体应用环境决定嵌入式操作系统基础 第四章 嵌入式实时操作系统4(2)os_cfg.h(2)os_cfg.h#define OS_MAX_EVE
3、NTS 2 /事件总数#define OS_MAX_FLAGS 5 /信号量集总数#define OS_MAX_MEM_PART 5 /内存块数量#define OS_MAX_QS 2 /消息队列数量#define OS_MAX_TASKS 50 /任务数量#define OS_LOWEST_PRIO 52 /用户任务数量#define OS_TASK_IDLE_STK_SIZE 512 /空闲任务堆栈长度#define OS_TASK_CHANGE_PRIO_EN 1 /优先级修改功能可用#define OS_TASK_CREATE_ENABLE 1 /任务创建功能可用 系统裁剪性的实现:#
4、if OS_TASK_CREATE_EXE_EN /用户可代码#endif 嵌入式操作系统基础 第四章 嵌入式实时操作系统52.几个系统硬件相关头文件(1)os_cpu.h(1)os_cpu.hTypedef unsigned char BOOLEAN;Typedef unsigned char INT8U;Typedef signed char INT8S;Typedef unsigned int INT16U;Typedef signed int INT16S;Typedef unsigned long INT32U;Typedef signed long INT32U;Typedef f
5、loat FP32;Typedef double FP64;Typedef unsigned int OS_STK;Typedef unsigned short OS_CPU_SR;#define BYTE INT8S#define UBYTE INT8U#define WORD INT16S#define UWORD INT16U#define LONG INT32S#define ULONG INT32U嵌入式操作系统基础 第四章 嵌入式实时操作系统6#define OS_CRITICAL_METHOD 2#if OS_CRITICAL_METHOD=1#define OS_ENTER_C
6、RITICAL()asm CLI#define OS_EXIT_CRITICAL()asm STI#endif#if OS_CRITICAL_METHOD=2#define OS_ENTER_CRITICAL()asm(PUSHF;CLI)#define OS_EXIT_CRITICAL()asm POPF#endif#if OS_CRITICAL_METHOD=3#define OS_ENTER_CRITICAL()(cpu_sr=OSCPUSaveSR()#define OS_EXIT_CRITICAL()(OSCPURestoreSR(cpu_sr)#endif与系统处理器相关的宏定义与
7、系统处理器相关的宏定义:嵌入式操作系统基础 第四章 嵌入式实时操作系统73.内核相关文件三、uC/OS-II的裁剪性typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN void *OSTCBExtPtr;OS_STK *OSTCBStkBottom;INT32U OSTCBStkSize;INT16U OSTCBOpt;INT16U OSTCBId;#endif#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN|OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endi
8、f#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN void *OSTCBMsg;#endif#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;由cfg.h设定编译与否(值为1)由cfg.h设定编译与否(值为0)嵌入式操作系统基础 第四章 嵌入式实时操作系统84.2 uC/OS-II任务1.任务的统一性与独立性总任务与分任务任务就是一个无限循环的任务就是一个无限循环的C函数函数 void YourTask(void*pdata)(1)for(;)(2)/*用户代码*/调用uC/OS-II的某种系统服务:OSMbox
9、Pend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*用户代码*/嵌入式操作系统基础 第四章 嵌入式实时操作系统92.嵌入式实时操作系统对任务的响应异步事件;周期性事件;同时具有异步和周期特性的时间;嵌入式操作系统基础 第四章 嵌入式实时操作系统104.3 uC/OS-II任务的存储结构任务控制块:保存任务属性信息。任务堆栈:保存任务的工作环境。任务程序代码:任务执行的实体。嵌入式操作系统基础 第四章 嵌入式实时操作系统11 为
10、了便于管理,相应的任务控制块彼此通过自己的指针彼此连接形成一个链表。嵌入式操作系统基础 第四章 嵌入式实时操作系统124.4 uC/OS-II任务状态嵌入式操作系统基础 第四章 嵌入式实时操作系统13睡眠态(DORMANT):指任务驻留在程序空间之中,还没有交给C/OS-管理。就绪态:通过调用两个函数之一:OSTaskCreate()或OSTaskCreateExt()来建立任务,一旦建立任务就进入就绪态准备运行。运行态:调用OSStart()函数可以启动任务,即任务投入运行,它总是启动拥有最高优先级的任务 等待态:正在运行的任务需要延迟一段时间或等待某事件的发生,它将放弃让出处理器进入等待状
11、态。中断态:正在运行的任务是可以被中断的,除非该任务将中断关了,或者C/OS-将中断关了。被中断的任务就进入了中断服务态(ISR)。嵌入式操作系统基础 第四章 嵌入式实时操作系统144.5 uC/OS-II任务优先级vuC/OS-II为硬实时可剥夺型内核v任务数量一定,且拥有全系统唯一优先级OS_LOWEST_PRIOvuC/OS系统都系统中最低优先级任务默认 嵌入式操作系统基础 第四章 嵌入式实时操作系统154.6 任务优控制块(TCB)typedef struct os_tcb OS_STK *OSTCBStkPtr;/指向任务堆栈栈顶的指针#if OS_TASK_CREATE_EXT_E
12、N void *OSTCBExtPtr;/指向任务控制块扩展的指针 OS_STK *OSTCBStkBottom;/指向任务堆栈栈底的指针 INT32U OSTCBStkSize;/任务堆栈的长度 INT16U OSTCBOpt;/创建任务时的选择项 INT16U OSTCBId;/目前,该域未被使用#endif struct os_tcb*OSTCBNext;/指向后一个任务控制块的指针 struct os_tcb*OSTCBPrev;/指向前一个任务控制块的指针#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN|OS_Sem_EN OS_EVENT*OSTCBEven
13、tPtr;/指向事件控制块的指针#endif1.任务控制块结构定义嵌入式操作系统基础 第四章 嵌入式实时操作系统16#if(OS_Q_EN&(OS_MAX_QS=2)|OS_MBOX_EN void *OSTCBMsg;/指向传递给任务消息的指针#endif INT16U OSTCBDly;/任务等待的时限(节拍数)INT8U OSTCBStat;/任务的当前状态标志 INT8U OSTCBPrio;/任务的优先级别 INT8U OSTCBX;/用于快速访问就绪表的数据 INT8U OSTCBY;/用于快速访问就绪表的数据 INT8U OSTCBBitX;/用于快速访问就绪表的数据 INT8U
14、 OSTCBBitY;/用于快速访问就绪表的数据#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;/请求删除任务时用到的标志#endif OS_TCB;等到中断到来减1值说值说 明明OS_STAT_RDYOS_STAT_RDY表示任务处于就绪状态表示任务处于就绪状态OS_STAT_SEMOS_STAT_SEM表示任务处表示任务处于等待信号量状态于等待信号量状态OS_STAT_MBOXOS_STAT_MBOX表示任务处于等待消息邮箱状态表示任务处于等待消息邮箱状态OS_STAT_QOS_STAT_Q表示任务处于等待消息队列状态表示任务处于等待消息队列状态OS_STAT
15、_SUSPENDOS_STAT_SUSPEND表示任务处表示任务处于被挂起状态于被挂起状态OS_STAT_MUTEXOS_STAT_MUTEX表示任务处于等待互斥型信号量状态表示任务处于等待互斥型信号量状态嵌入式操作系统基础 第四章 嵌入式实时操作系统172.空闲任务块链表v(空)任务块数量(空)任务块数量:系统初始化时建立,数量由系统初始化时建立,数量由os_cfg.hos_cfg.h中参数中参数OS_MAX_TASKS+OS_N_SYS_TASKSOS_MAX_TASKS+OS_N_SYS_TASKS决定决定.v任务数:任务数:文件文件UCOS_II.HUCOS_II.H中的常数中的常数O
16、S_N_SYS_TASKSOS_N_SYS_TASKS它指明它指明了系统任务的数目。了系统任务的数目。嵌入式操作系统基础 第四章 嵌入式实时操作系统183.任务链表的建立v任务创建函数:任务创建函数:OSTaskCreateOSTaskCreate()()或或OSTaskCreateExtOSTaskCreateExt()()v任务搜索数组:任务搜索数组:OSTCBTbOSTCBTb,按优先级顺序按优先级顺序存放任务控制块指针。存放任务控制块指针。v全局变量:全局变量:OSTCBCurOSTCBCur,存放当前占用处理,存放当前占用处理器资源的任务器资源的任务v任务删除函数:任务删除函数:OS
17、TaskDelOSTaskDel(),(),任务删除的任务删除的实质就是资源的回收。实质就是资源的回收。嵌入式操作系统基础 第四章 嵌入式实时操作系统19嵌入式操作系统基础 第四章 嵌入式实时操作系统204.7 任务堆栈v堆栈:按堆栈:按“先进进出(先进进出(FIFOFIFO)”顺序组织的存储空间。顺序组织的存储空间。v堆栈创建堆栈创建一、任务堆栈的创建static OS_STK MyTaskStackstack_size;OROS_STK MyTaskStackstack_size;OS_STK *pstk;pstk=(OS_STK*)malloc(stack_size);if(pstk!=
18、(OS_STK*)0)/*确认malloc()能得到足够地内存空间*/INTU8U OSTaskCreate(void*pdata);嵌入式操作系统基础 第四章 嵌入式实时操作系统21v任务创建任务创建 INT8U OSTaskCreate(void(*task)(void*pd),void*pdata.OS_STK*ptos,INT8U prio );嵌入式操作系统基础 第四章 嵌入式实时操作系统22二、任务堆栈的初始化 处理器启动任务时,寄存器需要预置一些与待运行任务相处理器启动任务时,寄存器需要预置一些与待运行任务相关的初始数据的,决定了新任务建立,其与处理器寄存器有关的初始数据的,决定
19、了新任务建立,其与处理器寄存器有关的内容必须先预存在其私有堆栈中。关的内容必须先预存在其私有堆栈中。堆栈初始化函数堆栈初始化函数 OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdato.OS_STK*ptos,INT8U opt);嵌入式操作系统基础 第四章 嵌入式实时操作系统234.8 系统任务v空闲任务:多任务系统中,系统为了保持正常的运算,在某个无用户任务运行的时间段运行的一个系统自建任务.void OSTaskIdle(void*pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata;for(;)OS_ENTER_CRITICAL();OSdleCtr+;OS_EXIT_CRITICAL();临界区临界区嵌入式操作系统基础 第四章 嵌入式实时操作系统24v统计任务:用来记录处理器使用情况,有系统自身建立的任务。v临界区:系统中,某些代码执行过程中不允许中断其执行,这段代码执行时形成的上下文环境成为临界区。嵌入式操作系统基础 第四章 嵌入式实时操作系统25