ucosiii系统中的任务管理

前言:
  多任务操作系统最重要的就是对任务进行管理,包括任务的创建,挂起,删除和调度等,因此对于ucosiii操作系统中任务管理的理解就显得尤为重要了。
  分几个部分介绍:
    1:任务状态
    2:任务控制块
    3:任务堆栈
    4:任务就绪表
    5:任务调度和切换

1:任务状态
  UCOSIII支持的是单核cpu,不支持多核cpu,所以在某一时刻就只有一个任务会获得cpu的使用权,其他任务就会进入其他状态。每个任务有5种状态:睡眠状态,就绪状态,运行状态,等待状态和中断服务状态。
任务状态表
2:任务控制块
  这是ucos中一个比较重要的数据结构模块,用来保存任务的信息,如当前任务的状态,任务的优先级,任务的堆栈大小等。任务控制块相当于一个任务的身份证,系统就是通过任务控制块来识别或管理任务的, 没有这个控制块就不能被识别出来。系统把所有的任务控制块链接成一个表,并通过它管理各个任务。我们在创建任务的时候就会给任务分配一个任务控制块并初始化这个结构体。

struct os_tcb {
这里只列出一些成员进行解析
    OS_TCB              *NextPtr;                           /* Pointer to next     TCB in the TCB list                */
    OS_TCB              *PrevPtr;                           /* Pointer to previous TCB in the TCB list                */
    OS_TCB              *TickNextPtr;
    OS_TCB              *TickPrevPtr;
    CPU_CHAR            *NamePtr;                           /* Pointer to task name                                   */
    
    CPU_STK             *StkBasePtr;                        /* Pointer to base address of stack    */
    OS_STATE             TaskState;                         /* See OS_TASK_STATE_xxx                                  */
    OS_PRIO              Prio;                              /* Task priority (0 == highest)                           */
    CPU_STK_SIZE         StkSize;                           /* Size of task stack (in number of stack elements)       */

    CPU_STK_SIZE         StkUsed;                           /* Number of stack elements used from the stack           */
    CPU_STK_SIZE         StkFree;                           /* Number of stack elements free on   the stack           */
    OS_CYCLES            CyclesTotal;                       /* Total number of # of cycles the task has been running  */
    ...... 

}os_tcb ;

NextPtr 和PrevPtr用于任务就绪表的建立,双向链表
TickNextPtrv 和TickPrevPtr把正在等待或者延时的某个事件任务的os_tcb任务结构体构成双向链表
NamePtr 任务名字
StkBasePtr任务堆栈基地址
TaskState 当前任务的状态
Prio 当前任务的优先级
StkSize 任务的堆栈带大小
StkUsedStkFree 该任务的使用率
CyclesTotal 表示一个任务执行完总的执行时间

3:任务堆栈
  在ucos中堆栈是一个非常重要的概念,用来在任务切换或者调用其他函数时保存现场,说的明白点就是存储器中的连续存储空间。为了满足任务切换和响应中断时保存CPU寄存器中的内容以及任务调用其他函数时的需要,每个任务都有自己的堆栈。在创建任务的时候,任务堆栈是任务创建的一个重要入口参数。

我们一般是在创建任务的时候就定义好任务的堆栈大小 ,优先级,控制块等信息,这些信息在创建任务函数的时候被调用。

//任务优先级
#define 	START_TASK_PRIO		3
//任务堆栈大小	
#define 	START_STK_SIZE 		128
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈	
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);

4:任务就绪表
ucosiii中将已经就绪的任务放入就绪任务表中,任务就绪表有两部分:优先级位映射表就绪任务列表
(1)优先级位映射表
当某一个任务就绪以后就会在优先级表中相应的位置置1,如图所示:
在这里插入图片描述
从左往右优先级逐渐降低,从上往下优先级逐渐降低。
优先级位映射表OSPrioTbl[] ,是一个32位的位宽类型,在os_cfg.h中定义修改,如果今后你移植的cpu上是64位的,记得修改对应即可。常见的优先级的操作函数:
OS_PrioInit() 初始化
OS_PrioInsert() 将某个任务就绪表中的位置1
OS_PrioRemove() 将某个任务就绪表中的位清0
OS_PrioGetHighest(); 获取当前就绪任务表中的最高优先级

(2):就绪任务列表
就绪任务表主要是用来标记每一个优先级下的所有就绪的任务OSRdyList[],他是一个结构体,记录的是此优先级下有多少任务数量,和任务的任务快链表头,尾。
ucosiii支持时间片轮转调度,因此在同一个优先级下会存在多个任务的情况,那么我们就要对这些任务做一个管理,使用OSRdyList[]数组来管控这些任务。数组中每一个元素对应一个任务优先级,比如OSRdyList[0] 就是管理所有优先级位0 的任务。
在这里插入图片描述
在SPrioTbl[]表中记录了所有优先级,然后在OSRdyList[]中记录的是每个优先级下的所有任务。但需要注意的是不是所有的OSRdyList[]中都有很多任务,有些有且只有一个,如:空闲任务,时钟节拍任务,统计任务,定时任务,中断管理人任务等。

5:任务调度和切换
  任务调度和切换就是让就虚心任务表中优先级最高的任务获得cpu的使用权,ucosiii是可剥夺型,抢占式的。高优先级的可以抢低优先级任务的cpu使用权,任务调度就是一个叫做任务调度器的东西来完成的。
任务调度器有两种:任务级调度器中断级调度器任务级调度器就是根据任务的优先级来使用cpu,然后进行任务切换。中断调度器就是指有中断的任务强行打断正在执行的任务 转而去执行中断服务函数里面的动作。
  还有一种任务调度器叫:时间片轮转调度,这个是用于同优先级下的讴歌任务的时候。可以设置每个任务执行的时间片,时间片一到就切换到另一个任务。这个调度器只在同优先级下有多个任务的时候使用。

总结:
  对于ucos中的任务管理,你可以把每个任务都看成一个单独的模块,然后每个模块有一个叫os_tcb的任务 控制块身份证,系统通过这个身份证来识别每个任务。任务堆栈就是指这个任务需要的内存空间,我们一般不知道这个任务需要多大,所以提前预留一个较大的内存空间给他,最后可以去查询这个任务的cpu使用率,就可以知道这个任务的具体大小,然后修改堆栈大小。任务控制块里面还保存着跟这个任务的所有相关信息,如任务优先级,任务链表等。
  把每个任务控制块链接在一起就是一个链表。系统通过查询这个链表 来确定该执行哪一个优先级高的任务。任务切换也是如此,当某个最高优先级任务执行完后,就轮询就绪任务表,然后执行当前任务优先级最高的任务。在同一优先级下有多个任务时 就使用时间片轮转调度来执行各个任务。

下一章我们讲解任务调度里面的常用的函数

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值