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用两条链表来管理任务控制块。一条是空任务块链表(其中所有任务控制块还没有分配任务),另一条是任务块链表(其中所有任务控制块已经分配任务)。空任务块链表是一个调用初始化函数时建立的,任务块链表是调用函数创建任务时建立的。建立任务控制块链表时,从空任务控制块链表摘取一个空任务控制块链表,然后填充属性形成新的链表。
- uC/OS-ll 任务、任务控制块、任务控制链表
- 3、uc/os:任务控制块OS_TCB
- UC/OS基础知识之任务控制块
- uC/OS-II 学习笔记:任务控制块ECB
- uC/OS-ii内核理解(四)TCB任务控制块
- UC/OS II任务管理(1)之任务控制块
- μC/OS-Ⅱ任务控制块
- ucos 任务控制块及任务链表
- 任务控制块及其链表
- 任务控制块
- 任务控制块
- 任务控制块
- 任务控制块
- 任务控制块
- 任务控制块
- 任务控制块
- uC/OS-ll 第二讲_任务就绪表 任务调度器
- μC/OS-Ⅱ之任务控制块、任务就绪表
- 设计型软件无线电教学平台—USDR-2x
- 核心DOM编程
- Android状态栏微技巧,带你真正理解沉浸式模式
- 正则表达式
- 算术表达式的转换
- uC/OS-ll 任务、任务控制块、任务控制链表
- java 竖线分割字符串的问题
- C/C++复习(4):运算符
- Vijos P1464 积木游戏(动态规划)
- codeblock 结合 ofxFaceTracker 人脸识别
- Servlet含义与工作原理
- EPPlus 读写 Excel 资料收集
- 地杰斯特拉算法
- leetcode_c++:树:Balanced Binary Tree(110)