【发布时间】:2019-01-11 08:50:52
【问题描述】:
我花了一些时间,但如果允许从 IRQ 处理程序调用 vTaskDelete,我找不到任何信息?我知道有些方法有专门用于 IRQ 例程的版本,但是我找不到任何与 vTaskDelete 相关的东西。目前它可以工作,但我不想仅仅因为我没有找到信息而努力发现错误。
【问题讨论】:
我花了一些时间,但如果允许从 IRQ 处理程序调用 vTaskDelete,我找不到任何信息?我知道有些方法有专门用于 IRQ 例程的版本,但是我找不到任何与 vTaskDelete 相关的东西。目前它可以工作,但我不想仅仅因为我没有找到信息而努力发现错误。
【问题讨论】:
如果您从 IRQ 调用回调,那么它仍然在 IRQ 上下文中。使用 NULL 参数调用 vTaskDelete() 将删除在进入中断之前正在运行的任务,因此中断将尝试返回不再运行的任务。即使不是这种情况,经验法则是不要使用中断中不以“FromISR”结尾的 API 函数(单独的 API 确保函数中的决策点更少,更快和标准的中断进入,因为它没有不需要保留一个中断嵌套变量,不需要将在中断上下文中没有意义的参数(如阻塞时间)传递给中断函数等)。
【讨论】:
我假设您没有使用 NULL 参数调用 vTaskDelete,因为在中断上下文中没有当前任务。在任何情况下都不应从中断上下文中调用 vTaskDelete()。例如,它的实现会调用 vPortFree() 来释放任务的 TCB。
【讨论】: