【北京迅为】i.MX6ULL终结者编译LED汇编程序 Linux系统读写网卡PHY寄存器工具 洛谷:P1226 【模板】快速幂||取余运算(分治,数学) 【2020顶会KDD】AutoST:面向时空预测的高效神经网络学习模型 C/C++实现并查集disjoint_set的模板(带路径压缩优化) 实现一个百万级推送服务,除了它,还有谁 “健康守护者”——STM32标准库和HAL库的比较 程序员被公司辞退12天后,前领导要求回公司讲清代码,结果懵了 RTTR实现C++反射(1)集成rttr库 lotus node 远程运行 CCF历年4,5题收录 N卡 RTX3070/RTX3080/RTX3090挖矿算力推测 最高算力86MH 理论+实验:MySQL索引、事物与存储引擎 PostgreSQL JOIN 多表查询 TP框架实现Excel批量导入数据库数据 MySQL中的列转行 这次是真拯救了我,MySQL索引优化,explain讲得非常清楚了 Oracle快速入门(PLSQL编程) MySQL字符串拼接、截取 MySQL事务管理及存储引擎 《浪姐》万茜点赞宁静、郁可唯黑贴坐实?盗号者和程序员是背锅侠 程序员被公司辞退12天后,前领导要求回公司讲清代码,结果懵了 易语言大漠多线程foobar在游戏多窗口中时时显示输出信息 非科班,自学两年,复盘两个月,侥幸拿到头条、阿里offer 2020年全国数学建模大赛B题源代码以及模型的建立 (2) 2020年数学建模-校园供水系统智能管理 windows破解锁屏密码(亲测有效:再也不怕别人锁屏防你啦!) 清华大佬力荐的JVM学习路线+实战笔记+阿里真题,嚼碎吃透吊打面试官 打造多模块+高可用+高扩展Spring Cloud版分布式电商项目源码分享 Python爬虫入门教程 89-100 定个小目标,先用Python爬个一亿B站用户 五大分布式事务,你了解多少? 2020-09-12 九大核心专题,630页内容,熬夜23天吃透,我收割了3个大厂offer 防抖节流 防抖和节流 函数节流 debounce throttle 每天补充一点 一些零碎的小知识点 JavaScript作用域和作用域链知多少 01-jquery概述 简单概述JSONP原理 02-$符号-jquery与js相互转换 遇见 vue.js --------阿文的vue.js学习笔记(2)----- 基本使用 全国鞋服行业首个5G专项应用落地柒牌 自动搬运作业提升效率150% 大数据系统提高生产效率超10% [网络安全自学篇] 九十四.《Windows黑客编程技术详解》之提权技术(令牌权限提升和Bypass UAC) 鸿蒙OS 2.0 开源蹭热浅读 蚂蚁三面滑铁卢!遭分布式截胡,靠这些笔记潜修30天,挺进京东 【高并发】Redis如何助力高并发秒杀系统,看完这篇我彻底懂了!! K8s概述:几种集群方案的对比 Linux到底该怎么学?RHCA架构师整理了300页学习笔记 到了2020年,技术水平到底需要达到怎样的程度才能成为顶级的阿里P8架构师 Linux怎么学?一张思维导图带你深入Linux核心原理 金九银十首战告捷!凭借这份Alibaba爆款“面试宝典”成功斩获美团Offer
您的位置:首页 >物联网 >

【北京迅为】i.MX6ULL终结者编译LED汇编程序

我们在Ubuntu下通过vim编辑好LED的汇编程序(6.6章节),然后保存并退出。然后我们使用arm交叉编译器来编译该程序,我们在终端输入“arm-linux-gnueabihf-gcc -g -c led.s -o led.o”命令,把led.s编译成led.o,其中的“-g”参数是产生调试信息,可以使用GDB来调试代码。“-c”参数是编译源文件,不链接。“-o”参数是指定产生的文件名称,我们指定生成led.o,运行效果如图 1所示: 在这里插入图片描述

图 1

我们可以看到通过arm交叉编译生成了led.o文件,这个文件相当于中间文件,我们还需要把编译生成的.o文件链接起来生成可执行文件(我们这里只有一个led.o,对于有的工程可能会生成多个.o文件)。

接下来我们使用交叉编译器的“arm-linux-gnueabihf-ld”命令来把“.o”文件链接起来。链接的目的就是把我们的程序固定到某个地址,这样cpu在运行的时候就可以通过链接地址找到我们的程序,并运行它。在链接之前我们需要先了解下i.MX6ULL的启动,i.MX6ULL支持SD卡,EMMC,NAND等方式启动,i.MX6ULL启动的时候首先将代码从SD卡,EMMC,NAND中拷贝到运行地址,然后开始从运行地址处开始运行, i.MX6ULL芯片内部有128K的RAM(0X900000~0X91FFFF),另外外部扩展了DDR,所以i.MX6ULL的链接地址可以是内部的RAM,也可以是外部的DDR。我们所有的例程都是链接到DDR中,其地址为0X87800000。i.MX6ULL终结者开发板的DDR有两种:256MB和512MB,起始地址都是0X80000000。256MB的终止地址是0X8FFFFFFF,512M的终止地址是0X9FFFFFFF,之所以选择地址0X87800000,是因为后面我们要学的Uboot链接地址也是0X87800000。所以为了学习方便,我们统一使用0X87800000地址。

下面我们开始使用arm-linux-gnueabihf_ld命令将前面我们生成的“led.o”文件链接到0X87800000地址处,我们在终端输入“arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf”,其中的“-Ttext”指定链接地址(0X87800000),“-o”生成链接文件名,运行效果如图 2所示: 在这里插入图片描述

图 2

我们需要把链接文件转换成“.bin”文件,然后烧写到EMMC,才能运行。 接下来我们使用“arm-linux-gnueabihf-objcopy”命令将链接文件led.elf转换成“led.bin”文件。我们在终端输入“arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin”命令,其中“-O”指定以什么格式输出(binary表示二进制输出),“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息,运行效果如图 3所示: 在这里插入图片描述

图 3

至此我们生成了最终的可执行程序“led.bin”文件。 我们可以总结下,为了生成led.bin文件,我们分别使用了命令: arm-linux-gnueabihf-gcc -g -c led.s -o led.o arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

为了编译方便,我们可以使用Makefile来编译我们的led汇编程序,首先我们在led工程目录下使用“touch Makefile”命令创建Makefile文件,如图 4所示: 在这里插入图片描述

图 4

然后使用vim编辑器打开Makefile文件,输入下面的命令: led.bin:led.s arm-linux-gnueabihf-gcc -g -c led.s -o led.o arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin clean: rm -rf *.o led.bin led.elf 添加完上面的命令,保存并退出,然后在led工程目录下执行“make”命令编译led.S,过程如图 5所示: 在这里插入图片描述

图 5

如果要清除工程,我们在终端执行“make clean”即可。

至此关于arm交叉编译器的使用,我们就先介绍到这里。编译生成了led.bin执行文件,下一步我们还需要给led.bin文件添加一些数据头才能执行。我们为用户提供了添加数据头的工具“create_imx”(光盘资料的“i.MX6UL终结者光盘资料\01_开发及烧写工具\2.裸机镜像制作工具”目录下),我们通过ssh工具拷贝该文件到led工程目录下,然后在终端输入命令“./create_imx led.bin”,生成bare.imx文件,如图 6所示: 在这里插入图片描述

图 6

现在我们开始使用MFG烧写工具来烧写(光盘资料的“i.MX6UL终结者光盘资料\01_开发及烧写工具\ 3.mfgtools_for_6ULL”文件夹),首先我们进到该文件夹,我们修改“cfg.ini”文件,如果您的板子是EMMC版本(8G flash容量),按照图 7的方式修改: 在这里插入图片描述

图 7

如果您的板子是NAND版本(512MB flash容量)(NAND版本的裸机验证我们需要使用一张TF卡),按照图 8所示修改: 在这里插入图片描述

图 8

修改完“cfg.ini”配置文件,然后我们在Ubuntu系统生成的“bare.imx”文件通过ssh工具拷贝到MFG烧写工具的“Profiles\Linux\OS Firmware\files\linux\”目录下,如图 9所示: 在这里插入图片描述

图 9

然后我们鼠标双击打开MFG烧写工具,如图10所示: 在这里插入图片描述

图 10

MFG烧写工具打开以后,我们使用开发板配带的USB数据线,连接开发板的OTG接口和PC的USB接口,使用开发板配带的电源连接到开发板的电源接口,然后开发板的拨码开关设置成USB启动,如图 11所示: 在这里插入图片描述

图 11

(如果我们使用的是NAND版本的开发板,我们需要先拔掉TF卡)然后按下开发板的电源开关,使开发板上电,此时我们会看到MFG烧写工具识别到开发板,如图 12所示: 在这里插入图片描述

图 12

(如果我们使用的是NAND版本的开发板,我们需要插入TF卡),然后我们点击MFG烧写工具的“Start”按钮,开始烧写镜像,如图 13所示: 在这里插入图片描述

图 13

等到进度条显示绿色,烧写完成,如图 14所示: 在这里插入图片描述

图 14

然后我们在按下开发板的电源按键给开发板断电,然后修改拨码开关设置正常启动。 如果您的板子是EMMC版本(8GB Flash存储),拨码开关如图 15所示: 在这里插入图片描述

图 15

如果您的开发板是NAND版本(512M Flash存储),拨码开关如图 16所示(设置成TF卡启动模式): 在这里插入图片描述

图 16

最后我们在按下开发板的电源开关,给开发板上电,此时我们会看到开发板的LED2被点亮了,如图 17所示: 在这里插入图片描述

图 17

本节我们详细的介绍了如何编译代码,并且如何使用MFG烧写生成的镜像到开发板的Flash里面,并最终运行测试。后面我们的程序都是用MFG工具进行代码的烧写。

在这里插入图片描述

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。