arm裸机开发环境————windows与linux下对比

今天,其实主要分析简单的点灯程序如何在windows和linux下实现,因为arm的开发比较特殊,不像之前51,都是在windows下的(其实当时也不会这么想到底在那个环境下,因为学51的不会听谁说会在linux下开发,也应该也可以),所以一下子说什么arm一时来个什么ADS一时来个keil,突然又说什么交叉编译。虽然好像都不难懂,就有点晕,所以我今天理了一下,觉得会更好,以后那种环境都不会乱。


1、windows环境下arm裸机开发

这里要说一下,我用的是tq2440的开发板,因为开发板上会有很多对于初学者很有用的东西。首先,不管windows也好,linux也好,arm的开发都一样,就三个步骤:程序编辑,编译和烧写(关于烧写,我的上一遍博客有一些说明)。在windows下,我的开发软件是ADS,ADS就可以帮我们完成编辑和编译工作,对于编辑其实只管main函数的编编辑是很简单的(当然这里指的是点灯这个程序,其他的以后关键就是这个main函数,现在是说开发环境,所以main函数就变得次要了)。一开始,我们要知道的是平时我们学习51时,就直接在keil上编写,一些头文件之后就可以添加main函数,之后就是程序编写了,但是arm不可以,为什么呢?因为,51简单,只有一个EPRO给你烧程序,没有内部看门狗,没有cpu频率选择,堆栈指针sp更加一上电就自动指到ram的07h地址,之后可以改,用不到不改也可以。但是,arm呢,arm就复杂的多了,因为功能的需要,arm有nor flash和nand flash,arm的时钟频率一上电只有12M,arm的看门狗如果不关,上电3秒后自动复位,arm的sp是不会自动初始化的,因为arm存储空间的多样性,很难统一初始化(当然上电sp应该是初始化为某个值,但这个值一般不适合用,等于没有初始化,这一点我也没多深究,有错请指出),等等。所以arm的开发工具ads不会像51开发一样,你只要编辑好main函数,keil就可以在编译时,直接在rom的0地址帮你加个挑战到main函数的指令。就是说,51的启动文件其实简单到不能再简单,所以我们不要写,keil自动帮每个工程加进去了,因为也就一句跳转指令,而都一样。但是arm的启动文件就相对可以多样了,尤其真正的做到产品时,那时会更加需求具体设置。对于我们初学arm开发的人来说,其实启动文件不用自己怎么去编写,一个是自己平时用到的初始化不多,一多你也做不来,二来裸机开发时启动文件用同一个就可以。所以我现在就就是这样,直接借用开发板的测试程序上的启动文件,这个启动文件其实通用性也挺强,因为它就初始化了时钟,sp,屏幕,mmu,nand等,这些知道先就可以了,以后再慢慢研究。所以我用ads时,直接在工程文件用复制测试程序的启动文件,之后在ads设置中添加这个文件,这些一般的开发板都有说,只是一般不会分析这么具体。启动文件稿好了,就等于可以编辑main函数了,这个看着数据手册来编就好了。之后说一下,为什么要设置很多编译环境,就是ads设置那里。其实主要有2个方面,一个是设置文件顺序,一个是设置加载地址。我这里直接说了,大家可以看着自己开发板上ads配置文档来理解。因为加载地址可以多变,而这个不是在程序中配置的,配置好了编译器,然后编译时就可以根据这个option的设置来编译了,例如你配置好了加载地址,之后编译成汇编时,编译编译出来的汇编语句中用到的地址就是从哪里开始。否则直接从0地址或什么的开始,你的程序就跑飞了。


所以windows下ads的使用首先把option配置好,这样才可以编译出来的汇编语句用的地址正确,文件的链接顺序也对,第二,把开发板的测试程序中的启动文件添加进工程,这样启动初始化工作就可以了,之后把main函数搞好了就可以烧写了,windows烧写就是把.bin文件通过dnw软件烧到sdram调试,或者烧到nandflash。(烧到nand flash重启程序还在,但平时烧到sdram也可以,重启程序不存在了,当然,烧到不同地方,启动文件要相应改变)


2、linux下裸机开发,其实就是那三个步骤,但是有所区别。首先来说一下启动文件吧,这个启动文件其实也是用开发板提供的,然后就是编译环境设置了,linux下时靠makefile来完成的,通过makefile可以把这些都配置好,具体见开发板的makefile文件就知道了。这里把我的点灯程序的makefile列出了:  

led_on_c.bin : crt0.S  led_on_c.c
arm-linux-gcc -g -c -o crt0.o crt0.S
arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
arm-linux-ld -Ttext 0x00000000 -g  crt0.o led_on_c.o -o led_on_c_elf
arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
arm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis
clean:
rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o



其中crt0.S就是启动文件,arm-linux-ld -Ttext 0x00000000 -g  crt0.o led_on_c.o -o led_on_c_elf这一句就是指定加载地址为0x00000000,因为我是烧写到nand flash的,所以把这个.bin文件从nand flash的0地址开始烧进去就可以。



这个就是我的一些心得了,比较不严谨,因为只是自己的一些思考和想法,以及一些经验,仅供参考,希望多多交流。









你可能感兴趣的:(嵌入式arm)