• 嵌入式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开发经验,也更容易去理解,事倍功半。

  • 相关阅读:
    2019年春季学期第三周作业
    第十二周作业
    十一周作业
    第十周作
    第九周作业
    第八周作业
    第七周作业
    第六周作业
    第五周作业
    第四周作业
  • 原文地址:https://www.cnblogs.com/zc110747/p/12789964.html
Copyright © 2020-2023  润新知