(1)dump触发原理
对Quecpython模组而言,Dump是一种特殊的异常处理程序,一般配置在不可恢复的异常中。其作用是保存异常现场的CPU和内存数据,并且以指定方式输出。进入这种模式一般需要满足两个条件:其一,模组CPU产生了无法恢复的异常。其二,模组使能了dump模式。
(2)Dump时,一般做以下操作:
拷贝异常现场寄存器值,其中通用寄存器R0-R12、链接寄存器LR指针以及程序计数器PC指针能够还原大多数现场。
根据我们配置的模式,建立保存dump信息的通道,一般包括:从USB/UART输出(此时需要初始化通信协议,例如Ymodem等。部分平台会重新枚举USB口),保存到存储介质(初始化对应的存储介质,并检查空间是否满足dump文件之需),从JTAG口输出(初始化JTAG硬件)。
鉴于存储空间和使用便捷性,我们一般使用USB或UART来输出dump文件。
(3)常见的不可恢复异常触发原理一般包括以下几种:
硬件看门狗超时: 硬件看门狗一般连接到CPU的IO引脚,因此可以触发CPU的硬件中断。在产生超时的情况下,看门狗触发CPU中断。中断ISR中通过主动assert等手段触发异常,如果此时使能了dump模式,就会进入dump模式并输出调试信息。
内存踩踏: 出现内存踩踏时,内存里的有效值会被清除或篡改,往往会造成CPU在获取指令或数据时取得非法值。这种情况下的异常主要有两种可能:其一,CPU取到了非法地址并尝试访问,就会造成程序或数据存储器访问失败,触发Prefetch Abort或者Data Abort;其二,有时CPU会根据错误地址跳转到错误的程序入口,造成逻辑异常,进入死循环,引发看门狗超时。当发生以上异常时,如果此时使能了dump模式,就会进入dump模式并输出调试信息。
空指针: 无论对于程序还是数据,空指针都是无效的。一般来说,在使用指针时,代码内需要过滤空指针。如果空指针被装载到了CPU中并执行访问,就会触发Prefetch Abort或者Data Abort。
死循环: 进入死循环时,CPU会被该循环占满,其它任务无法得到正常执行。最终导致看门狗超时触发异常。
assert: 断言,一种调试手段,当输入为FALSE时,主动触发异常,如使用abort或while(1)等。如果使能了dump模式,最终会进入dump模式并输出调试信息。
以上即为dump模式的触发原理。进入dump模式后,模组会保存异常触发时的内存和寄存器信息并输出.接下来,我们将介绍如何抓取dump调试信息并进行分析。
(4)抓取dump调试信息
在调试过程中如果发生程序异常,我们可以配置模组进入dump模式并抓取调试信息。
(5)配置dump模式
一般来说,模组在程序异常时默认的行为是reset,我们需要通过调整NV参数来配置模组异常时进入dump模式,此更改需要从AT口(一般支持主串口和Quectel USB AT Port)下发AT指令来配置,各平台指令如下:
ECX00U/ECX00G(该配置掉电不保存):
at+qdbgcfg="dumpcfg",0
ECX00A/ECX00N/ECX00M(该配置掉电不保存):
AT+LOG=19,1
AT+qdumpcfg=0,0
AT+qdumpcfg=2,1
ECX00E(该配置掉电保存):
AT+ECPCFG="faultAction",0
BG95/BG600L(该配置掉电保存):
AT+QCFGEXT="dump",1
发送以上指令后,模组程序异常后就会进入dump模式而非直接重启。如果需要清除以上配置,恢复reset行为,各平台指令如下:
ECX00U/ECX00G(该配置掉电不保存):
at+qdbgcfg="dumpcfg",1
ECX00A/ECX00N/ECX00M(该配置掉电不保存):
AT+qdumpcfg=0,1
ECX00E(该配置掉电保存):
AT+ECPCFG="faultAction",4
BG95/BG600L(该配置掉电保存):
AT+QCFGEXT="dump",0
除以上指令外,ECX00A/ECX00N/ECX00M平台可以通过清除NV参数来达到恢复reset行为的目的:AT+RSTSET
266

被折叠的 条评论
为什么被折叠?



