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

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

关注引自免费微信小程序:皆我百晓生
首先,我们理解任务在栈中执行的基本流程。当任务从低优先级变为高优先级时,会触发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 等待的任务。