【系统移植】概述性扫盲

一、移植的步骤

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常用命令及用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值