#137_死机恢复现场_Armino平台AP系统swd调试

原文链接

Armino平台AP系统swd调试

ap系统支持在线调试,使用jlink工具及Eclipse上位机工具,即可快速搭建调式环境。

JLink环境通过Eclipse集成JLink gdb server + gdb 工具

Jlink和BK7258连线:

1# VTref ---- VREF

7# SWDIO ---- SWDIO

9# SWCLK ---- SWCLK

20# GND ---- GND

JLink软件版本 https://www.segger.com/downloads/jlink/JLink_Windows_V768_x86_64.exe

Arm工具链版本 https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-win32.exe

Eclipse版本 eclipse-embedcpp-2020-12-R-win32-x86_64.zip

Eclipse工程配置

BK7258 JLink configuration

BK7258 JLink configuration

BK7258 JLink configuration

默认swd连接cpu0(cp端),BK7258有两个swd口(grou1/group2)

可以通过setjtagmode cpu0 group1命令设置swd连接cpu0(cp端)

可以通过setjtagmode cpu1 group1设置swd连接cpu1(ap端)

可以通过jtagmode命令查看当前jtag状态

备注

使用Jlink进行SWD调试连接,需要编译DEBUG版本。

如果是开机异常,在串口输入命令的形式可能无法连接上Jlink。可以在driver_init里bk_gpio_driver_init();之后手动调用: bk_set_jtag_mode(0,0); //第一个参数0表示调试cpu0,第二个参数0表示使用第一组SWD gpio管脚 while(g_test_mode); //定义一个volitale的全局变量,而不是while(1);是防止编译器将后面的代码全部优化掉

然后接入Jlink后,修改g_test_mode变量值,开始往下调试。

由于GPIO管脚复用,所以默认版本接入JLINK调试,需要输入调试命令,或者在代码里设置调试模式:

关闭看门狗

重新配置SWD相关的gpio

swd调试示例

连接好jlink后,可以按照以下步骤打断点调试:

根据函数指针或者函数名在Disassembly页找到dump的地址

BK7258 JLink configuration

示意图1

BK7258 JLink configuration

示意图2

在dump函数之前的语句设置断点,将断点属性设置为hardware

BK7258 JLink configuration

示意图3

点击resume继续运行程序。运行错误代码,如我在sta命令里,加了错误代码

BK7258 JLink configuration

示意图4

程序在断点处停下

BK7258 JLink configuration

示意图5

Armino平台异常dump一键恢复现场工具

请参考发布工具中使用文档: https://dl.bekencorp.com/tools/Debug_tool/BK7258-debug.zip

BK7258 dump工具常见问题:

默认Release版本dump功能是关闭的, 可以通过CONFIG_DUMP_ENABLE配置打开

当前的架构采用cp+ap模式, 可以通过两者的config文件修改打开dump功能

Dump工具恢复现场的原理是脚本通过分析log,解析出regs,itcm,dtcm,sram内容,然后通过gdb将这些内容恢复到qemu虚拟机中

Log文件的后缀支持txt, log, DAT

Log文件的编码当前只支持utf-8, 其他编码格式可用通过notepad++手动转换为utf-8编码格式

如果工具目录下有多份Log, 或者Log中有多次Dump, 工具会分析最后一次Dump, 需要保证工具目录下只有一份Log, 且Log中只有一份dump

Dump工具可以自动去掉日志里规则的时间戳: 2024-02-03 14:35:13.375193, 如果遇到不规则的时间戳, 需要手动去除

Dump过程中如果出现2次异常, 常见的如检测内存越界时, 遇到Assert, 会多打印一次寄存器, 解析时需要删掉第二次寄存器打印

任一个cpu Dump都会将当前cpu的寄存器, itcm, dtcm, 以及640k sram全部dump出来

默认cp侧的Log和Dump通过UART0输出

默认ap侧的Log和Dump通过MAILBOX到cp再通过UART0输出

Dump过程中如果遇到多个cpu同时dump, 需要将Log拆分成两份dump文件,分别用cp和ap的elf来恢复现场

每个cpu需要当前cpu的寄存器, itcm, dtcm, sram加上elf就可以恢复现场

寄存器格式:

CPU1 Current regs: =========> CPU1 表示当前寄存器是cpu1出现异常的寄存器

0 r0 x 0x0

1 r1 x 0x28061ca0

2 r2 x 0x0

3 r3 x 0x8061ca0

4 r4 x 0x28061d74

5 r5 x 0x28061d70

6 r6 x 0x28085a90

7 r7 x 0x28061de4

8 r8 x 0x8080808

9 r9 x 0x9090909

10 r10 x 0x10101010

11 r11 x 0x11111111

12 r12 x 0x1

14 sp x 0x20000928

15 lr x 0x21ec909

16 pc x 0x21ec8fa

17 xpsr x 0x61000000

18 msp x 0x2808ff48

19 psp x 0x20000908

20 primask x 0x0

21 basepri x 0x0

22 faultmask x 0x0

23 fpscr x 0x0

30 CPU1 xPSR x 0x4

31 LR x 0xfffffffd

32 control x 0xc

40 MMFAR x 0x8061ca0

41 BFAR x 0x8061ca0

42 CFSR x 0x82

43 HFSR x 0x0

MemFault =========> 初步异常原因是内存访问异常

dtcm格式:

stack mem dump begin, stack_top=20000000, stack end=20004000

<<<<stack mem dump end. stack_top=20000000, stack end=20004000

itcm格式:
stack mem dump begin, stack_top=00000020, stack end=00004000

<<<<stack mem dump end. stack_top=00000020, stack end=00004000

sram格式:
stack mem dump begin, stack_top=28040000, stack end=28060000

<<<<stack mem dump end. stack_top=28040000, stack end=28060000
stack mem dump begin, stack_top=28060000, stack end=280a0000

<<<<stack mem dump end. stack_top=28060000, stack end=280a0000
stack mem dump begin, stack_top=28000000, stack end=28010000

<<<<stack mem dump end. stack_top=28000000, stack end=28010000
stack mem dump begin, stack_top=28010000, stack end=28020000

<<<<stack mem dump end. stack_top=28010000, stack end=28020000
stack mem dump begin, stack_top=28020000, stack end=28040000

<<<<stack mem dump end. stack_top=28020000, stack end=28040000

当系统打开CONFIG_MEM_DEBUG时, Dump过程会将当前系统正在使用的Heap内存全部打印出来, 并检查是否有内存越界:

tick addr size line func task


6976 0x28064b68 80 425 xQueueGenericCreate media_ui_task

6976 0x28064be0 80 425 xQueueGenericCreate media_ui_task

6976 0x28064c58 160 425 xQueueGenericCreate media_ui_task

6976 0x28064d20 1024 863 xTaskCreate_ex media_ui_task

6976 0x28065148 104 868 xTaskCreate_ex media_ui_task

6976 0x2807d098 80 425 xQueueGenericCreate transfer_major_task

6976 0x2807d110 80 425 xQueueGenericCreate transfer_major_task

正常情况下也会将task相关信息dump到日志, 供问题分析时参考

Armino平台系统稳定性问题分析

嵌入式稳定性问题是一类常见但不容易定位的问题,其具有以下特征:

不可预测性:系统故障的时间点不固定,难以预测,可能在长时间运行后突然发生

多样性:问题可能以崩溃、死机、卡顿或错误行为等多种形式出现

累计效应:系统运行时间越长,资源泄漏或数据损坏等问题可能积累,最终导致崩溃

环境依赖性:稳定性还可能受温度、湿度和电源波动等环境因素的影响

为了帮助用户更好的定位稳定性问题,下面的链接文档中提供了常见的分析手段

备注

本文档仅针对软件引起的稳定性问题,建议用户在碰到稳定性问题时,优先参考该文档

相关推荐
2601_9623824342 分钟前
python常用函数大全pdf-python函数大全.pdf
python·内置函数·io操作·集合操作·数学运算
linnux领域43 分钟前
面包板供电“插哪都不亮“?一个暗断点引发的排查——硬件新手三板斧
单片机·嵌入式硬件·esp32·arduino·面包板·硬件入门
Jaixln_HRF1 小时前
芯维尔CN8010 1.2A/6V同步降压转换器芯片,集成350/230mΩ MOSFET与1.5MHz高频,用于汽车电子/IoT/便携仪器
嵌入式硬件·物联网·硬件工程
King of fraud1 小时前
Git 入门:从零开始的版本控制之旅
git
奈斯先生Vector1 小时前
AIGC 视频生成实战:用 Kling Video 拆解文生视频、图生视频与完整工作流
开发语言·人工智能·windows·python·aigc·音视频
小玮看世界1 小时前
[Python]螺旋遍历 vs 最短路径:方向控制类算法的“同源异流”
开发语言·python·算法
AI大模型-小华1 小时前
Codex CLI第一次怎么用?从安装到读取本地项目完整教程
git·node.js·ai编程·开发工具·代码分析·codex·codex cli
OPEN-F1 小时前
ROS2系列教程:tf2坐标变换详解(C++/Python)
开发语言·c++·python
2601_962097361 小时前
Python工作流实战:SpiffWorkflow深度应用与BPMN自动化指南
python·自动化·工作流·bpmn·spiffworkflow