汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

《疑难答疑》之S32DS IDE调试启动过程详解与调试目标复位方法和步骤详解

0
阅读(285) 评论(0)

内容提要

引言

1.  S32DS IDE启动调试的过程都做了哪些准备工作?

2. 什么是调试目标复位以及使用调试目标复位的好处

3. 在S32DS for ARM v2018 中如何实现调试目标复位

3.1 将MCU复位并自动运行至main()函数第一行指令

3.2 将MCU复位到复位函数

4. 在S32DS for Power v2017.R1中如何实现调试目标复位

总结


引言


最近很多读者咨询在S32DS IDE中调试时如何复位调试目标的问题,在此,我集中回答一下,希望对大家有所帮助!

1.  S32DS IDE启动调试的过程都做了哪些准备工作?


从S32DS IDE的调试界面的控制台(Console)窗口可以查看到用户启动调试到进入调试界面,程序指针断点停在应用程序main()第一行指令的过程中都具体做了哪些准备工作。


如下为S32DS for ARM v2018 IDE中调试S32K1xx系列MCU的调试启动过程控制台输出截图:

2.jpg


从中,可以看到这一过程中,调试器做了通过执行命令行脚本做了如下准备工作:


①CMD>RE:复位MCU;

②CMD>CM:选择并加载MCU的Flash算法(二进制的Flash驱动程序)到MCU的SRAM中运行;

③CMD>VC:校验MCU Flash中的内容,将其读出做CRC-16校验和并与当前下载/调试目标的elf中包含的程序代码做对比,若一致则直接跳转到步骤⑦进入调试,无需执行以下④、⑤、⑥的程序下载命令;

④CMD>EM:擦除MCU的Flash模块,这里默认通常为这个NVM--包括P-Flash/C-Flash和EEPROM/D-Flash全部擦除,使用Erase All Block命令;

⑤CMD>PM:编程Flash;

⑥CMD>VC:校验Flash;

⑦CMD>RE:复位MCU进入调试;


2. 什么是调试目标复位以及使用调试目标复位的好处


所谓调试目标复位,就是在不重新启动调试的前提下,让MCU复位(reset)重新运行到main()函数/复位函数(startup启动函数/Reset_Handler,复位向量指向的地址)的第一行指令,并且复位一切调试状态--变量恢复初始值,MCU内核和外设寄存器复位。


 众所周知,在嵌入式MCU中,对Flash的擦除和编程是极为耗时的,如下为摘自datasheet的S32K1xx系列和MPC574xP系列汽车级MCU的Flash操作时间:

2.jpg

 3.jpg


从以上参数表可以看到,对Flash的擦除和编程时间可达数十毫秒甚至上千毫秒,是极为耗时的,如果你使用的调试器速度本身就比较慢--比如EVB上板载的OpenSDA debugger或者U-Multink,还将进一步增加程序下载的时间。

由于无需重新启动调试--即无需重新擦除和编程以及校验Flash,即可重新开始调试,从而能够大大节省调试时间,所以,调试目标复位在嵌入式MCU应用程序开发调试过程中十分有用。


3. 在S32DS for ARM v2018 中如何实现调试目标复位


在S32DS for ARM v2018中有两种方式可以实现调试目标复位:


3.1 将MCU复位并自动运行至main()函数第一行指令


 

在调试界面的Debug窗口中,选中调试目标下载的elf文件,然后点击"重启处理器或者调试目标但不中断和重新启动调试(Restart a process or debug target without terminating and re-launching)"的快捷命令图标:

3.jpg

2.jpg 



即可迅速将调试目标MCU复位并自动运行到应用程序main()函数第一行代码处:

4.jpg

      

3.2 将MCU复位到复位函数


在调试界面的Debug窗口中,选中调试目标下载的下载调试接口(GDB_PEMicro_Interface_Debugging),然后点击“发送硬件复位到目标(Send HW Reset to target)"的快捷命令图标:

2.jpg

3.jpg


即可迅速将调试目标复位到应用程序Reset_Handler()复位函数:

4.jpg


4. 在S32DS for Power v2017.R1中如何实现调试目标复位


相比S32DS for ARM v2018, 在S32DS for Power v2017.R1 IDE中,只有“发送硬件复位到目标(Send HW Reset to target)"的快捷命令。


因此,在调试界面的Debug窗口中,选中调试目标下载的下载调试接口(GDB_PEMicro_Interface_Debugging),然后点击“发送硬件复位到目标(Send HW Reset to target)"的快捷命令图标:

2.jpg


即可迅速将调试目标复位到应用程序Reset_Handler()复位函数:

3.jpg


Tips:此时若全速运行,程序时不会在应用程序main()函数第一行代码处停下来的。要想快速运行完启动代码,跳转到main()函数,可以按以下方法设置:


①在Breakpoints窗口中,选中启动调试时默认添加的一次性main()函数断点,右键-->选择Breakpoint Properities,设置断点属性:

2.jpg


在断点属性窗口中,勾选Filter-->调试目标和调试线程(Thread#1)

3.jpg

 


 

②在调试界面的Debug窗口中,选中调试目标下载的elf文件,然后点击"恢复运行(Resume)"的快捷命令图标:

4.jpg


 

即可运行至main()函数,并在其第一行代码处停下来了:

5.jpg


总结


在之前的文章《S32DS IDE使用Tips--应用工程调试常见问题(FAQ)答疑》我已经介绍了很多S32DS IDE调试的方法和技巧,感兴趣的朋友可以学习一下:

1. 如何启动多核调试?

2. 如何下载和调试非S32DS IDE工程的S19/HEX/BIN/elf编译结果?

3.如何查看Qorivva MPC57xx和S32R系列MCU的e200Zx系列CPU内核的特殊寄存器(SPR)?

4. 如何查看反汇编代码和执行汇编指令调试?

5. 如何在程序下载时保护特定NVM(Flash/EEE)地址内容不被擦除?

6. 如何加载不同的Flash算法文件编程Data-Flash和外部QSPI Flash?

7. 如何attach调试定位bug?

8.如何导出储存器中的编程结果到S19/HEX/BIN文件?

9.如何高效地设置和管理应用程序调试断点?

10.如何查看全局变量?

11.如何在调试时动态监测变量变化?

12. 如何找到S32DS IDE的帮助文档?