正点原子 发表于 2021-5-31 11:52:52

《I.MX6U用户快速体验》第四章 ATK I.MX6U交叉编译

本帖最后由 正点原子 于 2021-5-31 12:06 编辑

1)实验平台:正点原子i.MX6ULL Linux阿尔法开发板
2)章节摘自【正点原子】《I.MX6U用户快速体验》
3)购买链接:https://item.taobao.com/item.htm?&id=603672744434
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子linux技术交流群:820906224





第四章 ATK I.MX6U交叉编译


搭建交叉编译环境是学习Linux很重要的一步,正点原子提供两种交叉编译工具链。这两种交叉编译工具链解释如下图。这两种编译器都有各自的作用,我们只要在相应的实验里使用指定的交叉编译工具链即可,切勿混着用。



图4 1 资料提供的两种交叉编译工具链

很多用户容易将上面两种交叉编译工具搞混。我们只需要知道上面的第二种通用的交叉编译器去学习【正点原子】I.MX6U嵌入式Linux驱动开发指南这本教程。第一种Poky编译器是Yocto项目编译出的,常用于编译开发板光盘A-基础资料->1、例程源码->3、正点原子Uboot和Linux出厂源码及快速编译Qt应用程序到开发板上运行。
4.1 安装通用ARM交叉编译工具链
详细请看【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.x.pdf的第4.3小节,这里不再重复写了。学习教程时需要再看,我们继续往下看其他部分。
4.2 安装Poky交叉编译工具链
把开发板光盘A-基础资料->5、开发工具->1、交叉编译器->fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh拷贝到Ubuntu虚拟机
如下图本文已经把交叉编译工具拷贝到了Ubuntu虚拟机。




图4.2 1 拷贝sdk工具包到ubuntu系统里

执行下面的指令修改脚本的权限,修改权限后可以看到此脚本颜色显示改变,说明修改成功。
chmod u+x fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh


直接执行脚本安装交叉编译工具,连续敲下两次回车键确认,再输入用户密码即可。本次安装的目录为脚本所指定的默认安装的目录,后面的内核编译环境的交叉编译都是按这个安装目录去操作,所以建议用户也是默认安装到/opt/fsl-imx-x11/4.1.15-2.1.0这个默认目录。




图4.2 2 安装sdk工具到默认的目录

使用方法也十分简单,根据上面打印出来的提示,直接使能环境变量就可以了。但是在不同终端或者切换用户时需要重新使能环境变量方可使用。
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi





图4.2 3 使能环境变量

使能环境变量后可以使用env指令查看生效的环境变量,下图为部分截图,可以看出使能了这个环境变量后gcc已经配置好编译时所用的参数,如硬浮点参数-mfpu=neon -mfloat-abi=hard。使用硬浮点交叉编译,可以使用CPU自带FPU。下图为环境变量部分截图。
env



图4.2 4 查看使能后的环境变量

使用arm-poky-linux-gnueabi-gcc -v指令可以查看gcc版本,表明环境变量已经生效。
arm-poky-linux-gnueabi-gcc --version


图4.2 5 查看gcc版本信息

要使用此编译器编译内核和U-boot还需要安装以下软件。
sudo apt-get update                // 先更新软列表
sudo apt-get install lzop      // 安装lzop工具,用于生成压缩或解压镜像
sudo apt-get install libncurses* // 安装ncurese相关库,U-boot或者内核菜单显示时需要


4.3 编译出厂源码U-boot
将开发板光盘A-基础资料->1、例程源码->3、正点原子Uboot和Linux出厂源码->uboot-imx-2016.03-2.1.0-gxxxxxx-vxx.tar.bz(x代表未版本,可能为.xz格式或者.bz2格式) U-boot源码解压到Ubuntu拷贝到虚拟机Ubuntu家目录(当前用户目录)下,使用tar指令解压。
先在家目录创建一个IMX6/uboot-imx-2016.03-2.1.0目录,并将U-boot源码解压到此目录。
mkdir -p IMX6/uboot-imx-2016.03-2.1.0
tar xf uboot-imx-2016.03-2.1.0-gd3f0479-v1.4.tar.xz -C IMX6/uboot-imx-2016.03-2.1.0/
cd IMX6/uboot-imx-2016.03-2.1.0
ls




图4.3 1 拷贝U-boot源码到Ubtuntu虚拟机

在编译U-boot之前,前提需要先安装4.2小节的Poky交叉编译工具链。
我们在Linux源码里写了一个脚本,脚本里已经配置好deconfig文件,和编译的目标文件。我们直接执行build.sh,即可编译U-boot源码。编译的目标文件会在当前U-boot源码顶层目录下的tmp文件夹里。
build.sh                // 开始编译出厂U-boot源码,生成u-boot.imx,第一级启动引导文件。
复制代码




图4.3 2 执行build.sh脚本,编译U-boot源码

编译完成后查看当前目录下的tmp文件夹编译的文件目标,*imx是已经添加头部信息的U-boot镜像,可直接使用dd指令烧写到TF卡和开发板上的eMMC储存设备,详细请参考【正点原子】I.MX6U 开发板文件拷贝及固件更新参考手册V1.x.pdf;*bin是未添加状信息的U-boot镜像,需要使用【正点原子】I.MX6U嵌入式Linux驱动开发指南里所说的imxdownload工具烧写。




图4.3 3 编译完成并查看编译的目标文件

4.4 编译出厂源码内核及模块
将开发板光盘A-基础资料->1、例程源码->3、正点原子Uboot和Linux出厂源码->linux-imx-4.1.15-2.1.0-gxxxxxx-vxx.tar.xz(x代表未知版本,可能为.xz格式或者.bz2格式)Linux源码拷贝到Ubuntu拷贝到虚拟机Ubuntu家目录(当前用户目录)下,使用tar指令解压。
首先在家目录下创建IMX6/linux-imx-4.1.15-2.1.0目录,我们将Linux源码解压到此目录下。
mkdir -p IMX6/linux-imx-4.1.15-2.1.0
tar xf linux-imx-4.1.15-2.1.0-gb78e551-v1.4.tar.xz -C IMX6/linux-imx-4.1.15-2.1.0/
cd IMX6/linux-imx-4.1.15-2.1.0
ls






图4.4 1解压Linux源码后查看内核源码目录下的文件

在编译内核之前,前提需要先安装4.2小节的Poky交叉编译工具链。
我们在Linux源码里写了一个脚本,脚本里已经配置好deconfig文件,和编译的目标文件。我们直接执行build.sh,即可编译Linux源码。编译的目标文件会在当前Linux源码顶层目录下的tmp文件夹里。
build.sh                // 开始编译出厂Linux源码,包括zImage,dtb和modules。






图4.4 2 执行build.sh编译Linux源码

编译完成,及查看tmp目录下的编译目标文件,如下图,包含很多dtb文件(设备树),及Linux内核zImage,还有modules.tar.bz2(内核模块)。




图4.4 3 编译完成及查看编译后的目标文件

更新内核的方法请参考【正点原子】I.MX6U 开发板文件拷贝及固件更新参考手册V1.x.pdf文档。
4.6 编译出厂Qt GUI综合Demo
在编译出厂Qt GUI之前,前提需要先安装4.2小节的Poky交叉编译工具链。
拷贝开发板光盘A-基础资料->1、例程源码->9、Qt综合例程源码下的QDestkop文件夹到Ubuntu虚拟机。如下图,编者已经拷贝到虚拟机家目录(用户目录)下,查看QDesktop目录下的文件如下。




图4.6 1 拷贝QDesktop工程到Ubuntu虚拟机

使能第4.2小节的交叉编译环境变量。
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi





图4.6 2 使能交叉编译环境变量

执行qmake,生成Makefile,用于编译。
qmake






图4.6 3 生成Makefile用于编译

执行make,开始编译Qt综合Demo。
make -j 16      // -j 16是允许最大同时16条编译任务同时执行,16一般取分配虚拟机的核心数的2倍


编译过和中有报警告,可忽略。编译完成如下图,编译得到的QDesktop文件,可以直接拷贝到出厂系统下直接执行./QDestkop即可。



图4.6 4 编译成功,生成QDesktop可执行文件

在开发板运行后的桌面如下,Qt Demo的用法都在每个App里右上角的“关于”页面可查看。



图4.6 5 出厂GUI第一屏演示

4.7 编译一个简单的c文件
在编译出厂Qt GUI之前,前提需要先安装4.2小节的Poky交叉编译工具链。
本文新建一个test文件夹,在test文件夹下编辑一个main.c文件,使用vi/vim指令,复制下面的内容。程序功能是打印一句“hello world!”,拷贝以下内容到vi/vim编辑器窗口里。按i进入插入模式,右键进行粘贴内容,粘贴成功后按ESC键退出编辑模式,然后输入:wq保存并退出。
mkdir test
cd test
vi main.c
在main.c复制粘贴下面的内容。
#include <stdio.h>
int main(void)
{
      printf("hello world!\n");
      return 0;
}

如果您在上文已经使能过环境变量就不用再执行下面这一步了。
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi


编译main.c文件,指令解释
(1)$CC :$是取值符号,取终端的环境变量CC的值.
(2)main.c :c文件
(3)-o :参数-o,后面加编译的目标文件
$CC main.c -o main
或者写成下面这样来编译main.c文件也是可以的,实际是把$CC的值换成了如下,下面为一条指令,由于PDF格式问题,建议分段复制。
arm-poky-linux-gnueabi-gcc-march=armv7ve -mfpu=neon-mfloat-abi=hard -mcpu=cortex-a7 --sysroot=$SDKTARGETSYSROOT main.c -o main





图4.7 1 编译main.c

编译好的main文件,直接拷贝到出厂系统里,在串口终端执行./main,结果是串口打印一句“hello world!”。

页: [1]
查看完整版本: 《I.MX6U用户快速体验》第四章 ATK I.MX6U交叉编译