专题1:裸机开发快速体验+交叉工具链

来源:互联网 发布:网络机柜理线路图 编辑:程序博客网 时间:2024/05/17 12:47

第一课:裸机开发快速体验
在windows上的集成开发环境(如ADS、RVDS)进行嵌入式开发过程中,实际上开发环境已经帮助开发者完成了例如makefile、链接等过程,程序开发者不能很好理解其中的机理,故在以后的开发中都在linux中开发。
在linux中,需要开发者去写makefile、lds脚本,以及学会调试eclipse。

本课从体验的过程中总结使用了什么工具,了解裸机开发的流程。
过程:
1)编写裸机程序
2)调试裸机程序
3)生成2进制文件(编译、链接、格式转换)
(1)安装交叉工具链
建立目录/home/S3-ARM/part1/lesson1,并将ARM-tools.tar.gz拷贝到此处。
解压ARM-tools.tar.gz:
tar xvzf ARM-tools.tar.gz -C / (解压到根目录中去,实际上被解压到/usr/local/arm/4.3.2/bin去了,可以通过ls查看是否有。)
因为工具被解压到/usr/local/arm/4.3.2/bin去了,故在/home下运行#arm-linux-gcc 是否报错的,此时要修改环境变量:
[root@localhost home]# vim /root/.bashrc
(进去后加上一条)export PATH=$PATH:/usr/local/arm/4.3.2/bin

(2)修改完成后,利用各种工具去生成2进制文件:
首先将下面文件拷贝到/home/S3-ARM/part1/lesson1中:
这里写图片描述
交叉编译器:
[root@localhost home]# arm–linux-gcc -g -c led.S
(ls后可以发现多了一个目标文件led.o,-c的意思是只编译不链接)
链接器脚本:
[root@localhost home]# arm-linux-ld -Tled.lds -o led.elf led.0
(.lds为链接器脚本文件,.elf格式不对,不能烧写到开发板,下面进行二进制转换;其中,-T表示使用链接器脚本,中间没有空格,将所有的.o文件链接为一个.elf文件,这里是有一个.o文件。可以多个)
[root@localhost home]# arm-linux-objcopy -o binary led.elf led.bin
(生成led.bin二进制文件)
Makefile的使用:(一键搞定)
[root@localhost home]# make clean (清除以上生成的所有文件)
[root@localhost home]# make(执行make后发现led.bin又生成了)

4)烧写、运行2进制映像

将生成好的裸机程序(led.bin)烧写到nand flash中去,2440的板子有nor flash,6440或210中有SD卡,都是通过norflash或SD卡中的 引导辅助程序
把程序通过usb下载到开发板中去。
引导辅助程序在上几节课已经下载到norflah中去了,此时直接连通串口,依次进行x(擦除nandflash)、v操作(下载可执行程序程序,这里是led.bin,事先连接好linux与开发板的usb接口。)
烧写完成后,将flash启动开关拨到nandflash,重新上电,可以观察到led被点亮,如下图。
这里写图片描述
至此,体验完毕。

第2课:交叉工具链
1、什么是交叉工具链?
gcc编译的程序只能在windons上运行,不能在开发板上运行,开发板上要使用arm-linux-gcc。可以通过下面方式实验查看两者区别:
[root@localhost home]# gcc hello.c -o hello-x86
[root@localhost home]# arm-linux-gcc hello.c -o hello-arm
[root@localhost home]# file hello-x86
[root@localhost home]# file hello-arm

这里写图片描述

2、常用交叉工具
1)交叉编译器 arm-linux-gcc
使用方法和gcc一样,但gcc在/usr/include中寻找头文件,但arm-linux-gcc 在/usr/local/arm中找头文件(1、arm-linux-gcc –help 2、查看上面的参数找到-print-search-dirs)
这里写图片描述

2)交叉链接器 arm-linux-ld(用法见上一课)

3)elf文件读取工具 arm-linux-readelf
[root@localhost home]# arm-linux-readelf -a led.elf
这里写图片描述
(arm绝大部分是小端模式的,网络一般是大端)
如果2进制代码不能在arm板运行运行?
一般有两个原因;
(1)程序不是运行在arm上的,或大小端模式不对:查看是否是运行在arm上:[root@localhost home]# file hello
这里写图片描述
大小端的查看用上面的 arm-linux-readelf -a led.elf

(2)查看arm中是否有支持的库文件
[root@localhost home]# arm-linux-readelf -d led.elf
这里写图片描述

4)反汇编器 arm-linux-objdump
当我们编写的一个程序运行的效果不是我们想要的时,我们需要去查看它们的汇编代码,这在底层开发中非常重要。需要将编译好的程序变成汇编语言。(这个和核心转存 core dump不一样)
[root@localhost home]# arm-linux-objdump -D -S hello >dump
[root@localhost home]# vim dump
这里写图片描述
如果觉得汇编和c语言对应不上,可以在编译时加入“调试信息”后再执行以上两步:
[root@localhost home]# arm-linux-gcc -g hello.c -o hello
这里写图片描述

5)文件格式转换器 arm-linux-objcopy
因为编译的.elf文件不能直接在开发板上运行,能够在开发板上运行的程序一定是2进制程序(但为什么arm-linux-gcc hello.c -o hello产生的hello文件能在开发板上运行呢?虽然没有手动进行格式转换,但是因为开发板上运行的是linux系统(不是裸机),系统上的elf解析器能够将.elf文件转换问.bin文件)。(——-linux识别u盘再进入优盘中,利用串口直接执行hello,注意这种方式。)
那么如何将一个.elf文件转变为2进制文件呢?—文件格式转换器 arm-linux-objcopy
[root@localhost home]# arm-linux-objcopy -O binary led.elf led.bin
这里写图片描述

后注:arm-linux-gcc的命名不是一定的,-gcc前面的一般比较灵活,但其作用不变。
arm-linux-gcc –help (查看工具的用法)

1 0
原创粉丝点击