uc/OS-II操作系统:uc/OS中的任务_上(如不懂——>请收下我的膝盖)

uc/OS中任务的学习目录

注:本章未写完的在后面章节会继续书写

1)任务的基本概念
(2)任务堆栈
(3)任务控制块及任务控制块链表
(4)任务就绪表及任务调度
(5)任务的创建
(6)任务的挂起和恢复
(7)其他任务管理函数
(8)uC/OS-II的初始化和任务的启动

涉及到的基本问题:

1)任务的特性
(2)任务的划分目标
(3)任务的划分方法
(4)任务的可调度性分析
(5)任务的执行分类和优先级安排
(6)任务设计中的问题
(7)系统设计编码实现过程
(8)中断服务程序的设计

一、任务的基本概念

1)复杂问题 “分而治之” 的问题解题思路。
(2)针对目标系统拆分后的 “小且易” 的问题的具体处理方法编码和数据结构 ---- 任务。

uC/OS-II的两种任务:

系统任务、用户任务。

任务的组成:

任务控制块 ---- uC/OS-II进行任务管理用的一个数据结构。
任务代码 ---- 描述任务算法的程序编码。
任务堆栈 ---- 任务的工作现场环境。

任务的组成如下图:
在这里插入图片描述

1、任务的五种状态
Sleep ---- 仅有编码未激活。
Ready ---- 已激活并“万事俱备,只欠调度”
Running ---- 正占用 CPU 运行自己。
Wait ---- 等待某事件发生。
ISR_Sta ---- Running状态的任务被中断后进入的状态。

在这里插入图片描述

2、用户任务代码的一般结构
void MyTask(void *pdata)
{
    
       ……                     // 任务的初始化
    for ( ;  ; )		//超循环构成任务体 
   {
    
    
    可被中断的用户代码片断;
    OS_ENTER_CRITICAL();       //进入临界区(关中断)
    不可被中断的用户代码片断;
    OS_EXIT_CRITICAL();           //退出临界区(开中断)
    可被中断的用户代码片断;
    }
}
3、用户应用程序的一般结构
注意:
(1)“用户任务” 代码形式上很像 C函数,但他不是函数!
(2)“任务” 不能被主函数 main( ) 或其他函数调用,只能被主函数或已激活任务创建。
(3)任务的运行由操作系统调度管理。

用户应用程序代码如下:

void MyTask1(void *pdata)
{
    
       … …  }
void MyTask2(void *pdata)
{
    
       … …  }
void main( )
{
    
    
    … …
    OSInit( );
    … …
    OSTaskCreate( MyTask1,… … );
    OSTaskCreate( MyTask2,… … );
    … …
    OSStart( );
    … …
}
4、应用程序的函数原型
OSInit( ) 函数原型:   void  OSInit( void )
OSStar( ) 函数原型:   void  OSStart( void )
OSTaskCreate( ) 函数原型:
INT8U  OSTaskCreate(
			 void (*task)(void *pd) , //指向任务的指针
             void *pdata ,	         //传递给任务的参数
             OS_STK *ptos , 	     //任务堆栈栈顶的指针
             INT8U prio 		     //任务的优先级别
    			  )

(1)OSTaskCreate( ) 函数使用举例

》定义任务  task_A
void  task_A(void* pdata)
{
    
    
    ……;          //任务初始化部分
    while (1)
    {
    
    
        ……;     //任务功能代码
    }
}

》在系统 “创建” 任务  task_A
void main(void)
{
    
    
    OSInit();    //系统初始化部分
    ……
    OSTaskCreate( task_A, 
    			  void * 0, 
                  &MystackTop,
                  8
                );
    OSStart();
}
5、系统任务
统计任务(OSTaskStat( ))使用说明:
  1、功能完成用户任务 CPU 使用率的统计,结果以百分比的形式存放在变量 OSCPUsage中。
  2、该任务用户可选择使用。OS_CFG.H文件中的常数OS_TASK_STAT_EN 设置为1,使能该函数。 
  3、用户在OS_CFG.H中使能该任务后,系统自动创建该任务,但在用户使用统计数据前必须调用系统函数OSStatInit() 先进行初始化。
  4、该任务固定拥有次末任务优先级。
6、任务的优先权和优先级别
uC/OS-II 的每个任务都必须有唯一的优先级。
uC/OS-II 最多可以管理64个优先级别分配给64个任务。
uC/OS-II 中用一个8b的整型数来表示优先级别,数字越小,优先级越高,prio = 0 的任务优先级最高。
uC/OS-II 中使用任务的优先级(prio)作为任务句柄。
用户通过修改 OS_CFG.H 中的宏定义常数 OS_LOWEST_PRIO 的值,约定本用户系统的最大优先级数。

二、任务堆栈

堆栈 ---- LIFO访问原则组织的连续存储器。
任务堆栈在 uC/OS-II 中的应用:

1)任务堆栈是任务的三大组成部分之一。
(2)保存 CPU 寄存器现场(R0~R12、LR、SPSR 等)。
(3)本Task 的私有数据。
1、任务堆栈的创建
举例:
#define   MyTaskStkSize   64
OS_STK    MyTaskStk[ MyTaskStkSize ]   //在 OS_CPU.H中定义 OS_STK
… …					// typedef   INT32U  OS_STK
INT8U  OSTaskCreate(
		 void (*task) (void *pd),   //指向任务的指针
		 void * pdata,	            //传递给任务的参数
		 MyTaskStk[ MyTaskStkSize -1 ]    //任务堆栈栈顶的指针
		 INT8U prio	            //任务的优先级别
		        )
2、任务堆栈的使用注意事项 __ 存在两种堆栈形式
1)递减堆栈 ---- 进栈操作向小地址方向发展。
OSTaskCreate(
	… …
	&MyTaskStk[StkSize - 1],
	… …
	    )2)递增堆栈 ---- 进栈操作向大地址方向发展。
OSTaskCreate(
	… …
	&MyTaskStk[ 0 ],
	… …
	    )
备注:
    利用条件编译技术和 OS_CPU.H 中的宏定义常数OS_STK_GROWTH 编写易移植用户系统;“1--- 递减堆栈 for ARM CPU。

三、任务控制块及任务控制块链表

1、任务控制块(TCB)---- 任务在系统中的身份证
1)TCB ---- uC/OS-II 中用于记录任务信息(任务堆栈指针、任务当前状态、任务优先级别等)的数据结构。
(2)uC/OS-II 将系统中的所有 TCB 构成两个链表(OSTCBList、OSTCBFreeList)进行任务管理。
》空任务控制块链表 ---- 未被分配的 TCB 链 OSTCBFreeList。
》任务控制块链表 ---- 已分配的 TCB 链 OSTCBList。
2、任务控制块(TCB)的结构
任务控制块结构的主要成员:
typedef struct os_tcb {
    
    
    struct  os_tcb *OSTCBNext;  //指向下一个TCB的指针
    struct  os_tcb *OSTCBPrev;  //指向前一个TCB的指针
    OS_STK  *OSTCBStkPtr;       //指向任务堆栈栈顶的指针
    ……
    INT16U  OSTCBDly;           //任务等待时间
    INT8U   OSTCBStat;	        //任务的当前状态标志
    INT8U   OSTCBPrio;          //任务的优先级别 
    ……
} OS_TCB;
3、任务控制块链表
1)当进行系统初始化时,初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表。
(2)由于这些任务控制块还没有对应的任务,故这个链表叫做空任务块链表。即相当于是一些空白的身份证。

在这里插入图片描述
在这里插入图片描述

uC/OS-II 中提供了系统函数 OSTaskDel( ),用于删除一个任务 ---- 实质就是将该任务的TCB从“任务控制块列表” 移到了“空任务控制块列表” 。 
《任务控制块》就相当于是一个任务的身份证,没有任务控制块的任务是不能被系统承认和管理。 
4、任务控制块链表其他相关系统管理变量
OSTCBPrioTbl[ ] :OS_TCB* 数据类型的数组,以 Prio 为下标存放已使能的 TCB 指针。用于加速 TCB 的访问。
OSTCBCur:全局系统变量,指向当前正在运行的任务的 TCB 。

相关代码如下:

OSTCBFreeList、OSTCBList
OSTCBTbl[ ] ---- OSInit()建立的任务控制块数组
OSTCBPrioTbl[ ] ---- 任务控制块优先级数组
OSTCBCur

四、本章《任务_上》已经完结,《任务_下》会在后面继续更新

猜你喜欢

转载自blog.csdn.net/Mr_zhang1911116/article/details/123493509