UCOSIII-任务管理(上)
2015-12-14 20:19
239 查看
基于stm32代码讲解
本文
第一部分:涉及移植后stm32工程中delay.c,usart.c,sys.c 3个源文件中重要的函数说明
第二部分:讲解ucos任务管理的基本概念和相关代码帮助理解,包括-1.任务的组成部分
2.系统任务 3.任务状态 4.任务状态的切换
第三部分:进行总结归纳和反思
在m3,m4中代码完全一样。在m4权威指南中NVIC和中断一章中Systick有详细讲解滴答定时器
delay_init,初始化了ucos的时钟节拍
delay_ms在<=最小周期的时候使用原本的函数-不会引起任务调度,在大于的时候使用ucos自带的函数-会引起任务调度
delay_us不会引起任务调度
任务控制块:保存任务的各个属性
任务函数:完成指定功能
1、空闲任务:UCOSIII创建的第一个任务,UCOSIII必须创建的任务,此任务有UCOSIII自动创建,不需要用户手动创建。
2、时钟节拍任务:此任务也是必须创建的任务。
3、统计任务:可选任务,用来统计CPU使用率和各个任务的堆栈使用量。此任务是可选任务,由宏OS_CFG_STAT_TASK_EN控制是否使用此任务。
4、定时任务:用来向用户提供定时服务,也是可选任务,由宏OS_CFG_TMR_EN控制是否使用此任务。
5、中断服务管理任务:可选任务,由宏OS_CFG_ISR_POST_DEFERRED_EN控制是否使用此任务。
1、休眠态:任务已经在CPU的flash中了,但是还不受UCOSIII管理。
2、就绪态:系统为任务分配了任务控制块,并且任务已经在就绪表中登记,这时这个任务就具有了运行的条件,此时任务的状态就是就绪态。
3、运行态:任务获得CPU的使用权,正在运行。
4、等待态:正在运行的任务需要等待一段时间,或者等待某个事件,这个任务就进入了等待态,此时系统就会把CPU使用权转交给别的任务。
5、中断服务态:当发送中断,当前正在运行的任务会被挂起,CPU转而去执行中断服务函数,此时任务的任务状态叫做中断服务态。
usart中中断服务函数需要ucos进入和退出中断函数
本文
第一部分:涉及移植后stm32工程中delay.c,usart.c,sys.c 3个源文件中重要的函数说明
第二部分:讲解ucos任务管理的基本概念和相关代码帮助理解,包括-1.任务的组成部分
2.系统任务 3.任务状态 4.任务状态的切换
第三部分:进行总结归纳和反思
第一部分 |
1-delay.c
采用滴答定时器(硬件定时器)作为UCOS的基准时间 |
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个系统任务: |
2、时钟节拍任务:此任务也是必须创建的任务。
3、统计任务:可选任务,用来统计CPU使用率和各个任务的堆栈使用量。此任务是可选任务,由宏OS_CFG_STAT_TASK_EN控制是否使用此任务。
4、定时任务:用来向用户提供定时服务,也是可选任务,由宏OS_CFG_TMR_EN控制是否使用此任务。
5、中断服务管理任务:可选任务,由宏OS_CFG_ISR_POST_DEFERRED_EN控制是否使用此任务。
3-任务状态
从用户的角度看,UCOSIII的任务一共有5种状态: |
2、就绪态:系统为任务分配了任务控制块,并且任务已经在就绪表中登记,这时这个任务就具有了运行的条件,此时任务的状态就是就绪态。
3、运行态:任务获得CPU的使用权,正在运行。
4、等待态:正在运行的任务需要等待一段时间,或者等待某个事件,这个任务就进入了等待态,此时系统就会把CPU使用权转交给别的任务。
5、中断服务态:当发送中断,当前正在运行的任务会被挂起,CPU转而去执行中断服务函数,此时任务的任务状态叫做中断服务态。
Summary and Question |
1-delay,usart中需要注意的地方?
delay.c中选取了滴答定时器作为ucosIII的时间基准usart中中断服务函数需要ucos进入和退出中断函数
2-任务的三大组成是什么?
3-系统任务有哪些?
3-任务状态有几种?
相关文章推荐
- 分类与回归的区别
- Scala代码实现列出Hadoop 文件夹下面的所有文件
- mac下配置matplotlib绘图
- Codeforces Round #335 (Div. 2) B
- 万年历
- poj1759
- java集合框架——接口图+类图+遗留类图
- 散列表(哈希表)之链接法浅谈
- SAP MM01 创建物料主数据 [关注公众号后回复MM01获取更多资料]
- localhost无法登录
- 统计学
- Spectral Clustering Algorithm
- linux工作常用命令
- 统计学
- cocos2dx luabinging
- 【转载】汇总:LDA理论、变形、优化、应用、工具库
- [Leetcode]Rectangle Area
- 文哲201512
- Mybatis前奏【Java Web 开发进化史】——万丈高楼从JDBC开始
- Android使用 LruCache 缓存图片