【报错】assert failed: xQueueSemaphoreTake queue.c:1545 (( pxQueue ))

因为刚学嵌入式没几天,基础不扎实,所以是很简单的问题。总之是调试比较重要吧。

开发环境

在VScode中使用Arduino,开发板ESP32S3

报错代码

使用队列接收服务器消息,FIFO依次处理消息

创建2个Task,1个用来通讯(连接wifi及mqtt服务器),1个用来控制电机等运作。前者xQueueSend(把来自服务器的消息放入队列),后者xQueueReceive(读取队列中消息)

xTaskCreatePinnedToCore(connect, "connect wifi and mqtt", 1024 * 8, NULL, 1, NULL, 0);

分析问题

1 直接搜索错误

其实在没创建Task前(只使用函数),代码是不报错的。加入xTaskCreate时候,仅vertify也没问题,upload就开始报错:

assert failed: xQueueSemaphoreTake queue.c:1545 (( pxQueue ))

然后百度和google了下,相似报错但不一样(也是wifi和queue同时用),它说可能是因为有WiFi的问题

还有一个freeRTOS社区的回答(找不到链接了),是22年底的一个对queue源码认为出错的回答,官方进行了讨论,并也认为提出的该部分源码有问题,可以被替代或删除

然后我有点怀疑是不是queue源码有问题。。后面事实是没问题的哈哈,有问题的是我的其他代码,一个地方出错就会连环报错,报一些不知道怎么解决,甚至不知道问题出在哪里的错误

2 代码调试

注释掉所有代码,从零开始调试,发现问题可能不在queue这,在xTaskCreate时候就开始报错:

Guru Meditation Error: Core 0 panic'ed (IllegalInstruction)
Guru Meditation Error: Core 0 panic'ed (LoadProhibited)
Guru Meditation Error: Core 0 panic'ed (Double exception)

这几个不知所云的错误,我调试了5个小时。。。

另外,关于这种错误(不显示出错代码行号),可以通过addr2line命令看下哪行报错

到build路径下: 

 
参考链接

3 问题解决

🌻 后来发现是xTaskCreate时候,栈设太小了。。。麻了。这是主要错误

然后又改动了我代码的其它两个地方

🌻 一个是xTaskCreate时传入的函数connect(void *ptParam),其既没有一次性执行后的vTaskDelete,其中也没有while循环反复检测连接状况(把这块放在了loop里)。这是不对的,一直报错

于是把持续检测代码用while放在了connect函数里,ok

🌻 另一个是使用vTaskDelay,喂狗。如果不喂的话会有watch dog报错,所以每个地方我都加了一下

解决了 Guru Meditation Error: Core 0 panic'ed (IllegalInstruction) 和 assert failed: xQueueSemaphoreTake queue.c:1545 (( pxQueue ))问题,其实跟queue无关,是其它错误代码引起的一系列连锁反应,所以从零调试很重要啊。。。

物联沃分享整理
物联沃-IOTWORD物联网 » 【报错】assert failed: xQueueSemaphoreTake queue.c:1545 (( pxQueue ))

发表评论