UCOSIII学习笔记之任务管理(一)

记录自己学习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函数不会直接操纵等待表等,而是先放入一缓冲队列; 中断结束
之后进行任务切换,此时该任务会把相关消息、信号传递给对应任务; 这种方式(延迟发布)降低了关中断时间;




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值