完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
设备
esp32s3 M0N8R2 环境 idf 4.4 commit hash 9ee3c8337d3c4f7914f62527e7f7c78d7167be95 bt controller lib esp32c3_family commit hash 79152b519023f26462498f3ef8805cff2a80e193 现象 设备开机后依次初始化flash_operator_task1, flash_operator_task2和ble_task三个任务, 如果ble_task初始化到配置广播信息的位置时, 恰好flash_operator_task1与flash_operator_task2同时操作了flash, 则概率性的触发如下断言: assert lld_adv.c 3023, param 00000000 00000000 Guru Meditation Error: Core 0 panic'ed (Interrupt wdt timeout on CPU0). Core 0 register dump: PC : 0x40006f93 PS : 0x00060734 A0 : 0x80019621 A1 : 0x3fcbe6e0 A2 : 0x00000000 A3 : 0x3ff19d2f A4 : 0x00000bcf A5 : 0x00000000 A6 : 0x00060b20 A7 : 0x00000001 A8 : 0x00000001 A9 : 0x3fcef9e4 A10 : 0x3fcef9e4 A11 : 0x00000001 A12 : 0x00000000 A13 : 0x00000000 A14 : 0x00000001 A15 : 0x00000001 SAR : 0x00000004 EXCCAUSE: 0x00000005 EXCVADDR: 0x00000000 LBEG : 0x40006f8c LEND : 0x40006f93 LCOUNT : 0x00000000 UPTED Core 1 register dump: PC : 0x420f350e PS : 0x00060f34 A0 : 0x82004918 A1 : 0x3fcae7f0 A2 : 0x00000000 A3 : 0x00000003 A4 : 0x00060023 A5 : 0x3fcf6b70 A6 : 0x02c9df40 A7 : 0x00ffffff A8 : 0x820702f6 A9 : 0x3fcae7d0 A10 : 0x00000000 A11 : 0x00000001 A12 : 0x8037cc3a A13 : 0x3fcf6b50 A14 : 0x3fca2b24 A15 : 0x3fca2b24 SAR : 0x00000000 EXCCAUSE: 0x00000005 EXCVADDR: 0x00000000 LBEG : 0x00000000 LEND : 0x00000000 LCOUNT : 0x00000000 Backtrace: 0x420f350b:0x3fcae7f0 0x42004915:0x3fcae810 0x4038253b:0x3fcae830 为此专门写了一个反复软重启的固件并烧录给多台设备, 发现长时间挂机测试必现. 由于断言所述的lld_adv.c不在idf框架中, 所以无法跟踪到此文件第3023行到底做了啥. |
|
相关推荐
1个回答
|
|
这个问题是由于多线程操作 Flash 导致的断言失败。在 ESP32S3 设备上,使用 ESP-IDF 4.4 版本和 esp32c3_family 控制器库。要解决这个问题,我们可以按照以下步骤进行:
1. **分析问题**:首先,我们需要确定问题的具体原因。从描述中可以看出,当 `ble_task` 初始化到配置广播信息的位置时,如果 `flash_operator_task1` 和 `flash_operator_task2` 同时操作 Flash,就可能触发断言失败。 2. **查找文档**:查阅 ESP-IDF 和 esp32c3_family 控制器库的文档,了解它们对多线程操作 Flash 的支持情况。如果文档中提到了相关问题或限制,我们需要遵循这些建议。 3. **使用互斥锁**:为了防止多个任务同时访问 Flash,我们可以使用互斥锁(mutex)来同步访问。在每个任务访问 Flash 之前,先尝试获取互斥锁,访问完成后再释放互斥锁。这样可以确保同一时间只有一个任务在操作 Flash。 ```c #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" static SemaphoreHandle_t flash_mutex = NULL; void flash_access_task(void *pvParameters) { if (flash_mutex == NULL) { flash_mutex = xSemaphoreCreateMutex(); } // 尝试获取互斥锁 xSemaphoreTake(flash_mutex, portMAX_DELAY); // 在这里执行 Flash 操作 // 释放互斥锁 xSemaphoreGive(flash_mutex); } ``` 4. **调整任务优先级**:如果可能的话,可以尝试调整任务的优先级,以减少它们同时访问 Flash 的概率。例如,可以将 `ble_task` 的优先级设置得比其他两个任务更高,这样在它初始化广播信息时,其他任务可能会被暂时挂起。 5. **优化 Flash 操作**:检查 `flash_operator_task1` 和 `flash_operator_task2` 中的 Flash 操作,看看是否有优化的空间。例如,减少 Flash 操作的次数,或者将多个操作合并为一个操作。 6. **更新软件版本**:如果问题是由于软件版本中的 bug 导致的,可以尝试更新 ESP-IDF 和 esp32c3_family 控制器库到最新版本,看看问题是否得到解决。 |
|
|
|
只有小组成员才能发言,加入小组>>
358 浏览 0 评论
1202 浏览 1 评论
591浏览 6评论
485浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
468浏览 5评论
467浏览 4评论
445浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 02:57 , Processed in 0.887014 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号