您的位置 首页 电路

Linux下arm裸机开发环境建立与实例

折腾了很长时间,总算是弄明白怎么在linux编译运行arm裸机程序了。编译运行arm裸机程序可以考虑用arm工具链搭建编译环境,由minicom和dnw来

折腾了很长时刻,总算是弄理解怎样在linux编译运转arm裸机程序了。编译运转arm裸机程序能够考虑用arm东西链建立编译环境,由minicom和dnw来下载程序,至于调试,还没有去耐性研讨,着急来这儿先备份一下,以免时刻久了,忘掉怎样回事。

首先是arm东西链,arm东西链的编译我就不写了,一方面很费事,另一方面是这方面的材料网上已经有很多了,我就不在这儿多言糟蹋咱们时刻了。我这儿有自己编译的arm东西链,当然,用网上现成的也不是不能够,可是最好是自己了解进程,以免必要的时分不会从源码装备。我将东西链上传到空间,假如需求,虽然拿去,链接地址为,运用说明看资源补白:

http://download.csdn.net/detail/girlkoo/3689485

这样,就能够开发一般的arm裸机程序了,现在开发环境是有了,编写能够编译经过的代码很是简略,可是编写真实运转正常的却不那么简略,因而,烧录东西仍是必要的,我引荐是用minicom和dnw,minicom模拟与windows下的超级终端有相同的功用,这样就能够像windows下开发环境相同与vivi对话了,别的,我在网上下来多个dnw和dnw2,可是发现dnw2在某些情况下不是很安稳,当然也有传闻的成分,不论怎样说,便是个东西,不论哪个,用着随手就行,我用的是dnw,也或许是我点背,下载的几个dnw烧录大的镜像能够,可是烧录自己开发的程序,只要二三百K的小文件却老是犯错,还好linux下是开放源码的,所以我就修改了一番,当然,限于水平要素,或许曲解了原作者的目的,不过偶然的是烧录小文件正常了,大的文件也能够,或许你用的时分并没有这个问题,那么请您运用原版的dnw,指出小弟缺陷,假如不幸画蛇添足求诸位不要喷我,下面是我修改后的dnw源码及运用说明,下载地址是:

http://download.csdn.net/detail/girlkoo/3689525

装备好上面两个东西后就能够开发arm2440的裸机程序了,当然移植体系或许还会用到其他牛B的东西,等用到再去研讨,假如有幸小弟弄理解了,还会来这儿记录下来的,下面附上两个linux下的arm裸机程序及makefile,感觉对我这样的新手来说仍是有协助的。

比如1:汇编文件led_on.S,代码如下,这儿我想告知咱们的是GNU的汇编跟规范的arm汇编是有收支的,详细的咱们能够查找“linux arm 汇编”来学习了解,网友给咱们供给了满足丰厚的资源。

  1. .text
  2. .global_start
  3. _start:
  4. ldrr0,=0x56000010
  5. ldrr1,=0x00155555
  6. strr1,[r0]
  7. ldrr0,=0x56000014
  8. movr1,#0x0
  9. strr1,[r0]
  10. MAIN_LOOP:
  11. bMAIN_LOOP

编译指令如下:

编译:arm-linux-gcc -g -c -o led_on.o led_on.S

链接:arm-linux-ld -Ttext 0x30000000 -g -o led_on.elf led_on.o

转化:arm-linux-objcopy -O binary -S led_on.elf led_on.bin

makefile能够这样写:

  1. led_on.bin:led_on.S
  2. arm-linux-gcc-g-c-oled_on.oled_on.S
  3. arm-linux-ld-Ttext0x30000000-gled_on.o-oled_on_elf
  4. arm-linux-objcopy-Obinary-Sled_on_elfled_on.bin
  5. clean:
  6. rm-fled_on.binled_on_elf*.o

比如2:假如运用厂家供给的Download and run,还能够编写纯C言语代码来操作arm芯片,下面是流水等的代码:

  1. #defineGPBCON(*(volatileunsigned*)0x56000010)
  2. #defineGPBDAT(*(volatileunsigned*)0x56000014)
  3. #defineGPBUP(*(volatileunsigned*)0x56000018)
  4. #defineMPLL100MHz0x0007f022
  5. #defineCLKDIV20x02
  6. #definerMPLLCON(*(volatileunsigned*)0x4c000004)
  7. #definerCLKDIVN(*(volatileunsigned*)0x4c000014)
  8. intmain()
  9. {
  10. inti=0;
  11. intcount=0;
  12. intLEDS[4]={0x1c0,0x1a0,0x160,0xe0};
  13. rMPLLCON=MPLL100MHz;
  14. rCLKDIVN=CLKDIV2;
  15. GPBCON=0x00155555;
  16. GPBUP=GPBUP&0xFF00;
  17. while(1)
  18. {
  19. for(count=0;count!=4;++count)
  20. {
  21. GPBDAT=LEDS[count];
  22. for(i=0;i<0x30000;i++);
  23. }
  24. }
  25. }

命令行下的编译流程我就不写了,直接把makefile贴在这儿吧

  1. led.bin:led.c
  2. arm-linux-gcc-g-c-oled.oled.c
  3. arm-linux-ld-Ttext0x30000000-gled.o-oled.elf-emain
  4. arm-linux-objcopy-Obinary-Sled.elfled.bin
  5. .PYTHON:clean
  6. clean:
  7. rm*.oled.elfled.bin

这儿我想提示一下,纯C的makefile与汇编的makefile是有点差异的,因为C的主函数是main,可是arm履行环境并不知道是main,因而需求显式的指定arm进口函数-e main,其他的就没什么可说的了,多文件编译能够运用推导,我相信到这儿咱们都能自己编写多文件的makefile了,我就不多说了,假如有朋友对此有疑问咱们一块评论,共同进步仍是好的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/256224.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部