首页 > 技术文章 > 任哲<<μC/OS>>

chulin 2018-05-15 16:13 原文

从第二章开始啦:

 

 

 

 

程序控制块(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 : 用来存放任务的当前状态,该变量的值可以为:

 

推荐阅读