Hook函数是RTOS中的一个关键特性,通过该函数,用户可以增强对任务管理的控制,定义系统行为。
钩子函数是嵌入到在已有源代码中的函数调用,使用户能够在内核或应用程序流中添加自定义代码。在RTOS中,钩子函数提供了一种在不修改内核代码的情况下,扩展内核行为的方法。
钩子函数可以是强制的,也可以是可选的,强制钩子函意味着应用程序必须定义钩子函数实现,如果没有定义,将触发系统错误。可选钩子函数预定义为弱函数,用户可以提供自定义实现,在链接时覆盖已有定义。
在SAFERTOS中,钩子函数在内核代码中实现,并且有几个预定义的钩子函数供用户使用。这些钩子分为强制和可选两类:
强制钩子函数
vApplicationErrorHook
vApplicationErrorHook函数是SAFERTOS中唯一的强制钩子函数,用于向应用程序报告不可恢复的错误,如堆栈溢出或任务控制块(TCB)损坏。应用程序通过此函数将系统置于安全状故障态(如关闭电机或停止运行)。vApplicationErrorHook函数有两个参数:xHandleOfTaskWithError和xErrorCode,可以帮助识别错误的原因,函数不会返回。
可选钩子函数
vApplicationSetupTickInterruptHook
vApplicationSetupTickInterruptHook用于设置系统滴答定时器。作为预定义的弱函数,实现默认定时器的初始化,但应用程序可以使用不同设置的自定义定时器覆盖。该函数有两个参数:ulClockH(处理器的时钟频率,单位是Hz)和ulRateHz(期望的滴答频率,单位是Hz)。vApplicationTaskDeleteHook
vApplicationTaskDeleteHook在内核删除任务时调用。该函数可以在任务从系统中删除时执行清理或记录工作,参数为xTaskBeingDeleted。vApplicationTickHook
vApplicationTickHook从滴答中断服务程序中调用。预定义的弱函数为空。该函数在ISR上下文调用,因此函数应尽可能保持简短且非阻塞。vApplicationIdleHook
系统运行空闲任务时,内核调用vApplicationIdleHook。vApplicationIdleHook允许应用程序执行后台操作,或者在没有高优先级任务准备执行时将处理器置于低功耗状态。
移植相关的钩子函数
SAFERTOS的一些处理器接口层还定义了额外的钩子函数。
vApplicationSVCHook
vApplicationSVCHook仅在带有SVC异常处理的平台上可用,如ARM Cortex-M7。该钩子函数在SVC处理程序中调用。它提供了一种扩展或修改基于SVC的系统调用行为的方法,如让出CPU、进入/退出临界区或启动第一个任务。函数功能通过向SVC处理程序提供的数字参数选择。如果数字与内核的预定义功能不匹配,系统将调用vApplicationSVCHook函数。
通过在应用程序中使用钩子函数,用户可以对RTOS进行更深入的控制:
更有效地处理系统错误,确保系统安全恢复。
定制任务行为和管理系统滴答设置。
实现低功耗模式,使用空闲任务执行后台操作。
钩子函数是SAFERTOS和其他RTOS实现的一个关键特性,通过允许应用程序开发人员将自定义行为注入内核生命周期的各个部分,提供了灵活性。这种自定义确保系统按照特定应用程序的要求运行,例如处理错误、管理任务或响应中断。通过使用钩子函数,可以在不修改RTOS核心代码的情况下调整系统行为,从而提高应用程序的可靠性和效率。