任哲<<μC/OS>>
从第二章开始啦:
程序控制块(TCB) 重要概念 相当于对应程序块的学生证,学号,,,
上面的图是一个简单的程序控制块,还会有复杂的程序控制块,也许是嵌套的两级的:
链表就相当于老师手中的花名册,,把学号一个一个排起来
位图有很多作用,,,相当于座位,座位上没有人就是0,座位上有人就是1,,,,,,也就是用位图可以查询某个外设是否被占用.
相当于考勤表..
////////////////////////////////////////////
第三章
任务的组成: 任务程序代码; 任务堆栈 ; 任务控制块;
任务程序代码,就是函数,是任务的执行部分.
任务堆栈,保存任务的运行环境.
任务控制块,里面包含了任务的属性,是任务的'学生号'
该看一下微机原理,补一下pc是什么??
任务的状态:
OS_ENTER_CRITICAL() 关中断 ,是宏
OS_EXIT_CRITICAL() 开中断 ,是一个宏定义
OSTaskCreate() :是μC/OS提供用来创建任务的函数
OSStart() :启动μC/OS的函数 , 系统启动后,任务就由操作系统来管理和调度了.
两个系统任务: 空闲任务,统计任务
空闲任务 OSTaskIdle() 必须有,而且不能用程序删除
//看到了任务堆栈的建立
OS_CPU.H 中专门定义了一个数据类型OS_STK :
typedef unsigned int OS_STK; //该类型长度为16位
这样,在定义任务堆栈的栈区时,只要定义一个OS_STK类型的数组即可,
#define TASK_STK_SIZE 512 . //定义堆栈的长度
OS STK TaskStk[TASK_STK_SIZE]; //定义一个数组来作为任务堆栈
创建任务函数原型
INT8U OSTaskCreate(
void (*task)(void *pd), //指向任务的指针
void *pdata, //传递给任务的参数
OS_STK * ptos,//任务堆栈栈顶的指针
INT8U prio //指定任务优先级别的参数
);
例: 创建一个任务,任务堆栈长度为128字节,优先级为20,任务参数pdata的实参为MyTaskAgu
答:
#define MyTaskStkN 64
OS_STK MyTaskStk[MyTaskStkN]
void main (void)
{
......
OSTaskCreate(
MyTask, //任务的指针
&MyTaskAgu,//传递给任务的参数
&MyTaskStk[MyTaskStkN-1], //任务堆栈栈顶地址
20 //任务的优先级别
)
}
OS_STK_GROWTH //用来决定堆栈的增长方向.
STM32的栈,是向下生长的.事实上,一般CPU的栈增长方向,都是向下的.
也就是越增长,越大
那么stm32单片机应该把这个参数定为0
3.2.2
任务堆栈
任务堆栈初始化函数:
OS_STK *OSTaskStkInit (
void (*task)(void *pd),
void *pdato,
OS_STK *ptos
INT16U opt
) ;
上面函数主要是有任务创建函数来调用:OSTaskCreate()
3.3 任务控制块及其链表
任务控制块是任务的学生证
学生证上面记录了一些信息: 优先级别;任务的堆栈指针;任务的当前状态;
任务控制块结构定义如下:
Task Control Block (TCB)
//以上黑体,表示常用的
SOTCBStat : 用来存放任务的当前状态,该变量的值可以为: