u/osⅡ操作系统读书笔记

来源:互联网 发布:杭州远方光电知乎 编辑:程序博客网 时间:2024/05/17 03:24

2.2任务堆栈

2.2.1 任务堆栈的创建

 

 

2.2.2任务堆栈的初始化

CPU启动运行一个任务时,CPU的各寄存器需要预置一些初始数据,例如指向任务的指针、程序状态字PSW等。CPU可以从任务堆栈中获得这些数据。

 

 

2.3任务控制块及任务控制块链表

 

2.3.1任务控制块的结构

任务控制块是一个结构类型数据

 

2.3.2任务控制块链表

μCOS Ⅱ用两条链表来管理任务控制块。一条是空任任务链表,另一条是任务块链表。

系统在调用函数OSInit()对μCOSⅡ系统进行初始化时,现在RAM中建立一个OS_TCB结构类型的数组OSTCBTBl[],这样每个数组元素就是一个任务控制块,由于链表中的这些控制块还没有与具体任务相关联,所以叫空任务链表。

 

2.3.3 任务控制块的初始化

当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块来进行初始化。

 

2.4 任务就绪表及任务调度

2.4.1任务就绪表的结构

μCOS Ⅱ进行任务调度的依据就是任务就绪表。

从任务的状态转换图可以看到,系统总是从处于就绪的任务中选择一个任务来运行。

 

2.4.2对任务就绪表的操作

在程序中,可用类似于下面的代码把优先级别为prio的任务置为就绪状态。

OSRdGrp |= OSMapTbl[prio>>3];

OSRdyTbl[prio>>3] |= OSMapTbl[prio & 0x07];

 

如果要使一个优先级别为prio的任务脱离就绪状态,则可以使用如下代码:

If((OSRdyTbl[prio>>3] &= -OSMapTbl[prio&0x07])== 0)

     OSRdyGrp &= -OSMapTbl[prio>>3];

 

2.4.3 任务的调度

  在多任务系统中,令CPU中止当前正在运行的任务转而去运行另一个任务的工作叫做任务切换,而按某种规则进行任务切换的工作叫做任务的调度。

任务的调度有两个步骤:

1. 获得待运行就绪任务控制块的指针

2. 任务切换宏OS_TASK_SW()

OS_TASK_SW()要做七项任务:

1. 把被中止任务的断电指针保存在任务堆栈里;

2. CPU通用寄存器的内容保存到任务堆栈里;

3. 把被中止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPtr中;

4. 获得待运行任务的任务控制块;

5. CPU通过任务控制块获得待运行任务的任务堆栈指针;

6. 把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器;

7. 使CPU获得待运行任务的断电指针(该指针是待运行任务在上一次被调度器中止运行时保留在任务堆栈中的)。

 

2.5 任务的创建

创建任务工作的实质是创建一个任务控制块。

 

2.5.1 用函数OSTaskCreate()创建任务

 

2.5.2 用函数OSTaskCreateExt()创建 任务

创建任务更灵活,但也会增加一些额外的开销

2.5.3 创建任务的一般方法

一般来说,任务可在调用函数OSStart()启动任务调度之前创建,也可以在任务中创建。

2.6 任务的挂起和恢复

所谓挂起一个任务就是停止这个任务

 

2.6.1 挂起任务

挂起任务函数OSTaskSuspend()任务要挂起自身,则参数必须为常数OS_PRIO_SELF(该常数在文件ucosH 中被定义为0xFF)

2.6.2 恢复任务

恢复任务函数原型如下:

INTBU OSTaskResume INTBU PRIO;

 

2.7 其他任务管理函数

2.7.1 任务优先级别的修改

每个任务都必须有一个优先级别,但这个优先级别并不是一成不变。可以通过OSTaskChangePrio()来改变任务的优先级别

 

2.7.2 任务的删除

所谓删除一个任务,就是把该任务置于休眠状态。是把被删除任务的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表,然后在任务就绪表中把该任务的就绪状态位置0,于是该任务就不能再被调度器调用了。

       

2.7.3 查询任务的信息

应用程序运行中需要了解一个任务的指针、堆栈等信息。可以通过函数OSTaskQuery()来获取选定的任务的信息。

 

2.8 uc os Ⅱ的初始化和任务的启动

2.8.1 uc os Ⅱ的初始化

在使用uc os Ⅱ的所有服务之前,必须调用uc osⅡ的初始化函数OSInit(),uc osⅡ自身的运行环境进行初始化

2.8.2 uc os Ⅱ的启动

              uc os Ⅱ进行任务的管理是从调用启动函数OSStart()开始的。

2.9 示例   

 

2.10小结

任务由任务控制块、任务堆栈和任务代码三部分组成,系统通过任务控制块来感知和控制任务;任务堆栈主要用来保护断点和恢复断电;任务代码是一个超循环结构,它描述了任务的执行过程。

 

任务切换的核心是任务堆栈指针的切换。

 

       任务的优先级别也是任务的标识

0 0
原创粉丝点击