注意本文图片与GIF动画较大,加载较慢,请耐心等待
环境搭配
硬件环境
- 板子:2440芯片的板子,但我只有TQ2440,所以就用这个
- 调试器:Jlink
软件环境
- Windows 10 X64
- Eclipse
- yagarto的 arm-none-gnueabi
- MSYS与miniGW
- babun(对Cygwin进行了打包配置等的Cygwin工具)
- Jlink官方的工具
软件环境的搭建
1.Eclipse相关
- 安装Eclipse:下载一个最新的Eclipse,并解压,然后打开Eclipse
- 安装zylinCDT插件:参考Zylin官方的说明页面
2. 安装MSYS与miniGW
2.1 到SourceForge下载miniGW的Installer,如果无法访问SourceForge可以到我后面的网盘下载
2.2 选择安装MSYS与miniGW
需要注意的是需要选择MSYS Base与MiniGW32 Base,如下图:
安装完成后会有提示:
3. 安装babun
参考官网的说法
4. 安装Cross ToolChain
可以随便找一个安装来用,但是我验证过好用的是yagarto-bu-2.23.1_gcc-4.7.2-c-c++_nl-1.20.0_gdb-7.5.1_eabi_20121222.exe,官方已经找不到了,但是搜索下载。
安装好后,确认是否设置了环境变量,例如可以在babun的mintty中看看版本,以及路径:
创建Eclipse工程以及make目标
1. clone下lmosem的代码
2. 将代码放到Eclipse的workspace下,即Eclipse启动的时候询问的位置
3. 从Eclipse导入文件,并创建工程,工具链这一步可以随便选择
4. 创建make目标这样子,就不需要敲命令行来编译与clean了
在Eclipse的make target中右键New,然后填入all,并确定,然后重复再创建一个clean目标,示例图如下:
5. 测试编译环境是否有问题
双击make targe目标clean,然后再双击all,如果像下面这样子(注意看底下的console窗口的输出),那么说明编译与clean没有问题了:
如果出现下面这样的提示,那么就是MSYS没有设置进PATH中:
那么此时也可以在Project属性中添加一个PATH路径,这样子可以不污染系统PATH:
然后再次测试make targe的clean与all是否正常。如果正常,那么编译环境就OK了,以后我们就用这个编译环境。
配置Eclipse Jlink Debug
1. 创建新的DebugConfiguration
在Run菜单中选择Debug Configrations,然后新建一个ZylinDebug Configarations(注意是Native不是Cygwin)。然后继续下面的配置。
2. 加载的ELF Symbol文件配置
因为调试器需要加载ELF Symbol文件,因此需要在Main标签中指定编译出来的ELF文件,如下图,注意将下面的Application Console也选中:
3. gdb配置
我们使用的是gdb来连接Jlink GdbServer的方式来调试,而Eclipse作为一个前端,因此需要配置后端的gdb文件,因此我们指定gdb:
这里面使用的是前面安装的Cross ToolChain中的gdb,这个也可以在babun中确认:
需要注意的是里面有一个“Stop on start at:”这个选项,这里面可以填一个我们需要gdb加载符号开始跑后,在遇到某个符号的时候停下来,我们可以在这里配置也可以先不配置,在后面配置。
4. InitCommand配置
在使用Jlink连接了ARM芯片之后,我们还需要对SoC进行一些初始化等配置工作,这些工作就是在这里进行的,针对于我使用的TQ2440,我是如下配置的:
target remote localhost:2331 monitor arm920t sw_bkpts enable monitor endian little monitor reset monitor MemU32 0x53000000=0x00000000 monitor MemU32 0x53000000=0x00000000 monitor MemU32 0x4A000008=0xFFFFFFFF monitor MemU32 0x4A00001C=0x000007FF monitor MemU32 0x56000050=0x000055AA monitor MemU32 0x4C000014=0x00000007 monitor MemU32 0x4C000000=0x00FFFFFF monitor MemU32 0x4C000004=0x00061012 monitor MemU32 0x4C000008=0x00040042 monitor MemU32 0x48000000=0x22111120 monitor MemU32 0x48000004=0x00000700 monitor MemU32 0x48000008=0x00000700 monitor MemU32 0x4800000C=0x00000700 monitor MemU32 0x48000010=0x00001f4c monitor MemU32 0x48000014=0x00000700 monitor MemU32 0x48000018=0x00000700 monitor MemU32 0x4800001C=0x00018005 monitor MemU32 0x48000020=0x00018005 monitor MemU32 0x48000024=0x008e04f4 monitor MemU32 0x48000028=0x00000032 monitor MemU32 0x4800002C=0x00000030 monitor MemU32 0x48000030=0x00000030 load #break do_menu #break _start_armboot break lmosemhal_start #break main continue
这里面主要做了以下几个动作:
- 连接到gdb server
- 设置大小端
- 让SoC进行Reset
- 配置内存
- 加载我们在前面第2步指定的ELF文件
- 在lmosemhal_start这个符号处设定断点
- 开始跑
将这段放入Command中:
如果是其他平台还需要进行更改。
5. Debug段的添加
ELF文件在原本的CFLAGS配置下是不会包含Debug信息的,如果这样子调试的话,gdb会无法找到调试时候PC指针所在文件对应的Source Code,也就无法进行代码同步查看,出现如下的问题:
这不是我们想要的结果,因此更改Makefile中的CFLAGS,让产生的ELF文件包含debug信息:
即加载-g选项
6. 重新生成ELF文件
更改了CFLAGS,那么我们可以在make target中的双击clean,然后双击all,完成make clean与make all。
7. Jlink gdbServer配置
首先是安装Jlink调试器的对应软件,安装完成后有许多的工具:
然后关闭所有的防火墙或者网络拦截工具,否则下面的jdbServer无法正常被连接。
接下来就是开启Jlink GDB Server,开启后的状态如下,处在等待连接状态,注意查看红色部分:
然后我们从Eclipse中开启调试:
如果没有问题,那么Eclipse中的gdb会连接上Jlink gdb Server,然后Server端会显示连接了:
同时Eclipse这段也会进行init处理,即前面我们说到的那段Init命令,效果如下动画,注意底下的console窗口:
到此,我们就构建好了调试与编译环境。
更改Encoding解决文件的乱码问题
因为有中文,为了Editor,Makefile中不乱码,如下面几个图,配置UTF-8即可。
1. Editor的配置
2. Makefile编辑器的配置
但是console的乱码不知道该怎么解决,Search了一把也没有找到就放弃了,要是大家知道,麻烦告知。
其他问题
Q1. 是否可以使用DS-5替代Eclipse?
A1:分下面两种情况
[1] 如果仅仅是使用DS-5带的Eclipse,但是其他都按照本文前面的步骤来做,那么答案是不可以,因为DS-5的Eclipse经过ARM公司改装后,发现都没有了Install New Softwares选项
[2] 如果不仅仅是使用DS-5带的Eclipse,还要用Jlink的RDDI来替换DS-5的,然后通过这个RDDI接口来访问Jlink,而不需要ZylinCDT的话,那么答案是可以,以后会说明。但就现在我的尝试而言,发现安装官方的文档操作遇到了一个问题,看起来是dll匹配问题:
Q2. Linux Mac下面是否也可以这样搭配环境?
A2: 可以,Linux下面更方便。操作步骤几乎完全类似。有需求再写。
Q3. 是否可以不是用Eclipse,直接使用gdb?
A3: 没有问题,但是Eclipse更方便。
参考
1. 虚拟嵌入式系统实验室
2. Eclipse ARM