uC/OS-ll 任务、任务控制块、任务控制链表

来源:互联网 发布:淘宝要怎么成旗舰店 编辑:程序博客网 时间:2024/05/19 15:42

第二章

2.1任务(又称为线程)

组成部分:任务程序代码 任务堆栈 任务控制块

分类:用户任务(解决应用问题)、系统任务(为应用程序提供服务)

Uc/OS-ll在管理任务时将每个任务作为一个节点,链接成任务链表,最多可对64个任务进行管理。

状态:典型地、每个任务都是一个无限的循环。每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态

 

任务代码的一般结构:执行代码是一个无限循环结构,可以响应中断,称为超循环结构。

例1、  void mytask(void *pdata)

{

     For(;;)

{

    可以被中断的用户代码;

    OS_ENTER_CRITICAL( );  //进入临界段(关中断)

   不可以被中断的用户代码;

    OS_EXIT_CRITICAL( ); //退出临界段(开中断)

    可以被中断的用户代码;

}

}

从代码中我们可以看出,这是一个完全符合C语言特点的函数,为了对中断进行控制,我们用OS_ENTER_CRITICAL( ),OS_EXIT_CRITICAL( )这两个宏来控制,这两个宏之间的代码不响应中断,称为临界段。

 

用户应用程序的一般结构:是一个线程,不被主函数或者其他函数调用,主函数只负责创建和启动他们,由操作系统来负责调度他们。

 

系统任务:分为空闲任务和统计任务

空闲任务:每个应用程序必须使用

在多任务系统运行时,系统会在某个时间内无用户任务可运行而处于空闲状态,这时候UC/OS-II提供了空闲任务。

统计任务:应用程序根据实际需求来选择使用

UC/OS-II提供的系统任务是统计任务OSTaskStat(),这个统计任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量中便于访问。

 

任务的优先权及优先级别

UC/OS-II将任务的优先级分为64个优先级别,每个级别用数字表示,0表示任务的优先级别最高,数字越大则表示任务的优先级别越低。

用户可以根据应用程序的需要,通过给最低优先级别的常数OS_LOWEST_PRIO赋值的方法说明应用程序中任务优先级别的数目。固定地,系统总是把最低优先级别自动赋给空闲任务,如果应用程序中还使用了统计任务,系统就会把优先级别OS_LOWEST_PRIO-1自动赋给统计任务。

 

2.2任务堆栈

定义:在存储器中数据按照“后进先出”的原则组织的连续存储空间。

 

任务栈堆的创建

例1:创建一个任务,要求栈堆的长度为128字节,任务优先级别为20,任务参数pdata的实参为MyTaskAgu。试写出需要的代码。

#define MyTaskStkN  64       //定义栈堆的长度(128字节)

OS_STK MyTaskStk[MyTaskStk]; //定义一个数组来作为任务栈堆

 

void main(void)

{

      ……

   #if OS_STK_GROWTH == 1                //如果为增长方向为向下的栈堆

      OSTaskCreat(

                 MyTask,                  //任务的指针

                 &MyTaskAgu,              //传递给任务的参数

                 &MyTaskStk[MyTaskStkN-1],//任务栈堆栈顶的地址

                 20                        //任务的优先级别

);

#else                               //如果为增长方向为向上的栈堆

   OSTaskCreat(

              MyTask,               //任务的指针

                &MyTaskAgu,            //传递给任务的参数

                &MyTaskStk[0],        //任务栈堆栈顶的地址

                 20                    //任务的优先级别

);

 

    #endif

       ……

}

 

在编写该代码时我们需要注意的是,栈堆的增长的方向是由系统所使用的处理器决定的。栈堆分为向下增长型和向上增长型,为了提高应用程序的可移植性,我们在编写的时候需要把两种情况都编写出来,让用户通过选择开关来选择相应的代码。

 

任务栈堆的初始化         

当CPU启动运行一个任务时,CPU的各个寄存器需要预设一些初始数据。在系统启动任务的时候,CPU就会从任务栈堆里面获取这些初始数据。

UC/OS-II在创建任务函数中通过调用任务栈堆初始化函数OSTaskStkInit()来完成任务栈堆初始化工作。

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

任务控制块的定义:用来记录任务的栈堆指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性的表叫做任务管理快(OS_TCB)。

由定义我们知道,我们可以通过任务控制块将任务代码、任务栈堆进行关联,使这三者成为一个整体。系统可以通过任务控制块来管理任务。

 

任务控制块是一个结构类型数据(个人理解跟C语言中结构体差不多),定义的

存储在RAM中。

 

任务控制块链表就是把所有任务的控制块链接为两条链表,通过链表管理各任务控制块,进而再通过任务控制块来对任务进行相关操作。

 

UC/OS-ll用两条链表来管理任务控制块。一条是空任务块链表(其中所有任务控制块还没有分配任务),另一条是任务块链表(其中所有任务控制块已经分配任务)。空任务块链表是一个调用初始化函数时建立的,任务块链表是调用函数创建任务时建立的。建立任务控制块链表时,从空任务控制块链表摘取一个空任务控制块链表,然后填充属性形成新的链表。

 

 

 

0 0
原创粉丝点击