esp32 Guru Meditation 错误解决方案(转)
Guru Meditation
本节将对打印在 Guru Meditation Error: Core panic'ed后面括号中的致错原因进行逐一解释。
IllegalInstruction
此 CPU 异常表示当前执行的指令不是有效指令,引起此错误的常见原因包括:
FreeRTOS 中的任务函数已返回。在 FreeRTOS 中,如果想终止任务函数,需要调用 vTaskDelete()函数释放当前任务的资源,而不是直接返回。
无法从 SPI Flash 中加载下一条指令,这通常发生在:
应用程序将 SPI Flash 的引脚重新配置为其它功能(如 GPIO,UART 等等)。有关 SPI Flash 引脚的详细信息,请参阅硬件设计指南和芯片/模组的数据手册。
某些外部设备意外连接到 SPI Flash 的引脚上,干扰了 ESP32 和 SPI Flash 之间的通信。
InstrFetchProhibited
此 CPU 异常表示 CPU 无法加载指令,因为指令的地址不在 IRAM 或者 IROM 中的有效区域中。
通常这意味着代码中调用了并不指向有效代码块的函数指针。这种情况下,可以查看 PC(程序计数器)寄存器的值并做进一步判断:若为 0 或者其它非法值(即只要不是 0x4xxxxxxx 的情况),则证实确实是该原因。
若PC指针大规模指向无效区域,那么coredump发生的可能原因某个引脚接触不良等原因导致。
详情可以对照下面esp32映射图,确定其 pc 指针位置(并不局限于本节使用)。
LoadProhibited, StoreProhibited
当应用程序尝试读取或写入无效的内存位置时,会发生此类 CPU 异常。此类无效内存地址可以在寄存器转储的EXCVADDR 中找到。如果该地址为零,通常意味着应用程序正尝试解引用一个 NULL指针。如果该地址接近于零,则通常意味着应用程序尝试访问某个结构体的成员,但是该结构体的指针为 NULL。如果该地址是其它非法值(不在 0x3fxxxxxx - 0x6xxxxxxx 的范围内),则可能意味着用于访问数据的指针未初始化或者已经损坏。
IntegerDivideByZero
应用程序尝试将整数除以零。
LoadStoreAlignment
应用程序尝试读取/写入的内存位置不符合加载/存储指令对字节对齐大小的要求,例如,32 位加载指令只能访问 4 字节对齐的内存地址,而 16 位加载指令只能访问 2 字节对齐的内存地址。
LoadStoreError
应用程序尝试从仅支持 32 位加载/存储的内存区域执行 8 位或 16 位加载/存储操作,例如,解引用一个指向指令内存区域的 char* 指针就会导致这样的错误。
Unhandled debug exception
这后面通常会再跟一条消息:
Debug exception reason: Stack canary watchpoint triggered (task_name)
此错误表示应用程序写入的位置越过了 task_name 任务堆栈的末尾,请注意,并非每次堆栈溢出都会触发此错误。任务有可能会绕过堆栈金丝雀(stack canary)的位置访问堆栈,在这种情况下,监视点就不会被触发。
Interrupt wdt timeout on CPU0 / CPU1
这表示发生了中断看门狗超时.
Cache disabled but cached memory region accessed
@ 此问题很多人遇到过,特别在这总结一下, 该部分内容感谢不方便透露姓名的张同学提供帮助
该问题原因在于:在 cache 被禁用期间(例如在使用 spi_flash API 读取/写入/擦除/映射 SPI Flash 的时候),发生了 IRAM-Safe 中断并且中断程序访问了 flash 的资源。通常发生在中断处理程序调用了在 flash 中的程序,引用了 flash 中的常量。值得注意的是,当在中断处理程序里使用 double 型变量时,由于 double 型变量操作的实现是软件实现的,所以该实现部分也被存放在了 flash 中(例如强制类型转换操作)。
解决办法就是:
给在中断中访问的函数加上IRAM_ATTR修饰符
给在中断中访问的常量加 DRAM_ATTR 修饰符
不在中断处理程序中使用 double 类型操作
需要注意的是:
1.该异常只发生在 IRAM-Safe 中断,即使用 ESP_INTR_FLAG_IRAM注册的中断处理程序。
2.该异常只有在 cache 被禁期间会出现,所以当 cache 未被禁用期间不会出现,换句话说该异常具有随机性。
3.编译器可能会将一些不会被改变的变量放入 .rodata 段中,哪怕程序员没有加 const 修饰符。对于 ESP32 的应用程序来说,.rodata 意味着该部分位于 flash 中。对于字符串变量,这种情况很容易被察觉,但是对于某些常量,就不是那么好察觉了。例如下面的情况
static timg_dev_t *TG[2] = {&TIMERG0, &TIMERG1};
这里定义了指针数组 TG,该数组元素是两个硬件定时器0,1的寄存器首地址,该指针数组的元素不会被改变,所以会被编译器放入 .rodata 中。此时在定时器中断里操作了 TG,又恰好这个中断发生在 cache 被禁期间,那么 CPU 就会抛出该异常。
出现该问题的调试技巧
CPU 抛出该类型异常时,通常异常位置就是出错位置,需要细看
Guru Meditation Error: Core 1 panic'ed (Cache disabled but cached memory region accessed)
Core 1 register dump:
PC : 0x4011b808 PS : 0x00060034 A0 : 0x8008c664 A1 : 0x3ffbeca0
0x4011b808: __fixunsdfdi at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libgcc/config/xtensa/ieee754-df.S:2041
A2 : 0x0099fd28 A3 : 0x00000000 A4 : 0x3ffbf6a0 A5 : 0x3f7909f1
A6 : 0x00000000 A7 : 0x00013ffc A8 : 0x80086136 A9 : 0x3ffbec80
A10 : 0xfffffffc A11 : 0x40ddd57f A12 : 0x000007fe A13 : 0x00000000
A14 : 0x65580000 A15 : 0x00000000 SAR : 0x00000014 EXCCAUSE: 0x00000007
EXCVADDR: 0x00000000 LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0x00000000
Core 1 was running in ISR context:
EPC1 : 0x40086914 EPC2 : 0x00000000 EPC3 : 0x00000000 EPC4 : 0x4011b808
0x40086914: spi_flash_enable_interrupts_caches_and_other_cpu at /home/chenzhengwei/esp/esp-idf/components/spi_flash/cache_utils.c:147
0x4011b808: __fixunsdfdi at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libgcc/config/xtensa/ieee754-df.S:2041
Backtrace: 0x4011b808:0x3ffbeca0 0x4008c661:0x3ffbecd0 0x4008c69d:0x3ffbecf0 0x400857e5:0x3ffbed10 0x40086911:0x3ffd0970 0x40086cc9:0x3ffd0990 0x40117789:0x3ffd09e0 0x4011785e:0x3ffd0a10 0x401179ea:0x3ffd0a30 0x40116c51:0x3ffd0aa0 0x40117109:0x3ffd0b20 0x40116729:0x3ffd0b90 0x40105c36:0x3ffd0bd0 0x401057d7:0x3ffd0c10 0x401058ce:0x3ffd0c40 0x4008dfb5:0x3ffd0c90
0x4011b808: __fixunsdfdi at /builds/idf/crosstool-NG/.build/src/gcc-5.2.0/libgcc/config/xtensa/ieee754-df.S:2041
0x4008c661: gpio_isr_loop at /home/chenzhengwei/esp/esp-idf/components/driver/gpio.c:433
0x4008c69d: gpio_intr_service at /home/chenzhengwei/esp/esp-idf/components/driver/gpio.c:433
0x400857e5: _xt_lowint1 at /home/chenzhengwei/esp/esp-idf/components/freertos/xtensa_vectors.S:1154
0x40086911: spi_flash_enable_interrupts_caches_and_other_cpu at /home/chenzhengwei/esp/esp-idf/components/spi_flash/cache_utils.c:147
...
在这个例子中,发生异常的位置在 0x4011b808, 这里是__fixunssfdi 函数的存放位置,且该位置位于片外存储器(见 esp32_technical_reference_manual 的 1.3.3 节),这个函数是用来对浮点数转 64 位无符号整数的操作,意味着中断处理程序里使用了 double 型数据的强制类型转换操作。这在 cache 被关闭时操作是不被允许的。
如果不知道变量是在 .data/.bss 段还是 .rodata 段,那么可以使用 readelf 命令查看 .elf 中的符号详细信息
# 将 build/empty-project.elf 中的符号表覆盖写到 empty-project.out 文件中
readelf -a build/empty-project.elf > empty-project.out
使用 readelf 命令提取 elf 文件中的符号表,如何查看符号表可参考 C语言变量的存储布局,通过符号表,可以准确的看到每一个变量、函数的存储位置,大小等信息。有了这些信息,就可以检查 IRAM-Safe 中断处理程序里使用变量和函数是否在 flash 中。
原文链接:https://blog.csdn.net/weixin_42942530/article/details/103975237
esp32 Guru Meditation 错误解决方案(转)的更多相关文章
- asp.net 微信支付 错误解决方案
asp.net 微信支付 错误解决方案 在网上看到有人解决方案为: 解决方法 出现这种错误网上查出现有的原因是: 订阅号没有相关的权限 账号没有认证,没有相关的权限 那么这里遇到问题两种都不是.开发账 ...
- Python运行Google App Engineer时出现的UnicodeDecodeError错误解决方案
#Python运行Google App Engineer时出现的UnicodeDecodeError错误解决方案 ##问题描述 使用Python2.7.x运行GAE时有时会报这个错误 ```py ...
- Oracle Ora 错误解决方案合集
注:本文来源于 < Oracle学习笔记 --- Oracle ORA错误解决方案 > ORA-00001: 违反唯一约束条件 (.)错误说明:当在唯一索引所对应的列上键入重复值时,会触发 ...
- IdentityServer4 错误解决方案
错误 解决方案 Grant types list cannot contain both xx and xx 以下授权类型不能同时存在: Implicit AuthorizationCode Impl ...
- win7访问局域网总提示用户名密码错误解决方案
win7访问局域网总提示用户名密码错误解决方案 1.点击开始-在搜索栏输入:secpol.msc(或者直接按下win+r键,输入secpol.msc),打开本地安全策略. 2.找到“安全设置”的“本地 ...
- MySQL升级后1728错误解决方案
MySQL升级后1728错误解决方案 错误 # 1728,Cannot load from mysql.proc. The table is probably corrupted 造成原因:MySQL ...
- (转载)SAPI 包含sphelper.h编译错误解决方案
[转]SAPI 包含sphelper.h编译错误解决方案 在使用Microsoft Speech SDK 5.1开发语音识别程序时,包含了头文件“sphelper.h”和库文件“sapi.lib”.编 ...
- jmeter发送json数据,报405、400错误解决方案
1.405错误解决方案:添加HTTP信息头管理器(错误因数:发送格式未设置) 2.400错误解决方案:json文本格式有误(注意:换行.空格等)解决方案:对照json文本数据(错误因数:发送的json ...
- php源码编译常见错误解决方案大全
php源码编译常见错误解决方案大全http://www.cnlvzi.com/index.php/Index/article/id/143 在CentOS编译PHP5的时候有时会遇到以下的一些错误信息 ...
随机推荐
- 聊聊java工程师换工作那些事
最近有个读者在苦恼一件事,那就是有大公司在挖他,他要不要从所在的小公司,跳槽到大公司,前提是两家公司的待遇基本一致.由这个问题结合自己多年的工作经验,来谈谈java工程师要不要跳槽,何时跳槽,怎么跳槽 ...
- grasshopper DataTree 树形数据以及Graft Flatten Simplify的理解
问题的来源: 要在grasshopper里面输出 类似于二维数组的数据 但是在 grasshopper里的 C# 电池里面,无法显示 二维ArrayList里面的数据. 在 C# 电池里参考这个帖子: ...
- MLIR中间表示和编译器框架
MLIR中间表示和编译器框架 TensorFlow生态系统包含许多在软件和硬件堆栈的多个级别上运行的编译器和优化器.作为TensorFlow的日常用户,使用不同类型的硬件(GPU,TPU,移动设备)时 ...
- 语义分割:基于openCV和深度学习(一)
语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...
- 编译原理-文法(G)和语言(L)
1.设文法G2(S): S->AB A->aA|a B->bB|b G2(S)产生的语言是什么? 解:L(G2)={ambn|m,n≥1} 2.请给出产生语言为{anbn|n≥1}的 ...
- 【问题记录】—SignalR连接断线重连
起因: ASP.NET Core SignalR是一个开源库,可简化向应用添加实时 SignalR Web 功能. 实时 Web 功能使服务器端代码能够立即将内容推送到客户端.(相信大家都用得比较多了 ...
- 由一次PasswordBox密码绑定引发的疑问 ---> WPF中的附加属性的定义,以及使用。
1,前几天学习一个项目的时候,遇到了PasswordBox这个控件,由于这个控件的Password属性,不是依赖属性,所以不能和ViewModel层进行数据绑定. 2,但是要实现前后端彻底的分离,就需 ...
- 深入理解Spring的两大特征(IOC和AOP)
一.spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很 ...
- Air530Z GPS/北斗定位模块_设计指导手册_V1.2
下载PDF版本: Air530Z_定位模块_设计指导手册_V1.2.pdf @ 目录 1. 模块整体说明 2. 资料下载 3. 模块性能 4.模块管脚图 5.参考设计电路 6.GPS天线 6.1 无源 ...
- C#异步迭代 IAsyncEnumerable 应用
最近用WPF做金税盘开发中有这样一个需求,批量开票每次开票都需要连接一次金税盘. 比如我有发票 a, b ,c ,d e 这五张发票,每次开具发票都需要调用金税盘底层,才能正常开票. 首先,尝试写第一 ...