浩瀚~宇宙 2024-04-06 13:26 采纳率: 33.3%
浏览 37
已结题

调用vTaskDelete(NULL)之后,taskEXIT_CRITICAL(); 为什么还有用

调用vTaskDelete(NULL)之后,taskEXIT_CRITICAL(); /* 退出临界区 */ 为什么还有用,不是说“使用:vTaskDelete(NULL),但是要注意调用vTaskDelete(NULL)之后任务就在当前语句停止了,其后面的代码不会再被执行。”(引用自下文)

https://blog.csdn.net/u011764302/article/details/118897413

img

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-06 13:26
    关注

    引自免费微信小程序:皆我百晓生

    首先,我们理解任务在栈中执行的基本流程。当任务从低优先级变为高优先级时,会触发Critical section的切换,这个阶段可以处理一些全局性的问题。在这个过程中,taskEXIT_CRITICAL() 函数会被调用。

    然而,这段代码并没有直接违反函数的作用域规则。在 task(EXIT_CRITICAL()) 中,函数被嵌套在一个外部变量 taskEXIT_CRITICAL() 的作用域内。这意味着即使 taskEXIT_CRITICAL() 被调用,它仍然可以在其作用域之外运行,这意味着当前作用域中的其他函数仍然有可能调用 taskEXIT_CRITICAL()

    所以,即使 taskEXIT_CRITICAL() 被调用,其他函数仍然有机会执行 taskEXIT_CRITICAL(),这就是所谓的“安全区”。

    至于 vTaskDelete(NULL) 的效果,是因为当 taskEXIT_CRITICAL() 被调用后,它会在 critical section 中暂时阻塞。然后当任务离开临界区并执行其他函数时,它才会继续执行,并结束 critical section。因此,即使 taskEXIT_CRITICAL() 被调用,它的行为并不会立即影响到下一个等待在 critical section 的任务。

    这就是为什么 "taskEXIT_CRITICAL()" 在任何情况下都会继续执行的原因。

    综上所述,这段代码没有明显的问题,因为它遵循了函数作用域的规则,不会立即影响到下一个在 critical section 等待的任务。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 已采纳回答 4月7日
  • 创建了问题 4月6日