这是因为工作写的一个文档,主要是我们开发人员都不会Linux不会vi也不会命令行,于是研究了一下Windows系统调试ARM Linux程序的办法,在这共享一下。
1. 概述
嵌入式Linux系统的应用程序开发,编译器一般是gcc,一般都说是要在Linux虚拟机中进行开发和编译。本文提供了一种能够在Windows系统下编译、调试Linux应用程序的方法,可大大简化Linux软件开发环境的搭建难度,保留原开发人员的操作习惯,让Linux程序开发和开发VxWorks一样方便快捷。
2. 软件包
2.1. IDE环境:EclipseIDE for C/C++ Developers
地址:
Eclipse IDE for C/C++ Developers
Eclipse下载后,无需安装配置,直接解压到program files目录即可运行,可放快捷方式到桌面。
2.2. 交叉编译工具:Linaro GCC
地址:
编译器版本选择,建议与CPU官方开发包提供的版本一致或接近,不必要追求最新版本。Windows下的编译器,命名一般为:gcc-linaro-4.9.4-2017.01-i686-mingw32_arm-linux-gnueabihf.tar.xz。带有mingw32字样的,就是Windows版的。
安装方法:
将下载的包用7zip解压到D:\gcc(winRAR似乎有问题,待确认),目录结构如下:
其中主要的几个目录位置如下:
bin/ 交叉编译工具目录
arm-linux-gnueabihf/libc/usr/include Linux user-space程序头文件目录
添加环境变量:
解压文件后,将D:\gcc\bin目录,添加到系统PATH环境变量中(系统属性-高级属性-环境变量),确保在任何位置调用arm-linux-gnueabihf-gcc均能成功。
2.3. Cygwin环境
根据安装向导进行在线安装,随本文档提供离线安装包
注意:
1、 源选择国内的某个http://edu.cn源,或网上寻找合适的国内源(如163mirror)
2、 软件包选择一定要包含“man”包,其他开发包根据需要可以以后追加
安装完成后,就可以在Windows环境使用Linux命令了
2.4. Linux API man库
地址:Index of /pub/linux/docs/man-pages
需要下载两个包:
man-pages
man-pages-posix
均可选择最新版本下载
下载后解压,将其中的man1~man7,man1p~man7p目录,复制到Cygwin安装目录下Cygwin_base/usr/share/man,如果重名则选择覆盖。
完成后,打开Cygwin终端测试:
man aio
manpthread_mutex_lock
如果能正确打开对应的帮助文档,说明安装完成。
以后开发中,可以随时通过man程序查看函数手册。
3. 目标板准备
目标板应能正常运行Linux系统,与开发机网络连通。在此基础上,确保以下功能被配置正确。本章节的准备工作,一般可由内核或rootfs维护人员处理,应用程序开发工程师一般不需要处理。
3.1. 开启SSH服务器
确保系统打开了SSH服务,一般在嵌入式Linux下,由dropbear提供该功能。
通过以下命令确认是否开启:
ps | grep dropbear
如果没有开启,需要找内核和rootfs维护人员处理。
3.2. GDB Server
远程调试依赖GDB Server功能,需要确保目标板上的GDB Server版本与开发环境中的一致,可复制位于GCC环境下的gdbserver到目标板。Windows下的gdbserver位于如下路径:
D:\gcc\bin\gdbserver
3.3. 调试临时目录
程序开发调试时,会反复地把编译好的应用程序复制到目标板的文件系统中。当目标板中Linux系统完全运行在Flash并无NFS文件系统时,下载文件的速度可能较慢,反复下载也可能导致Flash寿命提前结束。
为了提高调试效率,保证寿命,我们可以在目标板上申请一块tmpfs内存目录,调试程序都可以在该目录下进行。
这里我们约定基于tmpfs的调试目录为/run/app,后续文档中说明的应用程序调试目录均在此。
335x系统中,可修改/etc/default/volatiles/00_core,增加下面一行后自动创建app目录:
d root root 1777 /run/app none
4. 应用程序开发
4.1. Eclipse配置
Window-Preference
搜索path
在C/C++的Source Lookup Path中,添加一个File System Dir.,路径指向
D:\gcc\arm-linux-gnueabihf\libc\usr\include
并包含其子目录
4.2. 创建连接
File – New –Other
Remote SystemExplorer – Connection
创建一个连接:
连接类型为Linux:
输入HostName和IP地址:
下一步后,选择文件传输方式为SSH方式:
下一步,选择进程控制方式为通过系统shell控制
图略,同上
下一步,选择ssh.shells
图略,同上
下一步,选择ssh.terminals:
图略,同上
点击Finish完成。
测试
Window – View中打开Remote Systems窗口
右键Connect,当提示输入密码时,输入目标板用户名、密码(通常为root,密码空)
如果一切正常,可以展开SftpFiles查看目标板上的文件,右键SSH Terminals可以启动一个ssh终端。
4.3. 创建工程
新建一个工程,选择CProject
输入工程名,工程类型选择Executable—EmptyProject –Cross GCC
Cross GCC设置中,输入gcc前缀和gcc路径:
创建工程后,选择工程属性
C/C++ Build中,Builder选择内建builder:InternalBuilder
完成配置后,编译程序,应能成功:
4.4. 程序调试
打开DebugConfigurations
在C/C++ RemoteApplication下新建一个config.
在右侧配置页Main中
选择Connection为之前创建的Linux目标板连接LINUX_PMC-1308V2
远程运行程序路径,选择3.3调试临时目录中指定的调试目录,并在后面追加调试程序名:/run/app/appdemo
在Debugger选项卡中,指定gdb程序名为arm-linux-gnueabihf-gdb
配置完成后,即可点击对话框右下角Debug按钮启动调试。
剩下的工作,和Windows系统其他基于Eclipse的嵌入式开发环境下调试单片机程序、VxWorks程序没什么区别了。