因某种需要,要在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的命令设置端点等就可以调试了。
原文地址:http://blog.51cto.com/petrelight/2085374