🌱 hi,最近开始写嵌入式,碰到蛮多新的问题,也调bug到凌晨五点过。欢迎关注我,一起讨论交流
开发环境
在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无关,是其它错误代码引起的一系列连锁反应,所以从零调试很重要啊。。。