嵌入式Linux学习笔记(二) 交叉编译环境和Linux系统编译、下载

目录

(1).参考资料

(2).交叉编译环境构建

(3).uboot编译和验证

(4).Linux的编译

(5).文件系统的编译

 
   在上一章我们已经根据项目需求确定了后续的实现目标:首先就要熟悉自己的平台,完成交叉环境编译环境的构建,并进行嵌入式Linux系统编译,下载和执行,理论上来说,这部分的内容其实是相当复杂的,如何选择指定的编译器,uboot的执行和裁剪,配置内核满足应用需求,设备树的构建,文件系统的加载流程,这些都是需要去掌握的重要知识。但是在本项目的实现流程我们不能够在这部分花太多时间,并不是他们不重要,而是对于产品来说,这部分是成体系的东西,不应该在最初的时候花费太大的精力去理解细节,某些时候使用官方或者开发板厂商提供的资源包,以方便快速开发作为基础是比较合理的方法。当应用开发一段时间,在各方面有着基础之后,遇到问题在反过来去理解和掌握,化整为零,即可以增强收获感,也可以,学与用结合,事半功倍。本次编译都会使用正点原子提供的修改后的内核和系统文件,另外参考原子文档内的章节会讲解的更详细(具体细节按照原章节掌握更合理),这里因为篇幅原因只讲解流程中用到的知识,如果后续设计需要,则会根据应用需求来裁剪。
 

参考资料

  1.正点原子《Linux驱动开发指南说明V1.0》 第四章 开发环境搭建

  2.正点原子《Linux驱动开发指南说明V1.0》 第三十章 U-Boot使用实验

  3.正点原子《Linux驱动开发指南说明V1.0》 第三十七章 Linux内核移植

  4.正点原子《Linux驱动开发指南说明V1.0》 第三十八章 根文件系统移植

 

交叉编译环境构建

  选择正点原子A盘>5、开发工具>1、交叉编译器中已经下载好的编译工具,并根据Ubuntu系统位数的不同选择指定的编译器,如我安装的系统是64位,选择gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz文件

  1)在linux下使用指令sudo su,输入密码后进入root模式

  2) 使用指令创建文件夹

mkdir -p /usr/local/arm

  3)将gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.通过SSH Secure Shell Client上传到创建的/usr/local/arm文件夹下,如果上传失败,要用

chmod 777 /usr/local/arm

  修改路径的权限, 上传之后如图所示

  

 

  4)使用指令

tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

  解压到当前路径,如下:

  5)将路径添加到全局变量上,使用vim /etc/profile指令,在末尾添加

export PATH="$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin"

  同时使用vim /etc/environment,路径如下:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin"

  开启新的窗口,此时通过

echo $PATH

  即可查看全局路径下gcc的路径是否成功添加。

  注意:修改上述路径需要注意不要有语法错误,否则可能导致全局路径丢失,导致系统问题

  6)最后通过指令,即可查看是否安装成功

arm-linux-gnueabihf-gcc -v

 

  至此,交叉环境的编译即搭建完成,因为以应用为目的,所以后续都以开发板提供的工具为准,如果想了解编译器和下面的安装包,建议详细去看《Linux驱动开发指南说明V1.0》的指定章节。

 

uboot编译和验证

  从学习的角度来说,这三部分在整个嵌入式Linux的要占很大的比重,这部分很重要,而且也必须要掌握去了解,但是从应用的角度,首先最重要的是去实现需求,所以最初这部分不要去深究,因为偏离去学的话,一方面会占用大量的时间,另一方面这部分资料学起来分散,容易因为没有目标而不知道深入的重点,因此先以熟练使用为目标,后面在工程开发中穿插实现。因此这里就以正点原子提供的uboot和linux系统为准,在掌握这部分知识之前,需要确定Linux的启动方式,这部分会经常用到。

  

  1).使用光盘资料A盘>1、例程源码>3、正点原子修改后的Uboot和Linux,将解压后的文件上传到Ubuntu到的路径下。

  2).在/usr/code/uboot下使用

tar -xvf uboot-imx-2016.03-2.1.0-g9bd38ef-v1.0.tar.bz2

  指令解压,解决后结果如下:

   3).以我的硬件平台(ddr256M, nand512M为例), 使用默认配置文件为mx6ull_14x14_ddr256_nand_defconfig, 使用如下指令进行编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr256_nand_defconfig

  执行结果如下,即用于编译的.config的文件,最后执行编译指令:

make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

   如此就完成了编译,然后参考《Linux驱动开发指南说明V1.0》中8.4.3章节,使用imxdownload即可完成下载(具体如何下载参考。使用指令

./imxdownload u-boot.bin /dev/sdb

  即可实现下载,结果如下:

  至于sdb就是我的SD卡挂载的地址,可通过ls /dev/sd*查看,此外这个下载会格式化指定的路径,需要格外注意,不要出错。

  将SD卡插在嵌入式Linux平台上,修改Boot为Pin1,Pin7高,复位芯片,打印如下:

 

  到这一步初步完成了uboot的体验,此外uboot也支持很多指令,这些后面会了解到,按照进度会掌握。

 

Linux的编译

  1).使用光盘资料A盘>1、例程源码>3、正点原子修改后的Uboot和Linux,将解压后的文件上传到Ubuntu到的路径下,解压即可。

  2).在/usr/code/uboot下使用

tar -xvf linux-imx-4.1.15-2.1.0-g49efdaa-v1.0.tar.bz2

  指令解压,解决后结果如下:

  3).使用如下指令

cd arch/arm/boot/dts
vim Makefile
在400多行添加对应的设备树,如我的开发板对应:

使用:wq保存文件即可。

  4).使用如下指令进行编译

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

  执行结果如,即用于编译的.config的文件,最后执行编译指令:

make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

  如此即完成了编译,编译结果如下:

  

  编译之后文件路径在

arch/arm/boot/zImage
arch/arm/boot/dst/imx6ull-14x14-emmc-4.3-800x480-c.dts

  将上述文件和uboot文件通过SSH传输到Windows系统,为后面使用MfgTool工具下载做准备。

 

 文件系统的编译

  1).使用光盘资料A盘>1、例程源码>6、BusyBox源码,将解压后的文件上传到Ubuntu到的路径下,解压即可。

  2).在/usr/code/uboot下使用

tar -xvf busybox-1.29.0.tar.bz2

  指令解压,解压后结果如下:

   3). 修改Makefile文件,最好使用绝对路径,如果找不编译器,可通过指令echo $PATH查看当前路径是否添加,支持中文字符详细参考文档38.2.2说明。

164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
190 ARCH ?= arm

  4). 使用指令进行将链接编译到指定的路径

make install CONFIG_PREFIX=/usr/code/rootfs/nfs/

  5). 在编译后的路径添加文件夹,并将支持动态库添加到路径下,参考文档38.2.3说明。

  6). 参考38.2.4章节,创建/etc/init.d/rcS,内容

#!/bin/sh
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH runlevel
 
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

  创建文件etc/fstab,内容

#<system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0

  创建etc/inittab文件,内容

#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh 
::restart:/sbin/init 
::ctrlaltdel:/sbin/reboot 
::shutdown:/bin/umount -a -r 
::shutdown:/sbin/swapoff -a

  然后使用打包指令

tar -vcjf rootfs.tar.bz2 *

  获取打包文件: rootfs.tar.bz2

MgTool工具下载更新

  完成上述所有流程,我们就获得了最基础的底层应用结构,包含:

  Uboot   -- uboot.bin(重命名为imx6ull-14x14-nand-4.3-800x480-c.bin)

  Kernel  -- zImage, imx6ull-14x14-emmc-4.3-800x480-c.dts

  文件系统 -- rootfs.tar.bz2

  有了上述软件,就可以进行后续的代码下载,参考39.5章节说明:
  1. MgTool的工具使用原子提供,路径为A盘>5.开发工具>4.正点原子修改过的MFG_TOOL烧写工具>mfgTool,通关将拨码开关置到仅2为高,然后复位,使用Mfgtool2-NAND-ddr256-NAND.vbs指令先下载测试。
  2. MgTool的下载分为两部分,
    第一步为将Profiles/Linux/OS Firmware/firmware下的文件下载到DRAM中,在跳转执行系统
    第二步则与DRAM中运行的系统交互,将Profiles/Linux/OS Firmware/files内的文件通过UTP通讯使用指令将数据更新到NandFlash中
    这里就有个注意点:files路径下的文件才是要更新的固件,如果替换了firmware,而编译的内核不支持UTP通讯的话,后续就会停在Unconnected位置
  3. 替换firmware下的uboot,filesystem中的文件,名称要一致,内容如下
  uboot路径下替换
  
  filesystem下直接用rootfs替换,
  4. 替换后使用Mfgtool2-NAND-ddr256-NAND.vbs烧录即可, 另外如果出现tar error,可以直接删除Profiles/Linux/OS Firmware/ucl2.xml, 删除关于tar的指令
  
  烧录完成后结果如下(通过串口连接电脑,就是打印系统启动信息的串口,波特率115200):
  

   5.将boot置为Pin1, Pin5, Pin8为高,复位即可发现系统已经替换成我们编译的最小文件系统。

  

总结

  至此,关于项目方案实现的第一步就已经完成,在本节中,体验了编译uboot,内核和文件系统,并进行了烧录,但如果对比本节的内容和参考文档的相关说明,就会发现我省略了很多内容,举几个例子,官方的Uboot是如何变成原子的修改后的Uboot,如何通过make menuconfig配置符合需求应用,这部分重要吗,事实上很重要,未来的很多时候都要和这些知识打交道,但当你当刚踏入嵌入式学习的时候,去深入钻研,一方面没有概念,难以建立清晰的脉络认知,另一方面这部分是基石,知识繁杂且耗时,学习就很难快速给予反馈,这是最大的障碍,所以初步以运用为主,体验下流程即可,重心还是快速进入应用和驱动开发,等真正需要时(如将模块编入内核),就需要去深入掌握,但那时肯定有了足够的嵌入式Linux开发经验,也更容易去理解,事倍功半。

posted @ 2020-05-01 23:01  心的起始  阅读(2628)  评论(0编辑  收藏  举报