任务调度程序挂起时 xQueueSemaphoreTake 断言失败

问题描述 投票:0回答:1

我正在尝试调试在我的应用程序中发生的断言失败,该应用程序使用内核的 Posix 端口运行(我正在我的 PC 上测试它)。我有一个简单的线程结构,有两个主线程:

  • 一个正在运行一个循环,该循环执行一些逻辑并使用
    xSemaphoreTake
    xSemaphoreGive
    (带有
    portMAX_DELAY
    超时)锁定/解锁信号量来控制对数据缓冲区的访问
  • 另一个线程正在运行一个带有
    vTaskDelay(50)
    的无限循环(它也应该调用另一个函数,但为了简单起见,我只用延迟来复制这个问题

如果我理解正确,

vTaskDelay
总是调用
vTaskSuspendAll()
将任务添加到延迟列表中,然后调用
xTaskResumeAll()
重新启动调度程序;然而,这似乎与信号量函数检查以下断言的事实相冲突

configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );

我应该采取不同的做法吗?我已经用内核 V10.4.6 和 V11.0.1 尝试过这个

c embedded freertos
1个回答
0
投票

这是一个端口问题:

vTaskSuspendAll
在使用Linux线程时并没有真正暂停Linux系统上的任何东西。我建议将 freeRTOS 配置文件中的
INCLUDE_xTaskGetSchedulerState
更改为 0。

我编写了自己的 Linux 端口,因为我对现有的 Linux 端口有更多问题。

© www.soinside.com 2019 - 2024. All rights reserved.