一、移植的步骤
1、确定目标机以及主机的连接方式;
1)UART异步串行通信接口(串口):速率低,实时性强
2)USB串行通信接口:速率快,驱动要移植修改
3)TCP/IP网络通信接口:速率快(10-100Mbps),驱动要移植修改
4)Debeg Jtag调试接口:方便快捷,价格昂贵
2、安装交叉编译器;
1)安装芯片厂商已经编译好的工具链(推荐)
arm-none-linux-gnuebi-
arm-linux-
arm-none-eabi-
arm-elf-
codesourcery gcc——>x86
2)自己手动编译交叉工具链
the GNU Toolchain for ARM Target HOWTO.
3)具体安装:解压缩过程,解压到linux标准目录
方法一: #arm-linux-gcc -o build 1.c 添加PATH环境变量
方法二:#/opt/FriendlyARMtoolschain/4.5.1/bin/arm-linux-gcc -o build 1.c 绝对路径法
3、搭建主机—目标机数据传输通道
4、编译三大子系统
5、烧写测试
二、交叉编译工具集
.交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] [-gcc]
arch – 体系架构,如ARM,MIPS
vendor – 工具链提供商
os – 目标操作系统
eabi – 嵌入式应用二进制接口(Embedded Application Binary Interface)
1、readelf:交叉elf文件工具 arm-linux-readelf 其中, -a 参数是查看.elf文件的所有内容
注意:编译的程序运行不了有两个原因:一个是要看运行平台对不对,第二个是要看处理器的大小端跟编译的程序的大小端是否对应,可以使用arm-linux-readelf -a xxx.elf 命令查看编译出来的程序大小端情况和程序运行平台。
如下图所示,编译后的程序只能运行在小端(little endian)的处理器上,其运行平台Machine是ARM。绝大多数ARM处理器都是小端的。
查看程序运行平台还可以使用file xxx (xxx为编译后可执行文件) 命令查看。
如一个应用程序不能执行,排除了运行平台和大小端的情况后,还有可能是库不对。
使用arm-linux-readelf -d xxx (xxx为编译后可执行文件)查看运行库;如hello程序运行库为libc.so.6,如果开发板上没有这个库,程序是运行不了的。
2、size:查看可执行文件大小
3、nm:查看可执行文件的符号表
4、strip:剔除符号表(符号表只是供我们人看的;可以使可执行文件变小
5、strings:查看常量字符串
6、objdump:
交叉反汇编器 arm-linux-objdump
把hello.c文件编译成hello可执行文件:arm-linux-gcc hello.c -o hello
用法:arm-linux -objdump -D -S hello >dump
把hello可执行文件反汇编后输入保存到dump文件中。
-D -S 是反汇编参数,>dump 把hello反汇编后的内容保存到dump文件中
注意: 在编译hello时没有使用-g参数,反汇编后的代码和原来C代码对应不起来。我们可以在编译hello时使用-g参数:
先把hello.c文件编译成hello可执行文件:arm-linux-gcc -g hello.c -o hello;运行arm-linux -objdump -D -S hello >dump命令,打开dump文件可以看到
7、objcopy: arm-linux-objcopy
使用arm-linux-objcopy命令可以把ELF格式的文件转换成二进制文件。
文件格式转换的原因:elf格式的文件不能直接在ARM上运行(ARM只能运行二进制格式的文件);
用法:arm-linux-objcopy -O binary led.elf led.bin
把led.elf格式的文件转换成led.bin二进制文件。
8、addr2line:将代码中哪一行出错表示出来;
9、gcc: 交叉编译器arm-linux-gcc
和X86平台下的gcc的基本用法用法是完全一样的;不同之处:标准的gcc所引用的头文件路径为 /usr/include/stdio.h,arm-linux-gcc所引用的头文件路径为其安装路径下,如 /usr/local/armtools/4.5.1/bin/..
10、ld: 交叉链接器 arm-linux-ld
arm-linux-ld命令是ARM平台下的交叉链接器,把程序链接成可以在ARM平台下运行。
用法: arm-linux-ld -Tled.lds led.o -o led.elf
把led.o链接成led.elf文件;led.lds是链接器脚本,
三、系统移植
1、uboot常用命令
1)print 查看软件uboot的环境变量
变量名 = 变量值
2)setenv、saveenv
setenv abc 100 200 设置 添加一个变量值,修改一个以后的变量
setenv abc 删除这个变量
saveenv 把本次的设置的环境变量 写向存储器
3)nand
nand erase:擦除NAND,格式:nand erase addr1 count,第一个参数是OFFSET,第二个参数是擦除字节数。其中OFFSET是相对于Download地址。
nand write:下载的内存数据写入NAND,格式:nand write addr offset count,第一个参数是写入基地址,第二个参数是偏移地址,第三个参数是写入字节数。
nand read:讲NAND数据读取到内存,格式:nand read addr offset count,第一个参数是读取的NAND地址,第二个参数是内存位置偏移,第三个参数是读取字节数。
nand bad:测试NAND FLASH坏块的命令。如:nand bad,即可显示坏的区块地址。
假设Download Address: 0xc0000000,Download Filesize:0x1df48c
nand erase 600000 300000 //擦除c0600000为开始的300000个字节
nand write c0000000 600000 300000 //往刚擦除的空间写入内存起始地址的数据共300000个长度
nand read c0600000 600000 300000 //读取刚写入的NAND地址共300000个长度到偏移600000的内存中
cmp c0600000 c0000000 300000 //比较两段内存的数据是否相同
4)tftp
U-boot中的TFTP用于发送较小的文件。下层使用UDP协议,发送使用UDP 69端口,每次发送的最大分组为512 Bytes。发送双方采用超时重传机制。数据传输模式为octet模式( 二进制模式 )。
在U-boot中使用tftp功能可以使用如下命令:
tftp MemoryAddress FileName
其中MemoryAddress为放入文件的内存首地址,FileName为传送文件的文件名(文件需放在tftp默认目录下)。
5)bootm
bootm //用于启动内核
用法: bootm 0x42000000 //从内存地址0x42000000启动内核, 启动前需把内核镜像uImage存放到指定的内存地址
6)go
go //执行指定内存地址上的指令
用法:
go 0x40008000
2、内核启动的条件
1)启动参数
root = 启动的根文件系统在哪个设备
设置信息 Ram NFS flash
init = 内核启动后,第一个可自行文件init进程从哪里来
donsole = 内核启动时,使用哪个设备作为控制台
2)文件系统
3、文件系统烧写
1)NFS
TCP/IP C-S
服务端:sudo apt-get install nfs-kemel-server(PC)
配置:/etc/exports
客户端: boorargs(开发板、设置启动参数)
自动运行: bootdelay bootcmd
nand read 20008000 100000 200000 nand read 21000000 56000000 400000 bootm 20008000
2)Ramdisk
root = /dev/ram
initrd = 0x21000000.8M
init = /linuxrc
console = ttySAC0
测试:
内存 20008000 uImage
21000000.initrd.img.gz
tftp 20008000 uImage 下载内核(出现问题重启板子)
tftp 21000000 initrd.img.gz(已存在的文件) 部署文件系统
setenv bootargs root= /dev/ram initrd=0x21000000, 8M init= /linuxrc console==ttySAC0,115200 设置启用参数
bootm 2008000 跑起内核
参考:https://www.cnblogs.com/coolYuan/p/9037660.html 交叉编译工具链(详解)
https://blog.csdn.net/pengfei240/article/details/52912833 交叉编译详解 一 概念篇
https://blog.csdn.net/jiangxiaoweijxw/article/details/89786869 MCU_ARM_Uboot常用命令_交叉编译工具集_内核启动条件
https://www.cnblogs.com/shangbolei/p/4376115.html Uboot常用命令
https://www.cnblogs.com/x_wukong/p/9244742.html uboot常用命令及用法