我正在尝试调试在我的应用程序中发生的断言失败,该应用程序使用内核的 Posix 端口运行(我正在我的 PC 上测试它)。我有一个简单的线程结构,有两个主线程:
xSemaphoreTake
和 xSemaphoreGive
(带有 portMAX_DELAY
超时)锁定/解锁信号量来控制对数据缓冲区的访问vTaskDelay(50)
的无限循环(它也应该调用另一个函数,但为了简单起见,我只用延迟来复制这个问题如果我理解正确,
vTaskDelay
总是调用vTaskSuspendAll()
将任务添加到延迟列表中,然后调用xTaskResumeAll()
重新启动调度程序;然而,这似乎与信号量函数检查以下断言的事实相冲突
configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );
我应该采取不同的做法吗?我已经用内核 V10.4.6 和 V11.0.1 尝试过这个
这是一个端口问题:
vTaskSuspendAll
在使用Linux线程时并没有真正暂停Linux系统上的任何东西。我建议将 freeRTOS 配置文件中的 INCLUDE_xTaskGetSchedulerState
更改为 0。
我编写了自己的 Linux 端口,因为我对现有的 Linux 端口有更多问题。