LINUX下LM3S8962开发-之交叉编译器-系列(2)
[复制链接]
LINUX下LM3S8962开发-之交叉编译器-系列(2) 常用的编译器莫过于ADS,IAR,MDK,GCC,而前三种,只能在Windows下使用,但是GCC却能够在各种平台下使用.ARM上的做的比较好的官方GCC交叉编译器就是codesourcery g++了.我们平常下载到的codesourcery g++都是lite版本.也就是说,只有30天的试用期.事实真的是如此吗?我对此表示非常怀疑.因为codesourcery g++使用的这些编译器都是从gcc衍生出来的,而GCC由GNU协议保护,所以codesourcery g++公司在发布各个版本的codesourcery g++时,必须将源码发布出去,同时包括构建整套交叉编译链所必备的步骤.事实确实是这样,codesourcery g++的确公开了全部源码和构建脚本.下载这些codesourcery g++公司修改过的源码和脚本需要登录codesourcery g++网站,注册后才能下载. 在教育网花了半天的时间下了几百兆的源码,最后还是傻眼了:上万个编译步骤.虽然写成了脚本,但是复杂度依然很高.于是只能换另外一种方法:下载codesourcery g++的可执行文件. 我下载的是sourceryg++-4.4-276-arm-stellaris-eabi.bin,windows下对应的版本是sourceryg++-4.4-276-arm-stellaris-eabi.exe.在官网上生成30天的试用key,然后安装,完成后看了下安装文件的目录结构,惊奇的发现,codesourcery g++是分为两个部分的:一个是以eclipse为平台的集成开发环境,另外一个是为stellaris arm单片机优化过的gnu的交叉编译链.而授权文件的验证是在eclipse平台的集成开发环境上进行的,也就是说,一个月后,你没有新的授权的话,就不能使用集成开发环境了,但是gnu的交叉编译链照样能够使用,而且能够永久使用.像我这种VI+GDB搞起的人,根本不需要用它的eclipse集成开发环境,如果真的想用,大不了自己配置一套,网上这样的教程铺天盖地. 废话不多说了,上配置步骤: 将CodeSourcery安装到了我的主目录下, 所以要在终端调用交叉编译链,必须配置环境变量,将有编译器的路径导入: export PATH=$PATH:/home/你的主目录/CodeSourcery/Sourcery_G++/bin 然后到一个工程目录下输入make: 输出: mybays@spaceship:~/store/luminary/workspace/proj/hello$ make clean mybays@spaceship:~/store/luminary/workspace/proj/hello$ make CC hello.c hello.c:24: warning: "DEBUG" redefined <command-line>:0: note: this is the location of the previous definition CC ../drivers/rit128x96x4.c ../drivers/rit128x96x4.c: In function 'RIT128x96x4Clear': ../drivers/rit128x96x4.c:456: warning: dereferencing type-punned pointer will break strict-aliasing rules CC startup_gcc.c LD gcc/hello.axf mybays@spaceship:~/store/luminary/workspace/proj/hello$
打开另外一个终端,输入openocd -f LM3S8962.cfg来建立调试链接. 然后在当前目录下创建.gdbinit文件,内容如下: target remote localhost:3333 #monitor soft_reset_halt
define rr target remote localhost:3333 monitor soft_reset_halt symbol-file hello.axf thbreak init continue end
define regs info reg end
define flash monitor halt #monitor stellaris mass_erase 0 monitor flash erase_address 0 65536 monitor soft_reset_halt monitor flash write_image hello.axf monitor verify_image hello.axf x/4 0 end
define f1 monitor flash erase_address 0 65536 end
define f2 monitor flash write_image hello.axf end
define mcm make clean; make end
define dis disassemble $pc-16 $pc+16 end
set print pretty set confirm off
然后输入命令:arm-stellaris-eabi-gdb 当出现(gdb)的提示符后输入flash进行编程: 输出结果如下: target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x81000000 pc: 0x00000128 msp: 0x200000ec erased address 0x00000000 length 65536 in 1.921976s requesting target halt and executing a soft reset target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0xfffffffe msp: 0xfffffffc not enough working area available(requested 8192, free 8152) Algorithm flash write 835 words to 0x0, 0 remaining wrote 3340 byte from file hello.axf in 0.300974s (10.837211 kb/s) verified 3340 bytes in 0.282134s 0x0: 536871180 1173 1165 1167 这个时候按下重启键,新编译的程序就会运行. 在linux下.gdbinit前有一个.符号,这表明此文件是隐藏着的,所以创建的时候要注意. 顺便告诉大家,前两天在用realview的MDK做优化测试,发现MDK编译器编译出来的代码反汇编后竟然和GCC的目标代码反汇编后惊人的相似,不知道是realview借鉴了GCC的一些技术还是两者都遵守ANSI C标准,这样才使得同样的C代码,两者编译的目标代码才会那么相似.
|