记录自己学习UCOSIII嵌入式操作系统的学习笔记。
1.任务是什么?
生活中我们处理一个大问题的时候通常都是将这个问题“分而治之”,把大问题分成多个小问题,小问题被
逐步的解决,大问题也就随之解决了。那么这些小问题就可以看成是很多个小任务。在我们设计复杂、大型程
序的时候也是一样的,将这些负责的程序分割成许多个简单的小程序,这些小程序就是单个的任务,所有的小
任务和谐的工作,最终完成复杂的功能。在操作系统中这些小任务可以并发执行,从而提高CPU的使用效率。
例如在计算机中,我们可以一边浏览网页,一边听歌,这些都是任务,这就是操作系统的任务管理。
2.UCOSIII中的任务
在UCOSIII中任务就是一个函数,UCOSIII中的任务由三部分组成:任务堆栈、任务控制块和任务函数。
任务堆栈:在任务进行上下文切换的时候,用来保存单片机内部寄存器的当前的值。任务堆栈用来在切换任务和
调用其他函数时,保存现场数据的。
任务控制块(OS_TCB):任务控制块是内核使用的一种数据结构,是用来保存任务信息。需要注意的是:
在应用程序代码中,不要直接访问这些成员,更不允许改变他们。OS_TCB的各个成员只能由UCOSIII访问。
任务函数:由用户编写的任务处理代码,是实实在在干活的,一般写法如下:
void XXX_task(void *p_arg)
{
while(1)
{
。。。。。//任务处理过程
}
}
可以看出任务函数一般都是一个无限循环,当然也可以是一个只执行一次的任务。在使用UCOIII的情况下这个函数
不能有用户自行调用,任务函数何时执行执行,何时停止完全有操作系统来控制。
3.UCOSIII系统任务
1、 空闲任务(OS_IdleTask):UCOSIII创建的第一个任务,UCOSIII必须创建的任务,此任务由UCOSIII自动创建,不需要用户手动创建。空闲任务的优先级总是设置为OS_CFG_PRIO_MAX-1,即为优先级最低的任务。当其他的任务
都未就绪时,就会运行空闲任务。以下是空闲任务主要代码:
void OS_IdleTask (void *p_arg)
{
CPU_SR_ALLOC();
p_arg = p_arg; /* Prevent compiler warning for not using 'p_arg'*/
while (DEF_ON) {
CPU_CRITICAL_ENTER();
OSIdleTaskCtr++;
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCtr++;
#endif
CPU_CRITICAL_EXIT();
OSIdleTaskHook(); /* Call user definable HOOK */
}
}
的处理器来说,当没有事情可做时,处理器还是需要执行指令。当UCOSIII判定没用其他更高优先级的任务要
运行时,就会让CPU执行空闲任务。
其实空闲任务并不是什么都没做的一个死循环,还是在运行时有点意义的。在空闲任务运行时,有两个
计数器会不断递增。OSIdleTaskCtr计数用来表示空闲任务的活跃度,OSIdleTaskCtr递增得越快,说明CPU
执行与应用相关的任务花费的时间越少,OSIdleTaskCtr还由统计任务控制,用来统计程序运行时CPU的利用
情况。
2、时钟节拍任务(OS_TickTask):此任务也是必须创建的任务。其功能是跟踪正在延时的任务,以及在指定时间
内等待某个内核对象的任务。实际中该优先级只比用户的系统中最重要的任务优先级略低一点。OS_TickTask()是一
个周期执行的函数,它等待时钟节拍ISR发送的信号,如图所示。
如果允许了CPU中断,当接收到时钟节拍中断时,CPU会停止执行当前任务,并转跳到时钟节拍ISR中执行,在
时钟节拍ISR(时钟节拍中断服务函数)中调用OSTimeTick()函数, 在OSTimeTick()会调用系统内建信号量(如图函数)
向时钟任务节拍任务OS_TickTask()发送信号量,使其进入就绪状态。
(void)OSTaskSemPost((OS_TCB *)&OSTickTaskTCB, /* Signal tick task */
(OS_OPT ) OS_OPT_POST_NONE,
(OS_ERR *)&err);
一旦时钟节拍任务成为了最高优先级的就绪任务,它就会运行。当执行时钟节拍任务时,会遍历所有在等待延时结束或
指定时间内等待某个内核对象任务。我们可以把这些任务构成的列表称为时钟节拍列表。
3、统计任务(OS_StatTask):可选任务,用来统计CPU使用率和各个任务的堆栈使用量(V3.03.00版本起用
(0~1000进行表示对应0.00~100.00%)。此任务是可选任务,由宏OS_CFG_STAT_TASK_EN控制是否使用此任务。
4、定时任务(OS_TmrTask):用来向用户提供定时服务,也是可选任务,由宏OS_CFG_TMR_EN控制是否
使用此任务。定时器是一个递减的计数器,当计数器减为0时,就会做一个操作。这个操作由用户定义的回调函数运行。
时钟节拍任务使用相同的中断源,但会对时钟节拍进行分频,多少个节拍后产生一个相关信号量;
5、中断服务管理任务(OS_TmrTask):可选任务,由宏OS_CFG_ISR_POST_DEFERRED_EN控制是否使用此任务.
当通过调度器解上锁管理临界区时,ISR调用Post函数不会直接操纵等待表等,而是先放入一缓冲队列; 中断结束
之后进行任务切换,此时该任务会把相关消息、信号传递给对应任务; 这种方式(延迟发布)降低了关中断时间;