【问题标题】:Why can't call freeRTOS API within a critical section?为什么不能在临界区调用 freeRTOS API?
【发布时间】:2023-05-29 13:46:01
【问题描述】:

现在我正在学习 FreeRTOS V9.0.0 参考手册中的 freeRTOS api“taskENTER_CRITICAL()”。 我为这个 API 找到了这样的描述: “不得从关键部分调用 FreeRTOS API 函数” 为什么?为什么我们不能在关键部分调用 freertos api?如下图所示:

taskENTER_CRITICAL();
do_something..
xQueueReceive();  // ?? why can't call this api within this critical setction ??
taskEXIT_CRITICAL();

希望得到任何人的回应,谢谢!

BR//王大卫

【问题讨论】:

  • 好吧,我不知道有关 freeRTOS 的任何详细信息,但听起来好像当他们说关键部分时,他们实际上是指关键部分。像中断处理程序一样保持简短。就像 200 条 CPU 指令一样短。
  • 谢谢!但是如果我在 CRITICAL 部分调用一些 FreeRTOS 系统调用,会发生什么?系统崩溃或系统挂起或...?
  • @DavidWang 自己试试吧。

标签: c operating-system arm stm32 freertos


【解决方案1】:

在关键部分编写的代码中避免了中断。 xQueueReceive() 也因中断而工作,这是主要原因。

【讨论】: