目录
一、前言
Keil和IAR一直以来都是嵌入式编程IDE的标杆,从51到ARM、AVR、再到各家私有内核开发都它们的身影。近几年,众多MCU厂商却都在大力发展自家的免费IDE,力图摆脱KEIL和IAR的垄断局面。而这些免费IDE大都基于Eclipse深度定制而来,如迈来芯的MLXIDE、ST的CubeIDE、TruStudio、NXP的S32DS、TI的CCS、再到最近比较火热的Risc-V,国内Risc-V处理器的领军企业芯来科技开发的Nuclei Studio IDE,都是Eclipse的定制产品,它们不同LOGO背后,都是Eclipse+SDK插件+代码生成插件+编译器+调试服务器的工具大集合。
基于上述原因,笔者结合自己开发过程中所接触的Eclipse开发环境,从代码编辑、工程管理、仿真调试、常用技巧等几个方面介绍Eclipse的使用技巧,本文主要以NXP的S32DS及STM32CubeIDE作为示例展开介绍,笔者水平有限,无法面面俱到,如果错漏,烦请指出。
二、鸟瞰各家Eclipse IDE
2.1 原版Eclipse
2.2 迈来芯MLXIDE
2.3 STM32CubeIDE
2.4 S32DS
单从界面来看,这几个IDE如出一辙,但这并不难理解,毕竟IDE的功能就是代码编辑和编译调试,Eclipse本身是一个极为优秀的代码编辑器,各家IDE只要套用其代码编辑和插件管理系统,加上配套的工具链就可以做得足够好用。
三、工程管理
Eclipse的工程会有各自的工作空间,每个工作空间对应不同的用户配置,工作空间一般在第一次安装IDE打开时选择,实际上,工作空间可以不唯一,用户可以根据自己使用需要,建立多个工作空间管理不同系列的工程。
笔者习惯建立一个主工作空间,以及一个备用工作空间,备用空间用于调试测试代码,主工作空间用于发布正式代码,使用上来说,主空间在管理时需要严谨一些,备用空间则可以随意。
3.1 选择和创建新的工作空间
打开IDE的时候会有以下弹窗,可以根据需要新建工作空间或选择已有工作空间。
3.2 同时打开两个工作空间
再次打开IDE,可以选择不同的空间,此时,配合双屏,可以方便的对比两个工程的代码异同。
3.3 切换工作空间
若电脑硬件资源有限,不允许同时开启多个工作空间时,可以从当前工作空间切出,选择其他工作空间。
3.4 导入工程
Eclipse的工程支持不同工作空间互相导入,导入时,可以选择是否将原工程的所有文件复制到当前工作空间中。
3.5 选择合适的工程代码编码方式
代码本质上是文本文件,文本编码的不同,可能导致代码中文注释成为乱码,通常在建立工程时就应注意工程编码,与项目团队的其他成员统一,避免工程导入到对方电脑出现注释乱码。
GBK编码适用于大部分中文场景,但UTF-8兼容性更好
四、常用技巧
4.1 切换主题
进入:菜单栏->Preference->Appearance,可以选择自己喜欢的主题,支持自定义背景,默认的选择比较少,只有深色浅色可选。
http://www.eclipsecolorthemes.org/是一个eclipse主题收集网站,从该网站上下载到的主题,可通过import->General->preference导入IDE使用。
4.2 改变字体大小和颜色
4.3 添加模块窗口
Eclipse的很多插件默认并不显示在主界面中,需要自行添加。
其中,常用模块功能如下:
Build Target:通过make工具编译工程
C/C++ Projects:工程管理界面
Console:控制台,用于打印编译输出信息和调试信息
OutLine:代码及函数的快速预览类视图
Problems:编译报错和警告显示窗口
Project Explorer:工程资源管理器
4.4 常用图标介绍
:增量编译按钮,只编译有改动的文件。
:全部编译,清除所有目标文件,重新执行编译操作。
:跳过所有断点
:新建工程
:新建源代码目录
:新建C源码文件
:开始下载和调试工程
:执行调试任务
:运行外部工具
:块编码模式,列对齐情况下,同时编辑多行文本
:后退,查看代码时很有用
:前进,查看代码时很有用
4.5 常用默认快捷键
- 单行注释:"Ctrl" + "/"
- 多行注释:"Ctrl" + "Shift" + "/"
- 取消多行注释: "Ctrl" + "Shift" + "\"
- 代码上移一行:Alt+上方向键
- 代码下移一行:Alt+下方向键
- 后退:Alt+左方向键
- 前进:Alt+右方向键
- 快速移动代码:鼠标左键拖动选中代码
- 快速复制代码:按住Ctrl+鼠标左键拖动选中代码
- 删除选中行:"Ctrl" + "D"
- 编译全部:"Ctrl" + "B"
- 搜索替换:"Ctrl" + "F"
- 快速减小字体:"Ctrl" + "-"
- 快速增大字体: "Ctrl" + "shift" + "+"
- 保存文件:"Ctrl" + "S"
4.6 GCC的并行编译
基于Eclipse的IDE大都使用MakeFile管理工程,并通过Make指令编译,大部分基于GNU的工具链,均支持并行编译,开启并行编译后,可以充分利用电脑的多核资源,加快代码编译速度。目前笔者使用过的Eclipse系IDE中,仅有MLXIDE不支持。
S32DS关闭并行编译(编译耗时:33秒):
S32DS开启并行编译(编译耗时:9秒):
可见开启并行编译,可以大幅加快编译速度,理论上核心数越多,加速效果越明显,笔者电脑使用6核6线程编译,加速已经可以达到3倍以上效果。
4.7 开启并行编译
Eclipse的GNU工具链通常开启并行编译的方法如下图所示:
开启并行编译后,对应的编译指令由make all会变成make -j all。
4.8 编译器选项(S32DS)
工程名右键->Properties->C/C++ Build->Settings下对应这编译各个阶段的配置,典型的有:
编译器:修改优化等级、添加头文件路径
汇编器:添加汇编宏定义和优化
链接器: 添加库文件和链接脚本
镜像拷贝工具: 生成BIN文件或者HEX等Flash镜像文件
打印储存占用工具:打印程序各个段的存储占用大小
反汇编工具:用于反汇编出汇编指令,方便调试代码时使用
4.9 编译器选项(STM32CubeIDE)
其他IDE大同小异,凡是与编译器相关的设置,通常都在这里。
4.10 屏蔽错误提示和拼写检查
有些基于Eclipse的IDE代码分析做得并不好,或者由于工程本身原因,会出现一些错误提示,但编译本身并无问题。比如,某些符号无法解析,或者有些宏定义识别不到等,通常会在工中给出提示。这类问题对于强迫症来说无疑是很难受的,此类问题可以通过关闭IDE内置的代码分析功能解决。
将上图中需要关闭的代码分析项关闭即可。
五、工程调试技巧
5.1 查看.elf和.map文件
GNU工具链编译后通常会生成elf文件,其中包含了程序内容、编译时的符号(C变量、C函数、汇编标号等)、调试信息、MCU存储划分和占用情况。但elf文件是二进制文件,无法直接打开,通常需要借助工具链自带的readelf工具才能查看。为了便开发调试, IDE还会把elf中的内容以文本的形式打印,这个文本文件就是map。借助map文件,可以查到变量的存储地址,函数的运行地址,及各个函数和变量的存储占用情况,及各自所属的源文件,map文件通常位于Debug文件夹或者Release文件夹。
图示圈出部分表示笔者工程生成的main函数运行地址为0x01029010,占用大小0x408字节空间,所属文件为ert_main.c
5.2 查看反汇编文件
某些情况下,调试过程中单纯查看C代码无法定位问题,需要借助编译后的汇编指令,此时,可以借助工程的反汇编文件帮助定位问题。
5.2.1 S32DS生成反汇编文件
5.2.2 STM32CubeIDE生成反汇编文件
5.3 打断点
Eclipse系列的IDE打断点与KEIL和IAR操作基本一致,都是在代码左边空白处双击。
5.4 查看变量、寄存器、修改变量
选中变量后点击鼠标右键->Add Watch Expression,即可将全局变量加入监测窗口,监视窗口除全局变量外还可以查看其他内容。
变量内容需要暂停后才能显示,暂停期间,可以在显示窗口中输入新值,实时改变程序中的变量内容。
5.5 查看内存
添加内存查看窗口后,可以直接输入地址查看地址对应内容
六、高阶技巧之Git版本管理
6.1 Git简介
Eclipse系列的IDE绝大部分都支持使用GIT进行项目管理和团队合作,通常在构建大型项目时,会有多位成员参与项目代码编写,代码发布前可能存在多个版本,这些因素都会导致代码版本众多,管理不便。GIT就是为了解决这些问题而诞生的一个版本管理工具,GIT可以将每一次提交做增量式记录,代码提交人,提交时间,更改的具体内容,版本之间的差异都可以非常方便的追溯。
配合GIT,可以将项目代码托管到代码仓库中,目前主流的代码仓库如GitHub和Gitee,都支持GIT版本管理。二者区别是,GitHub仅对开源代码提供免费仓库,私有仓库需要付费,且因其服务器在国外,下载和同步较慢。Gitee则是开源中国提供的免费代码托管平台,其面向个人提供免费的私人仓库和开源仓库,项目没有github多,但是速度快,且私有仓库免费,仅作为仓库来说,使用体验非常好,笔者平常用gitee更多一些,gitee的中文名称叫“码云“。
笔者在此教程中以STM32CudeIDE为例,将STM32F0的一个DEMO工程上传至代码仓库,并对工程修改,再次提交推送至仓库,视为一次项目代码更新,并且演示使用git克隆代码仓库并导入IDE。
6.2 下载安装GIT
官方下载链接如下:Git - Downloads,其具有良好的跨平台特性,同时支持三大主流电脑系统。读者根据自身情况下载需要的即可,下载完成后安装即可,安装过程中保持默认选项即可,不需要额外勾选,安装过程此处省略。
6.3 注册并新建代码仓库
代码托管到代码仓库的一大好处就是方便同步和管理,笔者自己的典型使用场景是,下班前在A电脑上完成项目代码提交和推送,回家后通过代码仓库同步代码到家里B电脑。如果是开源代码,还可以方便的共享。
在使用这些功能之前,需要有一个代码仓库平台的账号,并将主机上安装的GIT和远程仓库绑定。绑定过程通过GIT生成的公钥和私钥配对实现,当然,即使不生成公钥私钥也可以通过账号和密码推送访问。
笔者这里推荐国内的码云,请读者注册码云账号后,通过以下码云官方的帮助文档完成GIT的初始化和绑定。
笔者后文的步骤默认读者已经下载安装GIT,并绑定代码仓库。
6.4 新建代码仓库
开始管理一个工程前,需要先在代码托管平台新建一个仓库,
笔者此处演示的是STM32F0的一个简单LIN总线DMEO功能,因此新建仓库名称为:“STM32F0_LINBoard”,仓库创建为私有仓库。
新建仓库成功后,出现以下页面,请复制仓库链接备用,若复制http链接,后续步骤关联远程仓库时,需要输入账号和密码,如果复制ssh链接,因为5.3中已经添加了公钥私钥对,可以免去输入账号密码这一步骤。
6.5 在IDE中初始化仓库
推送仓库前需要在在IDE中初始化本地仓库
6.6 打开GIT管理模块
按下图所示,将所有改动的文件加入暂存区后,Commit执行本地提交,Commit and Push为执行本地提交且推送到远程仓库,提交前别忘了添加提交信息(笔者此处输入了“第一次提交”)
6.8 添加远程仓库
第一次提交会因为没有关联远程仓库而弹出提示,此时只需要将5.4步骤中复制的远程仓库信息录入,并输入远程仓库的账号和密码,继续执行推送即可。
使用http链接时,需要输入账号和密码,使用ssh链接,则无需输入账号和密码。
6.9 查看远程仓库
此时查看远程仓库,可以看到,代码成功推送给到了远程仓库。
笔者对工程添加一个版本说明,并进行第二次提交推送。
再次查看远程代码仓库,可以看到笔者第二次提交仅修改了一个文件的内容。
6.10 从远程仓库将工程导入IDE
实际工作中,常常需要将自己的代码分析给团队其他成员,此时,若该成员已在项目仓库成员列表中,则可以直接访问远程仓库,导出工程到IDE。
笔者此处新建一个名为TEST的工作空间,将远程代码仓库的工程导入该空间。
1.新建工作空间
2.使用仓库地址从GIT将工程导入IDE
笔者此处的地址依然是代码仓库创建时的地址,http地址和SSH地址都可以
至此,导入成功,工程可以正常编译,笔者此处所列,仅是GIT的基础用法,有兴趣的读者,可以参考码云的帮助文档,进一步学习。
Eclipse系列IDE除了厂商支持的插件以及eclipse的通用插件外,用户还可以在使用过程中,自己添加外部工具,辅助完成工作,例如,运行一些脚本,某些不直接被官方支持的兼容调试工具等。由于这部分内容笔者已经单独撰文详述,此处给出链接,供读者参考,对外部工具使用有兴趣的读者请移步:通过External Tools在STM32CubeIDE下使用DAP-LINK。
八、总结
Eclipse功能强大,涉及细节众多,奈何笔者精力水平有限,暂探索至此,希望对读者有所帮助,未来若有发现,将继续更新。