说明:本文只是简单地介绍任务管理部分,有错误的地方,不吝赐教。源码已上传,可用sourceInSight等工具查看。
学习内容
-
一、执行代码
-
二、任务私有栈
-
三、任务控制块
-
四、任务就绪表
- 入表
- 出表
- 查表
ucosii的任务调度
首先我们得知道ucosii中一个任务的三要素:代码,任务私有栈,任务控制块;
代码:就是任务要执行操作的代码,我们会有一个指针指向代码地址,这个指针其实就是任务函数的名字,用于pc指向;
任务私有栈:是存储任务相关的信息,比如上述执行代码的地址;相当于一个虚处理器,当我们cpu需要运行这个任务时,将任务私有栈中的信息出栈,一一对应cpu所需的信息;就是任务私有栈都整理好了;
任务控制块:任务的身份证,内容包括任务私有栈的栈顶指针,优先级,当前处于什么状态(就绪状态,等待状态等等);
了解了一个任务的基本内容后,下面我们结合代码学习,源码我已上传,关注我下载。
一.任务创建函数OSTaskCreate
我们通过调用这个函数创建任务,从参数中我们可以看到*task是代码地址,就是第一部分的执行代码;第二个pdata是任务代码中需要的参数,了解就好;第三个是栈顶指针,栈顶指针一开始指向的是分配好的栈的栈底,因为开始什么内容都没有,比如大小是512,如果是数组作为数据结构,栈顶指针就指向a[511];最后就是分配的优先级,记住,优先级即是id(唯一),数值越小,优先级越高。
二.任务私有栈初始化OSTaskStkInit
由OSTaskCreate调用
我们看看函数内容:
OS_STK *OSTaskStkInit(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt; /* 'opt' 没有使用, 预防警告错误 */
stk = ptos; /* 加载堆栈指针 */
*(stk) = (