EDABOSS电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
专业IC版图外包 13816911948
芯满微电子---电机驱动方案专家
点击购买文字广告
点击购买文字广告
点击购买文字广告
点击购买文字广告
点击购买文字广告
点击购买文字广告
点击购买文字广告
点击购买文字广告
点击购买文字广告
点击购买文字广告
查看: 75|回复: 0

[转帖] uC/OS-II 学习笔记—任务管理数据结构

[复制链接]

9

主题

9

帖子

51

E币

技术员

Rank: 2

积分
18
发表于 2019-9-17 08:34:27 | 显示全部楼层 |阅读模式
任务管理的数据结构包括任务控制块、任务空闲链表和任务就绪链表、任务优先级指针表、任务堆栈等,是uC/OS-II内核的核心部分之一。离开了这些数据结构,内核什么功能也完成不了。这些数据的内容完全反映了任务的运行情况。
任务控制块是任务管理的核心数据结构,操作系统在启动的时候,首先要在内存中创建一定数量的任务控制块。任务控制块的数量等于操作系统能同时管理的最多任务数。
uC/OS将任务控制块划分为两个链表:就绪链表和空闲链表。创建一个任务,就从空闲链表中取出一个空闲的任务控制块,将任务的各种属性添入该控制块,并将该任务控制块移到就绪链表,更改就绪表和就绪组,任务就从睡眠态转换到就绪态,当没有更高优先级的任务在运行时,任务就可以得到运行。相反,要结束一个任务的运行,就要将该任务的任务控制块从就绪链表移到空闲链表,然后修改就绪表和就绪组,取消任务的就绪标志,就绪就从就绪态转换到其他状态,而只有再回到就绪态才有可能得到运行。
任务控制块的基本结构体在ucos_ii.h文件中定义:

040037h1ojoxmr7cb6xvar.png
040038dvu8bmcuhu7z6c8h.png
对任务控制块结构OS_TCB说明如下:
(1)*OSTCBStkPtr是指向OS_STK数据类型的指针。OS_STK在OS_CPU.h文件中定义:
040036egh9hfxmrxujn96p.png
因此,OS_STK就是无符号整形。OS_STK是任务堆栈的每个数据项的类型,对于不同的硬件系统是不同的,在做移植的时候就需要进行修改。OS_CPU.h中定义了和CPU有关的数据结构和全局变量。
任务堆栈的操作是最底层的,要用汇编语言来写代码,因此指针在整个结构体的第一句开始定义。那么在定义结构体的实体后,控制块的0地址就存储了任务堆栈的栈顶地址,方便了汇编语言操作。
换句话说,OSTCBStkPtr是只想任务堆栈栈顶的指针。每个任务都有自己的任务堆栈,任务堆栈是进行任务切换的关键数据结构,任务运行的CPU环境,包括任务的代码的地址都保存在任务堆栈中。
(2)结构体OS_TCB中,使用了条件编译语句(#if和#endif)。条件编译的含义是只有在OS_TASK_CREATE_EXT_EN>0的情况下,#if和#endif之间的代码才会被编译,任务控制块才会包含这些字段。OS_TASK_CREATE_EXT_EN是在头文件中定义的宏,当它为1时,表示使用任务创建扩展功能,该段代码就会被编译,OS_TCB中就包含了#if和#endif之间的5种结构体字段。相反,如果OS_TASK_CREATE_EXT_EN=0,那么该5种字段不会被包含。这样的设计能最小化程序的代码和使用最小的内存空间。
在操作系统的设计过程中,空间和效率是至关重要的,条件编译语句使用的非常多。
(3)接下来又是一个条件编译,含义为如果使用消息队列或消息邮箱或信号量(包括普通信号量和互斥信号量),那么任务要用到事件控制块,OSTCBEventPtr即指向事件控制块的指针。否则不定义该字段。在默认情况下,是要用到事件控制块的。从这个条件编译指令可以知道,消息、队列、信号量等都要用到事件控制块。
(4)任务状态OSTCBStat。任务状态的取值范围和对应的宏如表
取值
含义
OS_STAT_RDY
0x00
任务未等待事件且未挂起
OS_STAT_SEM
0x01
任务等待信号量
OS_STAT_MBOX
0x02
任务等待邮箱
OS_STAT_Q
0x04
任务等待消息队列
OS_STAT_SUSPEND
0x08
任务挂起
OS_STAT_MUTEX
0x10
任务等待互斥信号量
OS_STAT_FLAG
0x20
任务等待事件标志
(5)任务优先级OSTCBPrio。每个任务有唯一的优先级,因此uC/OS-II以优先级作为事件的标志,作为任务管理的主键。任务的优先级可以是0~63,但优先级62和63被统计任务和空闲任务占用,用户任务的优先级可以选择0~61,数字越低,优先级越高。
(6) 040038trpkfmjwomwf19mh.png
该处4项都与设置就绪表有关,而就绪表中的内容对应着任务的优先级,因此,这4项都是关于优先级的运算。其目的在于提前进行运算,即在任务创建时运行一次,而在任务调度的时候不需要反复进行运算,以节省时间,含义如表所示:
参数
含义
OSTCBY
任务优先级右移3位,相当于优先级除以8
OSTCBBitY
任务在优先级组表中的位置
OSTCBX
任务优先级低3
OSTCBBitX
任务优先级在对应的任务就绪表中的位置


积分规则
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2019-10-17 18:19 , Processed in 0.070138 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表