目录
本篇文章大量参考公众号作者的文章,之后会根据自己的使用不定期更新。
一、 S32DS for Arm/PA
①S32 DS IDE for Arm®:面向S32K1、S32V、KEA和MAC57D54H器件的集成开发环境(IDE);
②S32 DS IDE for Power Architecture®:面向S32R、MPC57xx和MPC56xx器件的集成开发环境(IDE)。
NXP S32DS IDE中提供的SDK软件架构如下:
PEMicro系列调试器包括以下接口类型:
USB Multilink/FX;
TraceLink-USB/Ethernet Port;
OpenSDA Embedded Debug–USB Port。
其中,
USB Multilink/FX是可以支持所有系列MCU的调试器(使用不同的Firmware和调试接口);
TraceLink为PEMicro推出的带有代码跟踪(trace)的调试器;
OpenSDA 为KEA/S32K系列MCU以及MPC57xx系列MCU FRDM/Devkit系列Demo板的板载调试器。
一般情况下我们给mpc5748g烧写代码时,采用USB Multilink接口。
如何配置和使能Attach功能定位软件程序bug和完成bootloader与应用程序工程的联合调试
使用S32DS的Attach调试功能,可以在不下载改变目标MCU片上NVM且不复位MCU的情况下,非常方便的程序跟踪,定位ug。该方法在对BootLoader与应用工程进行联合调试时,十分有用。
首先,将BootLoader和应用工程的编译结果编程文件S19/HEX/BIN合并为一个,并通过编程器下载到目标MCU(利用本文介绍的方法也可以将调试配置选择Main窗口下的C/C++ application配置为某一编程文件S19/HEX/BIN,并且不再Startup窗口配置使能attach功能,则也可以将相应的编程文件下载到目标MCU);
然后,再依次用attach的方式加载BootLoader工程和应用工程elf文件中的调试信息对其进行调试即可。
1.如何创建在MCU应用工程中添加SDK?
新建应用工程向导中,选择内核和SDK、C语言库、默认调试器等。
工程创建成功后,在Project Explorer窗口中,可以看到一个ProcessorExpert.pe的文件,即为SDK的处理器专家配置信息储存文件。
2.如何使用SDK的demo工程?
S32DS IDE的SDK中集成了丰富的外设组件demo工程,这些SDK的demo工程是我们学习使用SDK最好的参考资料,强烈推荐大家在使用某一个外设组件之前,仔细阅读学习和测试相应的demo工程,在此基础上修改或者移植自己的SDK工程。
3.如何查看SDK外设组件(Component)的帮助文档?
①在工程的组件浏览窗口中选中某一外设组件,右键Doxygen Documentation,即可打开帮助文档([S32DS software development kit]),
路径如下:(file:///D:/S32DS/S32DS_for_PA/S32DS/software/S32_SDK_S32PA_RTM_3.0.0/doc/html_MPC5748G/index.html)。该帮助文档为存储在S32DS IDE安装目录下的网页文件。在该文件中,包含SDK各个外设组件的详细功能表述(Detailed Description),特性(Features),功能(Functionality)、初始化配置(Initialization)、注意事项(Important Notes)、demo代码(Example code)、数据结构(Data Structures)以及相应的API函数参数描述(Functions)等。
②在S32DS IDE的安装目录下,提供了相应SDK的帮助文档,路径如下。
4. S32DS-使用Flash from file下载S19或elf文件
····在项目联合开发中,供应商需要给客户提供可测试的程序,但又不希望客户看到应用工程的源代码和工程,这个时候就可以提供应用工程的编译结果S19文件或者二进制可执行文件-elf给客户,让他们使用编程工具/调试器下载完成功能验证。
····本文介绍如何生成S19和elf文件,并使用自带的Flash from file工具下载单独的S19或elf文件到目标MCU。
····在S32DS工程中,默认编译后都会在工程目录下生成与应用同名的.elf文件,但是不会生成S19文件:
5. 配置S32DS工程生成S19文件
工程上右键-Properties,
S32DS支持生成不同输出格式文件S19--Motorolas S-record,HEX--IntelHEX和bin文件--Raw binary
然后重新编译即可,默认生成的S19文件后缀为.srec,需要手动修改为.s19才能被编程工具识别。
使用Flash from file下载S19/elf文件
····这个略过去吧。
····因为我们一般使用的是别人给的elf格式的文件烧写到MCU中,具体步骤如下,只需修改框中的elf文件路径即可。
无论提供S19/HEX/BIN文件还是elf文件,客户都没有办法进行二次开发,因为无法获得源代码和工程。
6. S32DS链接文件和启动过程详解
······本段介绍了如何通过应用工程的链接文件(57xx_flash.ld)和启动文件(startup.s),实现用户自定义data和code段以及重定向代码/函数的自动拷贝实现方法和步骤。
······对于开发BootLoader来说,了解其链接文件和启动过程尤为关键。
参考S32DS使用Tips–S32DS for Power V1.2 链接文件和启动过程详解.
文章太长,稍后再看。
7. S32DS应用程序开发实用技巧
(1)打开/导入本地工程
File-Import-General-Exiting Projects into Workspace。
注意:“Copy Projects into workspace”,这个选项可选可不选。不勾选,该工程在本地被打开,而不会拷贝到当前工作空间。
(2)S32DS IDE工程文件代码阅读
Search Text
在任意C源文件(.c和.h)中,选中任意字符(通常为变量、函数),右键Search Text-File/Project/Workspace,即可在前文件/当前工程/当前工作空间中搜索其使用情况。
快速定位变量Variable/函数Function/宏Marco定义
三种方法:
①选中后,右键Open Declaration;
②选中后按F3;
③按着Ctrl键鼠标点击变量/函数/宏。
定位/打开文件存储目录
在任意打开的文件中,右键Show In–System Explorer。
使用第三方编辑器打开工程文件
在工程浏览器窗口,选中某一文件,右键-Open with–System Editor。
文本文件内容比较
在工程浏览器窗口,按着Ctrl键,选择两个不同的文本文件(.c/.h/.s/.srec/.map/.txt等),然后右键-Compare with–Each other。
查看函数/变量调用层级
在C源文件中选中要查看的函数,右键-Open Call Hierarchy即可打开层级调用窗口。
(3)S32DS IDE工程程序下载与调试
正常debug与attach的区别
设置调试默认断点
······默认应用工程的调试目标配置main()函数为其默认断点,这样启动debug后,就回自动停在main()函数最开始处。如果需要调试MCU的启动过程(即从复位函数Reset_Handlder到跳转到main函数的过程),则需要改变调试目标的默认断点设置。方法如下:
输入想要设置的默认断点即可,比如设置为复位函数Reset_handler。默认配置为main函数,也可设置为其他任意elf文件中包含的函数或地址。
查看和保存存储器内容(Memory)
调试界面中,Windows–Show View–Memory即可打开存储器查看窗口。
点击Memory窗口右侧的导出图标,输入数据导出格式(Format)、开始地址、结束地址和文件名(含存储路径),即可。
存储器数导出功能在bootloader开发、参数标定以及bug定位分析中很有用。
查看和修改CPU内核通用寄存器
调试界面中,通过Registers窗口即可查看。
查看和修改外设寄存器(Embsys Registers)
调试界面中,EmbSys Registers窗口。
默认寄存器的值时不显示的,只有双击寄存器名或者外设寄存器组之后,调试器才会读取并显示寄存器/寄存器组的值
查看函数调用栈(Call Stack),分析程序调用过程
调试界面中,Debug窗口可查看当前程序运行的调用栈。
······比如上图中,从下而上就是当前函数的调用关系,main()函数地址0x1003208调用了函数syslnit(),在syslnit()中地址0x100319A又调用了函数CLOCK_SYS_SetConfiguration()…
······点击函数调用栈中的某一函数,即可快速跳转到其调用子函数的地址。
查看汇编代码和进行汇编指令级调试(Disassembly)
调试界面中,点击菜单栏快捷图标“i”,即可打开反汇编窗口Disassembly,查看当前程序的汇编代码并进行汇编指令级调试。
使用RTOS调试插件
S32DS IDE集成了FreeRTOS的调试插件,以方便查看RTOS的任务堆栈、优先级、系统堆(heap)和资源使用情况,从而分析RTOS运行情况。
8. 嵌入式MCU开发之条件断点的设置(以S32DS+U-Multink debugger为例)
在嵌入式MCU软件debug过程中,设置断点是定位bug最常见而有效的手段。
1)硬件断点和软件断点:
2)条件断点
条件断点是满足一定条件才出发的断点。可实现如下功能:
①测试一变量是否满足一个给定的值;
②让某个函数执行给定的次数;
③只在特定的线程或处理器上才触发。
······条件除了可以设置跟(全局/局部)变量相关外,还可以设置与硬件外设寄存器,特别是外设状态寄存器值的变化相关,从而帮助我们捕捉到硬件状态变化的瞬间。
设置正常断点
······调试界面中,在想要设置断点的C文件源代码最左行双击即可添加断点,再双击即可取消断点。在Breakpoints窗口中双击断点列表中的任一断点即可跳转到其所在的C代码行。
打开断点属性窗口并设置
①
······在Breakpoints窗口中,选中设置好的断点,右键选择“Breakpoint Properties…”打开断点属性设置窗口。Common–Type设置为Regular常规类型,然后输入条件即可。
比如当局部变量lCount=20触发断点,则输入:lCount==20
②
······此外,还可设置断点条件为MCU外设硬件寄存器发生变化时触发。
比如本例中,通过S32K144 EVB的两个用户按键中断翻转RGB LED等, 当按键SW2时会触发PORTC的IRQ中断,在其中断ISR中toggle 连接到PTD0的红色LED,所以设置main.c 119行的断点条件为:
PTD->PDOR&0x0001 == 0x0001
这样即可实现每按下两次SW2,将触发一次该断点,暂停调试。
③
······还可以通过逻辑关系运算符对同一个断点设置更多的组合条件。
比如:
PTD0输出高电平,而且全局变量gCount等于10时:
(PTD->PDOR&0x0001 == 0x0001)&&(gCount==10)
PTD0输出高电平,或者全局变量gCount等于10时:
(PTD->PDOR&0x0001 == 0x0001)|(gCount==10)
PTD0输出不为高电平,或者全局变量gCount等于10时:
!(PTD->PDOR&0x0001 == 0x0001)|(gCount==10)