文件名称:守护任务-ri5cy_user_manual
文件大小:3.05MB
文件格式:PDF
更新时间:2024-06-23 11:42:25
FreeRTOS 中文
4.4 守护任务 守护任务提供了一种干净利落的方法来实现互斥功能,而不用担心会发生优先级反 转和死锁。 守护任务是对某个资源具有唯一所有权的任务。只有守护任务才可以直接访问其守 护的资源——其它任务要访问该资源只能间接地通过守护任务提供的服务。 例 16. 采用守护任务重写 vPrintString() 例 16 提供了 vPrintString()的另一种实现方法,这里采用了一个守护任务来管理对 标准输出的访问。当一个任务想要往终端写信息的时候,其不能直接调用打印函数,而 是将消息发送到守护任务。 守护任务使用了一个 FreeRTOS 队列来对终端实现串行化访问。该任务内部实现 不必考虑互斥,因为它是唯一能够直接访问终端的任务。 守护任务大部份时间都在阻塞态等待队列中有信息到来。当一个信息到达时,守护 任务仅仅简单地将收到的信息写到标准输出上,然后又返回阻塞态,继续等待下一条信 息地到来。守护任务的具体实现参见程序清单 70。 中断中可以写队列,所以中断服务例程也可以安全地使用守护任务提供的服务,从 而把信息输出到终端。在本例中,一个心跳中断钩子函数用于每 200 心跳周期就输出 一个消息。 心跳钩子函数(或称回调函数)由内核在每次心跳中断时调用。要挂接一个心跳钩子 函数,需要做以下配置: 设置 FreeRTOSConfig.h 中的常量 configUSE_TICK_HOOK 为 1。 提供钩子函数的具体实现,要求使用程序清单 69 中的函数名和原型。 void vApplicationTickHook( void ); 程序清单 69 心跳钩子函数名及原型 心跳钩子函数在系统心跳中断的上下文上执行,所以必须保证非常短小,适度占用 栈空间,并且不要调用任何名字不带后缀”FromISR”的 FreeRTOS API 函数。