freertos学习笔记4--个人自用- 任务状态,空闲任务,钩子函数

9.4 任务状态

 在任意时刻,一个任务只能处于以下四种状态之一:

状态名称中文名称描述CPU 占用情况
Running运行态任务当前正在占用 CPU 执行代码。正在占用
Ready就绪态任务已经准备好执行,但由于有一个同优先级或更高优先级的任务正在运行,因此暂时无法获得 CPU 使用权。 

 

不占用
Blocked阻塞态任务正在等待某个外部事件(如信号量、队列消息)或时间事件(如延时)。在此期间任务不参与调度。 

 

不占用
Suspended挂起态任务被显式地“暂停”了。它不参与调度,也不会因为超时而被唤醒,除非被显式地“恢复”。 

 

不占用


9.6 Delay函数

vTaskDelay( );

vTaskDelayUntil( &xLastWakeTime, xFrequency );

既然vTaskDelayUntil优点那么多,为什么还存在vTaskDelay

使用 vTaskDelayUntil 时要注意:任务执行时间不能超过周期时间

9.7 空闲任务及其钩子函数

空闲任务

空闲任务(Idle任务)的作用之一:释放被删除的任务的内存。

除了上述目的之外,为什么必须要有空闲任务?一个良好的程序,它的任务都是事件驱动的:平时大部分时间处于阻塞状态。有可能我们自己创建的所有任务都无法执行,但是调度器必须能找到一个可以运行的任务:所以,我们要提供空闲任务。在使用vTaskStartScheduler()函数来创建、启动调度器时,这个函数内部会创建空闲任务:

  • 空闲任务优先级为0:它不能阻碍用户任务运行
  • 空闲任务要么处于就绪态,要么处于运行态,永远不会阻塞

空闲任务的优先级为0,这意味着一旦某个用户的任务变为就绪态,那么空闲任务马上被切换出去,让这个用户任务运行。在这种情况下,我们说用户任务"抢占"(pre-empt)了空闲任务,这是由调度器实现的。

要注意的是:如果使用vTaskDelete()来删除任务,那么你就要确保空闲任务有机会执行,否则就无法释放被删除任务的内存。

钩子函数

我们可以添加一个空闲任务的钩子函数(Idle Task Hook Functions),空闲任务的循环每执行一次,就会调用一次钩子函数。钩子函数的作用有这些:

  • 执行一些低优先级的、后台的、需要连续执行的函数
  • 测量系统的空闲时间:空闲任务能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间,就可以算出处理器占用率。
  • 让系统进入省电模式:空闲任务能被执行就意味着没有重要的事情要做,当然可以进入省电模式了。
  • 空闲任务的钩子函数的限制:
  • 不能导致空闲任务进入阻塞状态、暂停状态
  • 如果你会使用vTaskDelete()来删除任务,那么钩子函数要非常高效地执行。如果空闲任务移植卡在钩子函数里的话,它就无法释放内存。

使用钩子函数的前提:

在FreeRTOS\Source\tasks.c中,可以看到如下代码,所以前提就是:

  • 把这个宏定义为1:configUSE_IDLE_HOOK
  • 实现vApplicationIdleHook函数

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值