请选择 进入手机版 | 继续访问电脑版

EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 584|回复: 0

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

[复制链接]

9

主题

0

回帖

51

E币

技术员

Rank: 2

积分
18
发表于 2019-9-17 08:32:49 | 显示全部楼层 |阅读模式

操作系统内核运行后,进行一次初始化操作OSInit,对操作系统的重要数据结构如任务控制块、事件控制块、就绪表等进行初始化,并创建两个系统任务(统计任务和空闲任务)。然后创建一个TaskStart任务,该任务用于设置时钟中断服务程序,接着调用OSStart启动多任务,开始真正多任务的执行。

在操作系统初始化OSInit执行之后,用户可以调用OSTaskCreate或OSTaskCreateExt来创建用户任务。因为这两个函数是内核用于创建任务的,不允许用户进行修改,因此被称为系统服务。用户任务的程序以函数的形式由用户编写,称为用户函数,和操作系统的服务划分了界限。很明显,必须将用户函数的地址传递给创建任务的系统服务。在用户任务中,同样可以调用OSTaskCreate或OSTaskCreateExt创建其他的任务,也可以调用OSTaskDel来删除其他任务或调用请求删除任务的函数提交删除任务的请求,还可以调用OSTaskSuspend来暂时取消任务自己或其他任务的执行。

因为uC/OS-II采用的是抢占式多任务调度算法,因此任务的优先级是至关重要的,是任务的唯一标识,因此各个任务的优先级必须不同。任务的优先级和任务的其他信息,如任务堆栈地址、任务状态、任务等待事件指针、任务延迟时间等信息都保存在一个名为任务控制块(Task Control Block, TCB)的数据结构中。不掌握任务控制块(TCB)就无法研究和掌握任务管理。

除了任务控制块,uC/OS-II中还设计了就绪组和就绪表来标志就绪的任务。就绪的任务可能不止1个,但有一个上限——不能超过63个。任务调度程序(时钟中断服务程序)每隔一段时间会执行一次,具体的时间取决于用户对时钟中断的设置。如果设置为20ms,则每20ms就要执行一次任务调度。就要从就绪表和就绪组中查找优先级最高的就绪任务了。因为是实时性很高的操作系统,不允许查找最高优先级就绪任务时间太长,不能因为任务多查找起来就慢,任务少查找起来就快。实际上uC/OS-II的任务调度时间在一个指定的嵌入式环境下是确定的。为了达到这一点,设计了一个巧妙的数据结构和算法来实现这一过程。

为了根据优先级这一任务的唯一标志来找到任务的各种属性,从而执行不同的处理,设计了任务优先级指针表OSTCBPrioTbl来快速找到任务的控制块。为迅速得到当前任务的控制块,又定义了任务快指针OSTCBCur来指示当前的任务块。

积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-3-29 05:29 , Processed in 0.038224 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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