专题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:裸机开发快速体验+交叉工具链
- ARM裸机开发-bootloader-交叉工具链
- ARM裸机开发快速体验
- [学习日志][2-2-1][裸机开发快速体验]
- tiny6410裸机实验第0章--------------开发环境的搭建(交叉编译工具链制作)
- 13.裸机程序和交叉编译工具链
- 交叉开发工具链
- 三.ARM裸机学习之dnw,SD卡工具下载及安装交叉编译工具链
- 快速游戏开发工具GameMaker,Action Game Maker使用体验
- VM虚拟机无法识别USB问题 -- 裸机开发流程 第三季 专题1 课程1
- javaEE开发工具专题
- ok6410裸机开发_裸机编程_烧写工具
- 裸机实验体验之usb启动配合dnw工具下载
- 裸机实验体验之usb启动配合dnw工具下载
- 交叉开发工具的使用
- 快速安装ubuntu交叉编译工具
- ubuntu 下快速安装交叉编译工具
- 335x裸机开发1
- python flask项目搭建web server
- 蓝牙开发
- 网页测试小插件
- 使用input标签 type='file' 上传图片的问题
- Cocos2dx报错undefined reference to 'cocos2d::Sprite::setDisplayFrameWithAnimationName(std::__1::basic
- 专题1:裸机开发快速体验+交叉工具链
- 静态类加载过程、对象的创建过程
- swift语言的学习笔记二(可选类型?和隐式可选类型!)
- linux 下sqlite的 C编程之sqlite3_get_table
- dubbo学习笔记 八 dubbo-common
- pig-0.11.1安装安装部署
- swoole深入学习 1. swoole初始
- 1015. 德才论 (25)
- Android 数据存储ContentProvider(类容提供者)之对外提供数据修改