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

Linux下arm裸机开发环境搭建与实例
折腾了很长时间,总算是弄明⽩怎么在linux编译运⾏arm裸机程序了。编译运⾏arm裸机程序可以考虑⽤arm⼯具链搭建编译环境,由minicom和dnw来下载程序,⾄于调试,还没有去耐⼼研究,着急来这⾥先备份⼀下,免得时间久了,忘记怎么回事。
⾸先是arm⼯具链,arm⼯具链的编译我就不写了,⼀⽅⾯很⿇烦,另⼀⽅⾯是这⽅⾯的资料⽹上已经有很多了,我就不在这⾥多⾔浪费⼤家时间了。我这⾥有⾃⼰编译的arm⼯具链,当然,⽤⽹上现成的也不是不可以,但是最好是⾃⼰熟悉过程,免得必要的时候不会从源码配置。我将⼯具链上传到空间,如果需要,尽管拿去,链接地址为,使⽤说明看资源备注:
这样,就可以开发普通的arm裸机程序了,现在开发环境是有了,编写可以编译通过的代码很是容易,但是编写真正运⾏正常的却不那么简单,因此,烧录⼯具还是必要的,我推荐是⽤minicom和dnw,minicom模拟与windows下的超级终端有相同的功能,这样就可以像windows下开发环境⼀样与vivi对话了,另外,我在⽹上下来多个dnw和dnw2,但是发现dnw2在某些情况下不是很稳定,当然也有听说的成分,不管怎么说,就是个⼯具,不管哪个,⽤着顺⼿就⾏,我⽤的是dnw,也可能是我点背,下载的⼏个dnw烧录⼤的镜像可以,但是烧录⾃⼰开发的程序,只有⼆三百K的⼩⽂件却⽼是出错,还好linux下是开放源码的,于是我就修改了⼀番,当然,限于⽔平因素,可能曲解了原作者的意图,不过巧合的是
烧录⼩⽂件正常了,⼤的⽂件也可以,或许你⽤的时候并没有这个问题,那么请您使⽤原版的dnw,指出⼩弟缺点,如果不幸弄巧成拙求诸位不要喷我,下⾯是我修改后的dnw源码及使⽤说明,下载地址是:
配置好上⾯两个⼯具后就可以开发arm2440的裸机程序了,当然移植系统可能还会⽤到其他⽜B的⼯具,等⽤到再去研究,如果有幸⼩弟弄明⽩了,还会来这⾥记录下来的,下⾯附上两个linux下的arm裸机程序及makefile,感觉对我这样的新⼿来说还是有帮助的。
例⼦1:汇编⽂件led_on.S,代码如下,这⾥我想告诉⼤家的是GNU的汇编跟标准的arm汇编是有出⼊的,具体的⼤家可以搜索“linux arm 汇编”来学习了解,⽹友给我们提供了⾜够丰富的资源。
[html]
1. .text
2. .global _start
3. _start:
4.    ldr r0,=0x56000010全面推开营改增
5.    ldr r1,=0x00155555
6.    str r1,[r0]
7.    ldr r0,=0x56000014
8.    mov r1,#0x0
9.    str r1,[r0]
10. MAIN_LOOP:
11.        b MAIN_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.Sf检验
2.    arm-linux-gcc -g -c -o led_on.o led_on.S
3.    arm-linux-ld -Ttext 0x30000000 -g led_on.o -o led_on_elf
4.    arm-linux-objcopy -O binary -S led_on_elf led_on.bin
5. clean:
6.    rm -f led_on.bin led_on_elf *.o
例⼦2:⽼师曾经跟我说arm必须⽤汇编引导启动,但是⽤C试了⼀下,发现没有汇编,⼀样能操作arm芯⽚,下⾯是让流⽔灯循环点亮的程序,
[html]
1. #define GPBCON    (*(volatile unsigned *)0x56000010)
2. #define GPBDAT    (*(volatile unsigned *)0x56000014)
3. #define GPBUP    (*(volatile unsigned *)0x56000018)
4. #define MPLL100MHz      0x0007f022
深证指数
5. #define CLKDIV2        0x02
6. #define rMPLLCON    (*(volatile unsigned *)0x4c000004)
7. #define rCLKDIVN    (*(volatile unsigned *)0x4c000014)
8. int main()
9. {
10.    int i = 0;
11.    int count = 0;
12.    int LEDS[4] = {0x1c0, 0x1a0, 0x160, 0xe0};
13.
14. rMPLLCON = MPLL100MHz;
15. rCLKDIVN = CLKDIV2;
16. GPBCON = 0x00155555;
17. GPBUP  = GPBUP & 0xFF00;
2015上海工博会
18.
19.    while(1)
20.    {
21.        for(count = 0; count != 4; ++ count)
22.        {
23. GPBDAT=LEDS[count];
24.            for(i = 0; i<0x30000;i++ );
25.        }
26.    }
27. }
命令⾏下的编译流程我就不写了,直接把makefile贴在这⾥吧
[html]
1. led.bin:led.c
2.    arm-linux-gcc -g -c -o led.o led.c
3.    arm-linux-ld -Ttext 0x30000000 -g led.o -o led.elf -e main
4.    arm-linux-objcopy -O binary -S led.elf led.bin
5. .PYTHON:clean
6. clean:
7.    rm *.o led.elf led.bin
奋进的旋律评价
这⾥我想提醒⼀下,纯C的makefile与汇编的makefile是有点区别的,由于C的主函数是main,但是arm执⾏环境并不知道是main,因此需要显式的指定arm⼊⼝函数-e main,其他的就没什么可说的了,多⽂件编译可以使⽤推导,我相信到这⾥⼤家都能⾃⼰编写多⽂件的makefile了,我就不多说了,如果有朋友对此有疑问可以联系qq630905224,我想⼤家⼀块讨论,共同进步还是好的,好了,浪费⼤家时间了。

本文发布于:2024-09-21 02:41:15,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/264557.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:汇编   程序   编译   开发   没有   免得
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议