【专业技术贴】S32DS IDE使用Tips--应用程序开发实战实用技巧总结与详解(工欲善其事必先利其器)
来源:汽车功能安全
2020-03-27
15719
内容提要
引言一、S32DS IDE工程管理篇1. 打开/导入(Import)S32DS IDE工程2. 备份/导出(Export)S32DSIDE工程3. S32DS工程重命名(Rename)4. 新建编译目标(Build Target)实现应用软件和SDK代码复用5. 新建调试目标(Debug Target)实现个性化debug二、S32DS IDE工程文件代码编辑阅读篇1. 当前文件(File)/当前工程(Project)和当前工作空间(Workspace)快速文本搜索(Search Text)2. 快速定位变量(Variable/函数(Function)/宏(Marco)定义3. 快速定位/打开文件存储目录(Show In -> System Explorer)4. 使用第三方编辑器打开工程文件(Open With -> System Editor)5. 文本文件内容比较(Compare With -> Each Other)功能使用6. 查看函数/变量调用层级(Call Hierarchy/Ctrl + Alt + H)三、S32DS IDE工程程序下载与调试篇1. 正常debug与Attach的区别与配置2. 设置调试默认断点3. 查看全局变量和局部变量(Variables & Expressions)4. 查看和保存存储器内容(Memory)5. 查看和修改CPU内核通用寄存器(Registers)6. 查看和修改CPU内核特殊寄存器(SPR Registers)7. 查看和修改外设寄存器(EmbSys Registers)8. 查看函数调用栈(Call Stack),分析程序调用过程9. 查看汇编代码和进行汇编指令级调试(Disassembly)10. 使用RTOS调试插件总结
引言
S32DS IDE是NXP为其32-bit 汽车微控制器与微处理器(AMP--Auotmotive MCU &MPU)提供的基于GNU GCC & GDB toolchain的免费应用软件集成开发环境(IDE--Integrtaed Development Enviroment)。
S32 Design Studio IDE是一个免费的集成开发环境,适用于汽车和基于Power Architecturee®(e200内核)及Arm®的超可靠微控制器。S32 Design Studio基于包括Eclipse IDE、GNU编译器套装(GCC)和GNU调试器(GDB)等在内的开源软件,是一种不限制代码大小的简便开发工具,可编辑、编译和调试设计。www.nxp.com/s32ds
S32DS IDE提供了以下4个不同的版本,支持所有NXP的32-bit AMP产品,包括Qorivva MPC56xx/57xx, KEA系列以及全新的S32平台--S32K、S32R、S32V、S32S、S32G等众多明星MCU/MPU,推出三年多来被业界广泛使用,随着其版本的不断升级和改进,编译质量和效率也在不断加强和提高。
①S32 DS IDE for Arm®:面向S32K1、S32V、KEA和MAC57D54H器件的集成开发环境(IDE)。②S32 DS IDE for Power Architecture®:面向S32R、MPC57xx和MPC56xx器件的集成开发环境(IDE)。③S32 DS IDE for Vision:面向S32V的集成开发环境(IDE)④S32 DS:面向S32平台和S32V的集成开发环境(IDE)。
S32DS IDE各个版本之间的差异对比如下表:
*以上内容参考S32DS IDE官网,更多详细信息和下载安装,请访问:www.nxp.com/s32ds;
俗话说:工欲善其事,必先利其器。
如果对S32DS IDE的使用足够了解和熟悉,就会使得我们的应用程序开发事半功倍。为此,我特意整理了自己在过去三年多时间里,使用S32DS IDE的诸多技巧和方法,希望对大家有所帮助。
一、S32DS IDE工程管理篇
1. 打开/导入(Import)S32DS IDE工程
在S32DS IDE中,打开已有S32DS IDE应用工程的正确方法是使用其导入(imprort)功能,具体步骤如下:
①通过菜单File->Import..,打开工程导入向导:
②选择General->Existing Projects inti Workspace->Next:
③如果1):要打开的S32DS应用工程已经解压到本地目录,则选择"Select root directory",浏览找到导入工程所在的文件目录,选择要导入的工程(如果该目录存在多个S32DS IDE应用工程,也可以支持多个工程同时导入),选择"Copy Projects into workspace"(也可以不勾选该选项,这样该工程将在本地被打开,而不会拷贝到当前工作空间(Workspace)), ->Finish即可导入S32DS IDE应用工程:
如果2):想要打开的S32DS应用工程包含在压缩包中(比如export的zip文件),未解压,则选择"Select archive file",浏览找到该压缩包文件,选择要导入的工程(如果该压缩包中存在多个S32DS IDE应用工程,也可以支持多个工程同时导入),此时,"Copy Projects into workspace"是必选选项,这样导入过程将自动解压并应用工程拷贝到当前工作空间(Workspace), ->Finish即可导入S32DS IDE应用工程:
Tips:S32DS IDE仅支持*.zip、*.tar.gz、*.tar和*.tgz四种压缩文件格式,不支持常见*.rar。
2. 备份/导出(Export)S32DSIDE工程
在S32DS IDE中,可以通过导出(Exprort)功能备份一个应用工程,具体步骤如下:
①在S32DS IDE的工程浏览器窗口(Project Explorer)窗口中选中需要导出/备份的应用工程:
②选择菜单File->Export..,打开工程导出向导:
③在导出向导中,选择General->Archive File->Next:
④选择要导出的工程文件(支持同时导出当前Workspace下的多个应用工程)、输入导出文件的保存路径和文件名以及保存压缩文件格式->Finish,即可快速完成应用工程导出:
Tips:输入的导出文件名格式必须与选择的格式一致;
Tips:导出时可以不勾选,调试目标文件夹(比如Debug、Release、Debug_FLASH、Debug_RAM等),以避免将编译结果和无用的中间目标文件一起导出,导致输出文件过大。
Tips:S32DS IDE支持应用工程导出时保存为*.zip、*.tar.gz、*.tar和*.tgz四种压缩文件格式;
3. S32DS工程重命名(Rename)
重命名一个S32DS应用工程,正确的方法如下:
①清除(Clean)当前应用工程,将编译结果删除;
②在S32DS IDE的工程浏览器窗口(Project Explorer)窗口中选中需要重命名的应用工程,然后选择菜单File-> Rename(或者使用快捷键F2),在弹出的Rename Project窗口中输入新的工程名字,点击OK即可:
这样修改后相应的编译结果文件,工程调试目标配置等都会一起改变:
4. 新建编译目标(Build Target)实现应用软件和SDK代码复用
如果想要实现应用软件和SDK代码的复用,比如使用同一个part MCU(e.g S32K144 LQFP-100 pin封装)的两个项目:
项目A: 使用了ADC、CAN、SPI和I2C以及CAN协议栈;项目B:使用了ADC、CAN、SPI和FlexIO(emulated I2S)以及CAN协议栈和LIN协议栈;
且其中ADC、CAN、SPI的SDK配置都是相同的。
那么,我们可以只创建一个S32DS应用工程,包含了ADC、CAN、SPI,I2C和FlexIO(emulated I2S)的SDK组件,通过S32DS IDE集成的Processor Expert GUI完成额批准并生成配置代码,并添加CAN和LIN的协议栈。
然后通过创建两个编译目标(build target)来实现以上两个项目的功能编译:
编译目标A:包含(include)并编译ADC、CAN、SPI和I2C以及CAN协议栈,可以选择自己的链接文件和配置自己的编译选择和优化目标,使用不同的C语言库;编译目标B:包含(include)并编译ADC、CAN、SPI和FlexIO(emulated I2S)以及CAN协议栈和LIN协议栈,可以选择自己的链接文件和配置自己的编译选择和优化目标,使用不同的C语言库;
具体的S32DS IDE应用工程编译目标创建方法和步骤,请参考如下公众号文章(点击文章标题接口直接跳转阅读),这里不再赘述:
《S32DS使用Tips--如何通过创建新的编译目标(Build Target)在同一个S32DS工程中同时编译静态库和应用程序》;
Tips:一个S32DS IDE应用工程编译链接的对象(源文件、链接文件输入)和规则(编译选项、链接选项配置)均由该工程编译目标的工程属性配置决定。
Tips:可以通过S32DE IDE提供的应用工程编译配置浏览器(Build Configurations Explorer)对一个工程的多个编译目标进行查看和管理,其打开方式如下:
在S32DS IDE的工程浏览器(Project Explorer)中,选中某一应用工程,然后右键->选择“Build Configurations Explorer”,即可打开该工程的编译配置浏览器
“+”表示会被编译,“X”表示会不被编译,比如编译目标Debug_FLASH和Debug_RAM使用不同的链接文件:
5. 新建调试目标(Debug Target)实现个性化debug
在S32DS IDE应用工程中,调试目标(Debug Target)用于配置应用工程的程序下载(downlaod)和调试(debug)选项。
通过S32DS IDE的如下快捷菜单图标,即可打开应用工程的调试配置(Debug Configurations)窗口,对工程的调试目标进行管理和配置:
在调试配置(Debug Configurations)窗口中,按照不同的调试器(debugger, 比如PEMicro的U-Multilink、OpenSDA和Segger的J-LINK)进行了分类:
在调试配置(Debug Configurations)窗口中,双击调试器接口分类(比如GDB PEMicro Interface Debugging),即可为当前Active的应用工程创建一个该种调试器的调试目标:
通过配置调试目标的不同配置选项即可实现个性化调试:
在某一调试目标的Startup选项中可以配置:debug时是否下载elf中的程序(勾选Attach to Running Target将不下载当前配置选择elf文件中的程序,也不会复位目标MCU,默认不勾选该选项,则会先下载elf文件中的程序)和默认断点(勾选"Set breakpoint at", 默认配置为main函数,用户也可以设置为其他任意elf文件中包含的函数或地址):
二、S32DS IDE工程文件代码编辑阅读篇
1. 当前文件(File)/当前工程(Project)和当前工作空间(Workspace)快速文本搜索(Search Text)
在S32DS IDE应用工程中,选中任意C源文件(.c和.h文件)的任意字符(通常为变量/函数),右键->Search Text->File/Project/Workspace,即可在前文件(File)/当前工程(Project)/当前工作空间(Workspace)中快速搜索其使用情况:
2. 快速定位变量(Variable/函数(Function)/宏(Marco)定义
在S32DS IDE中,通过以下三种方法可以快速定位变量(Variable/函数(Function)/宏(Marco)定义:
①选中变量/函数/宏,右键->选择Open Declaration:
②选中变量/函数/宏,然后使用快捷键"F3";
③按照"Ctrl"键,鼠标点击变量/函数/宏
3. 快速定位/打开文件存储目录(Show In -> System Explorer)
在S32DS IDE中,在任意打开的文件中,右键选择Show In -> System Explorer,即可快速定位/打开该文件的存储目录:
4. 使用第三方编辑器打开工程文件(Open With -> System Editor)
在S32DS IDE的工程浏览器窗口(Project Explorer)窗口中选中某一文件,右键选择Open With -> System Editor,即可使用系统设置的第三方编辑器打开该文件。
比如使用Hex-View打开查看编译生产的S19 编程文件:
5. 文本文件内容比较(Compare With -> Each Other)功能使用
在S32DS IDE的工程浏览器窗口(Project Explorer)窗口,按住"Ctrl"键,选择两个不同的文本文件(比如.c、.h、 .s、 .srec、.map、 .txt等),然后右键,选择Compare With -> Each Other,即可对这两个文本文件内容进行对比:
Tips:在比较窗口的右上角提供了一系列快速查看比较结果的快捷键供大家使用:
6. 查看函数/变量调用层级(Call Hierarchy/Ctrl + Alt + H)
在S32DS应用工程中的C源文件中选中想要查看调用层级的函数,然后右键选择Open Call Hierarchy(或者快捷键Ctrl + Alt + H)即可打开层级调用窗口Call Hierarchy,在其中点击"▼"即可查看函数或者变量的调用关系:
①查看被调用层级关系:
②查看调用层级关系:
③隐藏层级调用关系中的变量、常量和枚举类型:
三、S32DS IDE工程程序下载与调试篇
1. 正常debug与Attach的区别与配置
关于S32DS IDE应用工程的正常Debug和Attach的区别与配置及使用,请参考如下作者公众号文章,此处不再赘述:
《 S32DS使用Tips--如何配置和使能Attach功能定位软件程序bug和完成bootloader与应用程序工程的联合调试》;
2. 设置调试默认断点
默认S32DS IDE应用工程的调试目标配置main()函数为其默认断点,这样启动debug后,就会自动停在main()函数最开始处。如果需要调试MCU的启动(Startup)过程(即从复位函数Reset_Handlder到跳转到main函数的过程),则需要改变调试目标的默认断点设置。其设置方法如下:
在工程的调试配置(Debug Configurations)窗口中,调试目标的Startup选项中勾选Runtime Options的"Set breakpoint at",输入想要设置的默认断点即可,比如设置为复位函数-Reset_handler:( 默认配置为main函数,用户也可以设置为其他任意elf文件中包含的函数或地址):
3. 查看全局变量和局部变量(Variables & Expressions)
在S32DS IDE的调试界面中, 通过Variables窗口即可查看函数的局部变量/临时变量:
在S32DS IDE的调试界面中, 查看全局变量之前需要在源代码窗口中,选中添加:
比如,选中源代码中的时钟配置的全局数组g_clockManConfigsArr,然后,右键选择Add Watch Expression..进行添加:
然后,在Expressions窗口查看该全局变量了:
Tips:在Variables和Expressions窗口中,选中变量(一个或者多个,可以使用Ctrl和Shift键进行选择),然后,右键选择Number Format即可改变其显示格式:Default(默认格式)/Hex(十六进制)/Decimal(十进制)/Octal(八进制)/Binary(二进制)/String(字符串):
4. 查看和保存存储器内容(Memory)
通过菜单Window -> Show View ->Memory即可打开存储器查看窗口:
点击Memory窗口左侧的"+",输入要查看的存储器地址(可以是当前应用工程目标MCU的任意合法地址空间,比如SRAM、Flash和外设寄存器地址),即可添加对该地址存储器中数据的监视和查看:
点击Memory窗口右侧的导出存储器(Export Memory)图标,输入数据导出格式(Format)、开始地址(Start address)、结束地址(End address)和文件名(File name,含存储路径) -> OK,即可将选择的存储器空间数据导出:
导出数据对比:
Tips:存储器数导出功能在bootloader开发,参数标定以及bug定位分析是释放有用。
5. 查看和修改CPU内核通用寄存器(Registers)
在S32DS IDE的调试界面中, 通过Registers窗口即可查看和修改CPU内核的通用寄存器值:
Tips:该窗口中,除了可以查看CPU通用寄存器组外,还可以查看FPU的寄存器组(比如S32K144的CM4F内核的硬件FPU);
Tips:如果开始debug是默认没有打开Registers窗口,或者该窗口被意外关闭,可以通过菜单Window -> Show View ->Registers打开:
6. 查看和修改CPU内核特殊寄存器(SPR Registers)
MCU的CPU内核特殊寄存器对于调试内核中断和异常,分析定位不够十分有用,对于S32K1xx系列MCU来说,其内核NVIC中断控制器和SCB系统控制模块寄存器的是和外设寄存器一起放在EmbSys Registers窗口中查看和修改的。
而针对Qorivva MPC56xx/57xx系列和S32R系列MCU使用的PowerPC e200系列CPU内核的特殊寄存器,S32DS IDE提供了专门的查看窗口--SPR Registers:
该窗口默认是没有打开的,需要通过以下步骤打开:
①选择菜单Window -> Show View ->Others..打开Show View窗口:
②在Show View窗口中,选择Debug -> SPR Registers-> OK即可打开SPR Registers窗口:
7. 查看和修改外设寄存器(EmbSys Registers)
S32DS IDE的调试界面提供了EmbSys Registers窗口用于查看和修改MCU外设寄存器:
Tips:默认寄存器的值是不显示的,只有双击寄存器名(比如上图中的MCR)或者外设寄存器组(比如上图中的eMIOS_0)之后,调试器才会读取并显示寄存器/寄存器组的值;
Tips:S32DS的EmbSys Registers窗口中显示寄存器值时,可以显示每个寄存器位域的描述信息(与MCU参考手册一致)。
8. 查看函数调用栈(Call Stack),分析程序调用过程
在S32DS IDE的调试界面中,从右上角的Debug窗口,可以查看到当前程序运行的调用栈(Call Stack):
从下而上就是当前函数的调用关系,比如上图中,main()函数地址0x1003204调用了函数sysInit(),在sysInit()中地址0x100319A又调用了函数CLOCK_SYS_SetConfiguration()....;
Tips:点击函数调用栈中的某一函数,即可快速跳转到其调用子函数的地址。进而查看该函数中发生子函数调用时的局部量值/现场,分析程序运行情况。
9. 查看汇编代码和进行汇编指令级调试(Disassembly)
在S32DS调试界面中,点击按下菜单栏快捷图标"i->"即可打开反汇编窗口--Disassembly,查看当前程序的汇编代码并进行汇编指令级调试:
10. 使用RTOS调试插件
在S32 SDK中集成了FreeRTOS,为了方便其调试,S32DS IDE集成了FreeRTOS的调试插件,以方便查看RTOS的任务堆栈、优先级、系统堆(heap)和资源(Semaphere, Message Queue)使用情况,从而分析RTOS运行情况。
除了FreeRTOS之外,S32DS IDE还集成了eCOS和OSEK 的RTOS调试插件。
通过调试目标的OS Awareness选项可以配置和使用S32DS提供的RTOS调试插件。
总结
本文详细总结了S32DS IDE在应用工程管理、应用程序源代码编辑阅读和程序下载与调试三个方面的诸多实战实用技巧。相信大家如果真正能够掌握这些技巧的话,将会大大提高自己的工作效率,使得使用S32DS IDE开发NXP AMP产品的应用程序变得事半功倍!