文章目录
- 前言
- 一、任务的基本概念
- 二、操作系统的初始化与启动
- 1.操作系统初始化,初始化各种内核对象和全局变量......
- 2.启动操作系统,创建任务后调用
- 三、任务的管理
- 1、任务状态
- 2、创建任务
- 3、任务挂起
- 4、任务恢复执行
- 5、任务的删除
- 四、内核调度点
- 总结
前言
UCOSIII实时操作系统------任务管理
提示:以下是本篇文章正文内容,下面案例可供参考
一、任务的基本概念
在UCOSIII中任务就是程序实体,UCOSIII能够管理和调度这些小任务(程序)。
UCOSIII中的任务由三部分组成:任务堆栈、任务控制块和任务函数。
任务堆栈:上下文切换的时候用来保存任务的工作环境,就是STM32的内部寄存器值(r0~r15、xpsr)。
任务控制块:任务控制块用来记录任务的各个属性。
任务函数:由用户编写的任务处理代码,是实实在在干活的。
UCOSIII中的任务函数模板:
void xxx_task(void *p_arg)
{
while(1)
{
........
}
}
可以看出任务函数通常是一个无限循环,当然了,也可以是一个只执行一次的任务。任务的参数是一个void类型的,这么做的目的是可以传递不同类型的数据甚至是函数。
可以看出任务函数其实就是一个C语言的函数,但是在使用UCOIII的情况下这个函数不能由用户自行调用,任务函数何时执行,何时停止完全由操作系统来控制。
二、操作系统的初始化与启动
1.操作系统初始化,初始化各种内核对象和全局变量…
它是第一个执行的函数。
void OSInit (OS_ERR *p_err)
参数:
p_err,返回错误码
返回值:无
......
OS_SemInit(p_err);
OS_TaskInit(p_err);
OS_IntQTaskInit(p_err);
OS_IdleTaskInit(p_err);
OS_TickTaskInit(p_err);
......
2.启动操作系统,创建任务后调用
代码如下(示例):
void OSStart (OS_ERR *p_err)
参数:
p_err,返回错误码
三、任务的管理
1、任务状态
从用户的角度看,UCOSIII的任务一共有5种状态:
休眠态:任务已经在内部FLASH中了,但是还不受UCOSIII管理。
就绪态:系统为任务分配了任务控制块,并且任务已经在就绪表中登记,这时该任务就具有了运行的条件,此时任务的状态就是就绪态。
运行态:任务获得CPU的使用权,正在运行。
等待态:正在运行的任务需要等待一段时间,或者等待某个事件,这个任务就进入了等待态,此时系统就会把CPU使用权转交给别的任务。
中断服务态:当发送中断,当前正在运行的任务会被挂起,CPU转而去执行中断服务函数,此时任务的任务状态叫做中断服务态。
注:
若当前的任务使用了调度器上锁时,一旦中断发生并中断服务程序结束后,总是会返回被打断的任务中去
2、创建任务
代码如下:
void OSTaskCreate (OS_TCB *p_tcb,
CPU_CHAR *p_name,
OS_TASK_PTR p_task,
void *p_arg,
OS_PRIO prio,
CPU_STK *p_stk_base,
CPU_STK_SIZE stk_limit,
CPU_STK_SIZE stk_size,
OS_MSG_QTY q_size,
OS_TICK time_quanta,
void *p_ext,
OS_OPT opt,
OS_ERR *p_err)
参数:
p_tcb,类似于线程id,控制任务
p_name,任务的名字,自定义
p_task,类似于线程函数,任务函数
p_arg,类似于线程参数传递,任务参数传递
prio,任务的优先级
p_stk_base,任务栈的基址,提供一个数组基址
stk_limit,腾出10%的栈空间给到堆栈检测函数使用,反过来说,当前任务只能使用90%栈空间
stk_size,任务栈的大小,以字(32bit)为单位
q_size,任务内消息队列的大小,若不使用,写0
time_quanta,与其它任务处在同一个优先级,内核允许一个任务运行一定的时间(又叫时间片),然后轮到下一
个任务,即所谓的互相“礼让”执行。默认为0,时间片由内核决定。
p_ext,提供额外存储空间用于存储浮点运算单元寄存器,若不提供,写NULL
opt,在创建任务的时候,提供额外操作,如果不使用,写OS_OPT_TASK_NONE
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
返回值:无
#栈大小
创建任务特别检查传递的数组的大小是否空间充足,因为它是作为任务的栈空间使用,若空间不足,会导致程序不能执行,直接跑到HardFault_Handler这个函数。
原因如下:
1)任务里申请大空间的局部变量,例如数组、结构体…,将会占用大量的栈空间
2)任务里包含很多复杂的函数,将会占用大量的栈空间
解决方法:
1)该局部变量变为全局变量
2)该局部变量变为静态的局部变量
3)创建当前任务的时候,决定更大的栈空间
#UCOSIII优先级
优先级 0:中断服务管理任务 OS_IntQTask()
优先级 1:时钟节拍任务 OS_TickTask() 滴答定时器任务
优先级 2:定时任务 OS_TmrTask()
优先级 3:开始任务 OS_start_task()
优先级OS_CFG_PRIO_MAX-2 : 统计任务 OS_StatTask()
优先级OS_CFG_PRIO_MAX-1 : 空闲任务 OS_IdleTask()
其他自己设定的任务可以根据重要性从4开始设定。
#轮转调度算法
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个任务被分配一时间段,称作它的时间片,即该任务允许运行的时间。时间片轮转调度算法是面向于多个同级的任务。轮转调度算法在实际使用中,时间片长度该设为多少需要好好调试,因为有时候时间片太短,任务还没来得及做事情,就被调度了;时间片太长,又会造成让其它任务等太久,所以实际编程中需要好好调试。
1)使用时间片轮转调度,需要将系统中的宏定义:“OS_CFG_SCHED_ROUND_ROBIN_EN”设为真,这样才能启用时间片轮转调度,具体位置在os_cfg.h。
2)在执行OSInit函数后添加如下代码:
#if OS_CFG_SCHED_ROUND_ROBIN_EN
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
OSSchedRoundRobinCfg 函数分析
void OSSchedRoundRobinCfg (CPU_BOOLEAN en,
OS_TICK dflt_time_quanta,
OS_ERR *p_err)
参数说明:
en,使能,填写为"DEF_ENABLED"才能使能时间片轮转调度;
dflt_time_quanta,时间片长度,就是每个任务每次获得CPU使用权后执行的时间。若参数为0,时间片长度=OS_CFG_TICK_RATE_HZ/10。
p_err,错误码。
3)当一个任务想要放弃本次时间片的时候,就可以调用该函数,函数原型如下:
void OSSchedRoundRobinYield (OS_ERR *p_err)
4)任务创建示例
OSTaskCreate((OS_TCB *)&Task1_TCB,
(CPU_CHAR *)"Task1",
(OS_TASK_PTR)task1,
(void *)0,
(OS_PRIO)6,
(CPU_STK *)task1_stk,
(CPU_STK_SIZE)128/10,
(CPU_STK_SIZE)128,
(OS_MSG_QTY)0,
(OS_TICK)10,
(void *)0,
(OS_OPT)OS_OPT_TASK_NONE,
&err
);
3、任务挂起
暂停任务的执行
void OSTaskSuspend (OS_TCB *p_tcb,
OS_ERR *p_err)
参数:
p_tcb,类似于线程id,控制任务
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
返回值:无
项目用途:
1)如果当前任务不是经常要执行的,可以挂起。类似于手机APP的管理机制,如果app进入后台就冻结其执行,也就是挂起app,有利于提高系统响应,降低资源占用。
2)保护共享资源,可以挂起。
4、任务恢复执行
void OSTaskResume (OS_TCB *p_tcb,
OS_ERR *p_err)
参数:
p_tcb,类似于线程id,控制任务
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
返回值:无
5、任务的删除
void OSTaskDel (OS_TCB *p_tcb,
OS_ERR *p_err)
参数:
p_tcb,类似于线程id,控制任务;若是删除自己的话,就填写NULL。
p_err,返回错误码,没有错误的就返回OS_ERR_NONE
返回值:无
项目用途:
专门用于初始化硬件,一般来说,硬件只做一次初始化,完毕后可将该任务删除,该任务的删除是不会释放资源,只是通过任务列表去掉而已。
四、内核调度点
释放信号量或者发送消息,也可通过配置相应的参数不发生任务调度。
使用延时函数OSTimeDly()或者OSTimeDlyHMSM()。
任务等待的事情还没发生(等待信号量,消息队列等)。
任务取消等待。
创建任务。
删除任务。
删除一个内核对象。
任务改变自身的优先级或者其他任务的优先级。
任务通过调用OSTaskSuspend()将自身挂起。
任务解挂某个挂起的任务。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了UCOSIII实时操作系统------任务管理,而UCOSIII实时操作系统还有更多的功能等着我们去挖掘,其他内容请移步博主其他文章或关注博主等待后续发布。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)