您的位置:首页 > 其它

UCOSIII-任务管理(上)

2015-12-14 20:19 239 查看
基于stm32代码讲解

本文

第一部分:涉及移植后stm32工程中delay.c,usart.c,sys.c 3个源文件中重要的函数说明

第二部分:讲解ucos任务管理的基本概念和相关代码帮助理解,包括-1.任务的组成部分

2.系统任务 3.任务状态 4.任务状态的切换

第三部分:进行总结归纳和反思

第一部分

1-delay.c

采用滴答定时器(硬件定时器)作为UCOS的基准时间

在m3,m4中代码完全一样。在m4权威指南中NVIC和中断一章中Systick有详细讲解滴答定时器

void SysTick_Handler(void)
{
if(delay_osrunning==1) //操作系统正常运行后执行
{
OSIntEnter();       //进入中断
OSTimeTick();       //调用ucos中断服务函数
OSIntExit();        //触发任务切换软中断(进入就绪态)
}
}


delay_init,初始化了ucos的时钟节拍

delay_ms在<=最小周期的时候使用原本的函数-不会引起任务调度,在大于的时候使用ucos自带的函数-会引起任务调度

delay_us不会引起任务调度

2-usart.c

在中断中要使用ucos特定的中断进入和退出函数

void USART1_IRQHandler(void)
{
u8 Res;
#if SYSTEM_SUPPORT_OS
OSIntEnter();       //使用ucos操作系统
#endif
....................//自定义的中断处理
#if SYSTEM_SUPPORT_OS
OSIntExit();        //退出中断(调度优先级最高的任务)
#endif
}


3-sys.c 完全不变

第二部分

1-任务的组成

任务堆栈:上下文切换用于保存任务当前环境。也就是stm32内部寄存器的值。

任务控制块:保存任务的各个属性

任务函数:完成指定功能

1-1三大组成使用部分代码讲解

如下定义了3个组成部分,进行相关定义后即可以作为参数调用OSTaskCreate(…)开启相应任务
//任务优先级
#define TASK1_TASK_PRIO     4
//任务堆栈大小
#define TASK1_STK_SIZE      128
//任务控制块
OS_TCB Task1_TaskTCB;
//任务函数
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);


某个任务代码,调用OSTimeDlyHMSM是使用任务切换的关键
void XXX_task(void *p_arg)
{
while(1)
{
...//任务处理过程
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时一秒
}
}


创建任务代码
//创建task1任务
OSTaskCreate((OS_TCB    * )&Task1_TaskTCB,  //任务控制块
(CPU_CHAR  * )"Task1 task",
(OS_TASK_PTR )task1_task,      //使用任务函数
(void      * )0,
(OS_PRIO     )TASK1_TASK_PRIO, //任务优先级
(CPU_STK   * )&TASK1_TASK_STK[0],//任务堆栈
(CPU_STK_SIZE)TASK1_STK_SIZE/10,
(CPU_STK_SIZE)TASK1_STK_SIZE,
(OS_MSG_QTY  )0,
(OS_TICK     )0,
(void      * )0,
(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR    * )&err);


2-系统任务

UCOSIII默认有5个系统任务:
1、空闲任务:UCOSIII创建的第一个任务,UCOSIII必须创建的任务,此任务有UCOSIII自动创建,不需要用户手动创建。

2、时钟节拍任务:此任务也是必须创建的任务。

3、统计任务:可选任务,用来统计CPU使用率和各个任务的堆栈使用量。此任务是可选任务,由宏OS_CFG_STAT_TASK_EN控制是否使用此任务。

4、定时任务:用来向用户提供定时服务,也是可选任务,由宏OS_CFG_TMR_EN控制是否使用此任务。

5、中断服务管理任务:可选任务,由宏OS_CFG_ISR_POST_DEFERRED_EN控制是否使用此任务。

3-任务状态

从用户的角度看,UCOSIII的任务一共有5种状态:
1、休眠态:任务已经在CPU的flash中了,但是还不受UCOSIII管理。

2、就绪态:系统为任务分配了任务控制块,并且任务已经在就绪表中登记,这时这个任务就具有了运行的条件,此时任务的状态就是就绪态。

3、运行态:任务获得CPU的使用权,正在运行。

4、等待态:正在运行的任务需要等待一段时间,或者等待某个事件,这个任务就进入了等待态,此时系统就会把CPU使用权转交给别的任务。

5、中断服务态:当发送中断,当前正在运行的任务会被挂起,CPU转而去执行中断服务函数,此时任务的任务状态叫做中断服务态。

Summary and Question

1-delay,usart中需要注意的地方?

delay.c中选取了滴答定时器作为ucosIII的时间基准

usart中中断服务函数需要ucos进入和退出中断函数

2-任务的三大组成是什么?

3-系统任务有哪些?

3-任务状态有几种?

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: