本帖最后由 正点原子运营 于 2021-5-31 11:42 编辑
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,用于编译。
图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!”。
|