uC/OS-III学习笔记(一)任务管理

uC/OS-III学习笔记(一)任务管理

任务状态

uC/OS-III的任务有5个状态,可以相互转换:
在这里插入图片描述
在这里插入图片描述

任务控制块

任务控制块OS_TCB是一个结构体,这个结构体的成员变量很多,用来保存任务的信息,我们使用OSTaskCreat()函数创建任务的时候就会给任务分配一个任务控制块。

struct os_tcb{
	CPU_STK		*stkPtr;
	void		*ExtPtr;
	...
}

任务堆栈

  1. 定义任务堆栈
#define TASK_STK_SIZE 64 //任务堆栈大小
CPU TASK_STK[TASK_STK_SIZE]; //定义任务堆栈
  1. 任务堆栈使用
    我们使用OSTaskCreat()函数创建任务时就可以把创建的任务堆栈传递给任务。
OSTaskCreat(
	...
	(CPU_STK*)      &TASK_STK[0],     //任务堆栈基地址
	(CPU_STK_SIZE)  TASK_STK_SIZE/10, //任务堆栈深度限位
	(CPU_STK_SIZE)  TASK_STK_SIZE,    //任务堆栈大小
	...)

创建任务的时候会初始化任务的堆栈,完成初始化堆栈的函数是OSTaskStInit(),用户不能调用这个函数,这个函数是被OSTask()在创建任务的时候调用的。

任务就绪表

uC/OS-III会将就绪的任务放在任务就绪表中,任务就绪表包括优先级位映射表OSPrioTbl[]和就绪任务列表OSRadyList[]

  1. 优先级位映射表
    优先级位映射表用于保存目前有哪些优先级中的任务就绪,当某一个任务就绪以后就会将该任务对应的优先级位置1,表明该优先级下有任务处于就绪状态。
    在这里插入图片描述
    关于优先级的操作有三个函数
  • OS_PrioGetHighest() 获取就绪中最高优先级任务
  • OS_PrioInsert() 将某个任务在任务就绪表中相应位置1
  • OS_PrioRemove() 将某个任务在任务就绪表中相应位清0
  1. 就绪任务列表
    任务就绪列表用来记录每一个优先级下所有就绪的任务,OSRdyList[]在os.h中定义,数组元素的类型为OS_RDY_LIST,为一个结构体,定义如下:
struct os_rdy_list{
	OS_TCB	   *HeaderPtr;   //链表头指针
	OS_TCB	   *TailPtr;     //链表尾指针
	OS_OBJ_QTY  NbrEntries;  //此优先级下的任务数量
};

uC/OS-III支持时间片轮转调度,一个优先级下有多个任务,任务就绪列表就是用来管理同一优先级下的多个任务的。比如OSRdyList[0] 用来管理优先级0下的所有任务。

任务就绪列表的操作函数有:
在这里插入图片描述

任务调度

任务调度就是让就绪表中优先级最高的任务获得CPU的使用权,高优先级的任务可以抢占低优先级的任务。任务调度器有两种:

  1. 任务级调度器OSSched()

  2. 中断级调度器OSIntExit()

除了任务级调度器和中断级调度器,还有时间片轮转调度器

uC/OS-III中允许一个任务运行一段时间后让出CPU的使用权,让同一优先级的下一个任务运行。
在这里插入图片描述

发布了17 篇原创文章 · 获赞 21 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43116606/article/details/104276295