FreeRtos 从 IRQ 调用 vTaskDelete
FreeRtos calling vTaskDelete from IRQ
我花了一些时间,但我找不到任何信息是否允许从 IRQ 处理程序调用 vTaskDelete?我知道有些方法在 IRQ 例程中有专门的版本,但是我找不到与 vTaskDelete 相关的任何内容。目前它可以工作,但我不想仅仅因为我没有找到信息就很难发现错误。
我假设您没有使用 NULL 参数调用 vTaskDelete,因为当您处于中断上下文中时没有当前任务。在任何情况下,都不应该从中断上下文中调用 vTaskDelete()。例如,它的实现将调用 vPortFree() 来释放任务的 TCB。
如果您从 IRQ 调用回调,那么它仍在 IRQ 上下文中。使用 NULL 参数调用 vTaskDelete() 会删除进入中断前 运行 的任务,因此中断会尝试 return 到不再是 运行 的任务].即使情况并非如此,经验法则是不要使用中断后不以 "FromISR" 结尾的 API 函数(单独的 API 确保函数中的决策点更少,更快和标准的中断入口,因为它不需要保留中断嵌套变量,不需要将在中断上下文中没有意义的参数[如块时间]传递给中断函数等)。 =11=]
我花了一些时间,但我找不到任何信息是否允许从 IRQ 处理程序调用 vTaskDelete?我知道有些方法在 IRQ 例程中有专门的版本,但是我找不到与 vTaskDelete 相关的任何内容。目前它可以工作,但我不想仅仅因为我没有找到信息就很难发现错误。
我假设您没有使用 NULL 参数调用 vTaskDelete,因为当您处于中断上下文中时没有当前任务。在任何情况下,都不应该从中断上下文中调用 vTaskDelete()。例如,它的实现将调用 vPortFree() 来释放任务的 TCB。
如果您从 IRQ 调用回调,那么它仍在 IRQ 上下文中。使用 NULL 参数调用 vTaskDelete() 会删除进入中断前 运行 的任务,因此中断会尝试 return 到不再是 运行 的任务].即使情况并非如此,经验法则是不要使用中断后不以 "FromISR" 结尾的 API 函数(单独的 API 确保函数中的决策点更少,更快和标准的中断入口,因为它不需要保留中断嵌套变量,不需要将在中断上下文中没有意义的参数[如块时间]传递给中断函数等)。 =11=]