基于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
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-系统任务
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转而去执行中断服务函数,此时任务的任务状态叫做中断服务态。
1-delay,usart中需要注意的地方?
- delay.c中选取了滴答定时器作为ucosIII的时间基准
- usart中中断服务函数需要ucos进入和退出中断函数
2-任务的三大组成是什么?
3-系统任务有哪些?
3-任务状态有几种?
|