FreeRTOS 卡在 vListInsert 中
FreeRTOS stuck in vListInsert
我正在使用 FreeRTOS 10.0.1 并且遇到了一个非常棘手的问题,试图解决它好几天,让我的代码在 CC1310 (Arm Cortex M3) 上 运行。
我使用 TI SDK 从 I2C 设备读取数据,第一次成功,第二次卡在 vListInsert 中,pxIterator->pxNext 指向它自己,所以 for 循环是无限的。
驱动程序正在等待 SemaphoreP_pend(),如果我设置断点,我可以看到 post 被调用,但内核只是卡住了。
我已将 SysTick 和 PendSV isr prio 设置为 7(最低)。
i2c 中断优先级为 6。
configMAX_SYSCALL_INTERRUPT_PRIORITY 设置为 1。
据我所知没有堆栈溢出。
请帮忙,我该如何调试这个问题?
此致
雅各布
这几乎可以肯定是中断优先级和列表损坏的问题。中断优先级存储在您的案例的前 3 位中(因为有 3 个优先级位)。所以 7 被存储为 7 << 5 (11100000b)(如果你喜欢优先级 7 == 255,你可以用 1 填充低位)。这由 FreeRTOS 处理。
我怀疑发生的是优先级为 6 的 I2C 中断,不是 << 5,因此您有 00000110b,其优先级为 0(最高,作为其前 3 位)
我解决了这个问题,在得到@realtime-rik 的帮助后,我决定再次检查我所有的中断优先级。他们哪里都好,但在这个过程中我发现了两件事。
- TI-SDK 在某些驱动程序中具有带缓冲区的结构,其中依赖于 rtos,因此应根据 rtos 的使用情况为每个驱动程序手动设置它们的大小。
- 我在启动调度程序之前在 main 中调用了 board init 函数,在 board init 内部,其中一个驱动程序正在使用 FreeRTOS 队列。我现在已经将 board init 移动到我的线程中。
我正在使用 FreeRTOS 10.0.1 并且遇到了一个非常棘手的问题,试图解决它好几天,让我的代码在 CC1310 (Arm Cortex M3) 上 运行。 我使用 TI SDK 从 I2C 设备读取数据,第一次成功,第二次卡在 vListInsert 中,pxIterator->pxNext 指向它自己,所以 for 循环是无限的。
驱动程序正在等待 SemaphoreP_pend(),如果我设置断点,我可以看到 post 被调用,但内核只是卡住了。
我已将 SysTick 和 PendSV isr prio 设置为 7(最低)。
i2c 中断优先级为 6。
configMAX_SYSCALL_INTERRUPT_PRIORITY 设置为 1。
据我所知没有堆栈溢出。
请帮忙,我该如何调试这个问题?
此致 雅各布
这几乎可以肯定是中断优先级和列表损坏的问题。中断优先级存储在您的案例的前 3 位中(因为有 3 个优先级位)。所以 7 被存储为 7 << 5 (11100000b)(如果你喜欢优先级 7 == 255,你可以用 1 填充低位)。这由 FreeRTOS 处理。
我怀疑发生的是优先级为 6 的 I2C 中断,不是 << 5,因此您有 00000110b,其优先级为 0(最高,作为其前 3 位)
我解决了这个问题,在得到@realtime-rik 的帮助后,我决定再次检查我所有的中断优先级。他们哪里都好,但在这个过程中我发现了两件事。
- TI-SDK 在某些驱动程序中具有带缓冲区的结构,其中依赖于 rtos,因此应根据 rtos 的使用情况为每个驱动程序手动设置它们的大小。
- 我在启动调度程序之前在 main 中调用了 board init 函数,在 board init 内部,其中一个驱动程序正在使用 FreeRTOS 队列。我现在已经将 board init 移动到我的线程中。