第2章us/os0-2中的任务

来源:互联网 发布:linux根目录分配多大 编辑:程序博客网 时间:2024/06/03 19:55

2.1任务的基本概念:实质上是一个线程,us/os-2是对这些任务的运行进行管理的和调度的多任务操作系统。且由三块构成:任务程序代码(执行部分),任务堆栈(任务工作环境),任务控制块(任务属性)。

2.1.1任务的状态:处于5种状态:睡眠状态,就绪状态,运行状态,等待状态,中断服务状态。

2.1.2用户任务代码的一般结构:

(1)任务的执行代码通常是一个无限循环结构,循环中可以响应中断:超循环结构。

(2)拥有受保护的代码段:临界段,介于OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL().

(3)用户任务是一个任务线程,主函数负责创建和启动他们,由操作系统来调度运行他们。

2.1.3系统任务:

(1)空闲任务:为了使CPU在没有用户任务可执行时有时可干。(OSTaskIdle())。不可删除。

(2)统计任务:每秒计算一次CPU在单位时间被使用的时间,以百分比的形式存放在OSC-PUUsage(),是否调用,有用户自定义。

2.1.4任务的优先权和优先级别

(1)有唯一优先级,共64个,系统把最低优先级赋给空闲任务。

(2)用任务的优先级来作为这个任务的标识。

2.2任务堆栈:为了满足任务切换和响应中断时保存CPU寄存器中的内容及存储任务私有数据的需要。

2.2.1任务堆栈的创建:OS_STK

(1)堆栈的增长方向是随系统所使用的处理器不同而不同。

2.2.2任务堆栈的初始化

(1)由操作系统负责。

(2)所需的预设数据由任务堆栈中获得。

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

(1)记录任务的堆栈指针,任务的当前状态,任务的优先级等相关属性。

(2)任务控制块相当于下一个任务的身份证。

(3)Uc/os-2把系统所有任务的控制块链接为两条链表,并通过这两条链表管理任务控制块,通过任务控制块来对任务进行相关的操作。

2.3.1任务控制块的结构

(1)任务控制块是一个结构类型数据。有点像构造函数,赋予初值,并驻留在RAM中。

2.3.2任务控制块链表:

(1)Uc/os-2用两条链表来管理任务控制块。一条空任务块链表,一条任务块链表,删除就是把任务放进空任务链表。主体是任务块链表。

2.3.3任务控制块的初始化

(1)给用户任务分配任务控制块及对其进行初始化也是操作系统的职责。

2.4任务就绪表及任务的调度

2.4.1任务就绪表的结构

(1)任务调度依据是任务就绪表。

(2)OSRdyTbl【】数组的一个元素可表达8个任务的就绪状态。

2.4.2对任务就绪表的操作

2.4.3任务的调度

(1)CPU终止当前运行的任务而去运行另一个任务的工作叫做任务的切换,按某种规则进行任务切换的工作叫做任务的调度。

(2)由任务调度器来完成的。

(3)获得带运行就绪任务控制块的指针

(4)任务切换宏OS_TASK_SW()

2.5任务的创建:创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。

2.5.1用函数OSTaskCreat()创建任务

(1)函数对待创建任务的优先级进行判断,合法后,对任务堆栈和任务控制块进行初始化,成功后把任务计数器+1,而后如果运行状态为1,进行任务调度。

(2)根据情况返回初始化失败的信息。

2.5.2OSTaskCreatExt()创建任务

(1)更灵活,但会增加额外的开销。

2.5.3创建任务的一般方法

(1)任务可在调用任务OSStart()启动任务调度之前来创建,也可以在任务中来创建。

(2)调用前,必须已经创建了至少一个任务,并拥有最高的优先级。

2.6任务的挂起和恢复:挂起就是停止这个任务的运行,恢复,恢复为就绪状态。

2.6.1挂起任务

(1)判断待挂起是否是自身

(2)是,删除任务在任务就绪表中的就绪标志,并引发一次任务的调度,使cpu去运行就绪的其他任务。

(3)否删除任务就绪表中被挂起任务的就绪标志,并作挂起记录。

2.6.2恢复任务

(1)判断任务确实是一个已存在的挂起任务,同时它又是一个等待任务,清除挂起记录并使任务就绪,进行任务调度。

2.7其他任务管理函数

2.7.1任务优先级别的修改

(1)OSTaskChangePrio()来修改优先级。

2.7.2任务的删除

(1)置于睡眠状态,把被删除任务的任务控制块从任务控制块链表中删除,归还空任务控制链表,在任务就绪表中置为0

(2)重要的是要删除占用的内存或信息量。

(3)未删除时调用延时函数,直到删除。

2.7.3查询任务的信息

(1)OSTaskQuery()来获取任务信息。

2.8uc/os-2的初始化和任务的启动

2.8.1 uc/os-2的初始化

(1)调用OSInit()对uc/os-2自身的环境进行初始化。以及全局变量和数据结构,同时创建空闲任务OSTaskIdle()【最低优先级和永远就绪状态】。

(2)主要创建包括空任务控制链表在内的5个空数据缓冲区。

(3)存放任务优先级的数组。

2.8.2 uc/os-2的启动

(1)调用OSStart()之后,进入多任务管理阶段。

(2)OSStartHighRdy()被OSStart()调用,实现将就绪表中的最高优先级任务的堆栈指针加载到SP中,强制中断返回。

0 0
原创粉丝点击