系统运维

因某种需要,要在Windows平台上进行程序开发,目标板是基于Micrel芯片(ARMv4t)做的,上面运行有Linux最小系统,只有最基本的命令,需要在Windows平台上交叉编译能在ARMv4t上运行的目标代码,并且还要能进行远程调试。基于这些需求,初步计划按以下步骤进行:
1、先在Windows平台上交叉编译一个简单的C语言程序,并上传到开发板上,能正常运行即可;
2、交叉编译gdbserver,并上传到开发板;
3、进行远程调试。
按上述计划,首先要找一个Windows环境下的交叉编译环境,参考了http://www.veryarm.com/arm-none-linux-gnueabi-gcc 下载了arm-2011.03-41-arm-none-linux-gnueabi.exe Windows安装版(个人感觉在Windows下用安装版比较好,解压版需要设定PATH),安装成功后,用C写了一个简单的Hello,World!,使用如下命令进行编译:
arm-none-linux-gnueabi-gcc hello.c -o hello
目标板与Windows主机通过以太网和串口进行连接,以太网用来上传文件,串口用于进行终端访问。目标板与Windows主机使用tfpt进行文件传递。Windows上运行有tftp server,如下图:

通过串口终端在目标板上运行如下命令下载Windows主机上编译的hello程序:
tftp -gr hello 10.32.2.10
使用命令chmod 755 hello添加执行权限后执行时,出现下述错误提示:
Illegal Instruction
这说明程序能运行,但指令不对,这有可能是在Windows上交叉编译时没有指定具体目标架构的原因(在Ubuntu下使用上述命令进行交叉编译的程序可以正常执行)。为了解决这个问题,首先通过串口终端查看了目标板启动时的信息,了解到ARM芯片是armv4t架构,接着使用arm-none-linux-gnueabi-gcc --target-help查看交叉编译器支持的ARM架构类型,发现该命令通过-march=option可以指定目标类型,于是,编译命令改为:
arm-none-linux-gnueabi-gcc -march=armv4t hello.c -o hello -g
编译成的程序在目标机上能够运行!(运气不错)
第一步完成,接下来交叉编译gdbserver。先前安装的arm-2011.03-41-arm-none-linux-gnueabi.exe包含有在Windows下运行的arm-none-linux-gnueabi-gdb.exe命令,要进行远程调试,需要在目标板上运行gdbserver。于是上gdb官网(http://ftp.gnu.org/gnu/gdb) 下载gdb7.6的代码。突然一想,既然arm-2011.03-41-arm-none-linux-gnueabi.exe包含有Windows上执行的gdb,那是不是也包含有在Linux上运行行的gdbserver呢?进入安装目录一搜索,Bingo,果然有,在安装目录CodeSourcery\\Sourcery_G++_Lite\\arm-none-linux-gnueabi\\libc\\armv4t\\usr\\bin下,运气不错。把该目录下的gdbserver放到目标版上后,果真能运行。第二步完成(俺有时还是比较懒的,在Windows下就不再自己编译了)
第三步就相对容易了,在目标板上运行命令启动gdbserver:
./gdbserver 10.32.2.80:3333 hello
上述命令中的IP是目标板自己的IP地址,端口号自己指定,只要不冲突就行,后面的hello是包含调试信息的被调试程序。然后在Windows下运行arm-none-linux-gnueabi-gdb.exe,进入gdb提示符后后,执行target remote 20.32.2.80:3333就联上目标板的gdbserver了,然后再在gdb提示符下执行file hello,这个是在Windows下加载被调试的程序,之后就按gdb的命令设置端点等就可以调试了。

Windows下通过ARM目标板上的gdbserver进行远-风君雪科技博客