【问题标题】:FreeRtos calling vTaskDelete from IRQFreeRtos 从 IRQ 调用 vTaskDelete
【发布时间】:2019-01-11 08:50:52
【问题描述】:

我花了一些时间,但如果允许从 IRQ 处理程序调用 vTaskDelete,我找不到任何信息?我知道有些方法有专门用于 IRQ 例程的版本,但是我找不到任何与 vTaskDelete 相关的东西。目前它可以工作,但我不想仅仅因为我没有找到信息而努力发现错误。

【问题讨论】:

    标签: task freertos irq


    【解决方案1】:

    如果您从 IRQ 调用回调,那么它仍然在 IRQ 上下文中。使用 NULL 参数调用 vTaskDelete() 将删除在进入中断之前正在运行的任务,因此中断将尝试返回不再运行的任务。即使不是这种情况,经验法则是不要使用中断中不以“FromISR”结尾的 API 函数(单独的 API 确保函数中的决策点更少,更快和标准的中断进入,因为它没有不需要保留一个中断嵌套变量,不需要将在中断上下文中没有意义的参数(如阻塞时间)传递给中断函数等)。

    【讨论】:

    • 不知道为什么你认为我用 NULL 调用 vTaskDelete,但是好的,这不是问题。你指出了我怀疑可以从 IRQ 调用的方法应该有后缀 FromISR。谢谢
    【解决方案2】:

    我假设您没有使用 NULL 参数调用 vTaskDelete,因为在中断上下文中没有当前任务。在任何情况下都不应从中断上下文中调用 vTaskDelete()。例如,它的实现会调用 vPortFree() 来释放任务的 TCB。

    【讨论】:

    • 我在这个回调中从 IRQ 调用回调是 vTaskDelete(taskHandle) 其中 taskHandle 是一个静态变量。
    猜你喜欢
    • 2015-02-23
    • 2019-01-09
    • 1970-01-01
    • 2019-05-30
    • 2016-08-04
    • 2023-04-03
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多