欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

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

程序员文章站 2022-07-03 09:10:47
我们在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文件,这个...

我们在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所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 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所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 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所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 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所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 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所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 5

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

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

图 6

现在我们开始使用MFG烧写工具来烧写(光盘资料的“i.MX6UL终结者光盘资料\01_开发及烧写工具\ 3.mfgtools_for_6ULL”文件夹),首先我们进到该文件夹,我们修改“cfg.ini”文件,如果您的板子是EMMC版本(8G flash容量),按照图 7的方式修改:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 7

如果您的板子是NAND版本(512MB flash容量)(NAND版本的裸机验证我们需要使用一张TF卡),按照图 8所示修改:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 8

修改完“cfg.ini”配置文件,然后我们在Ubuntu系统生成的“bare.imx”文件通过ssh工具拷贝到MFG烧写工具的“Profiles\Linux\OS Firmware\files\linux\”目录下,如图 9所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 9

然后我们鼠标双击打开MFG烧写工具,如图10所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 10

MFG烧写工具打开以后,我们使用开发板配带的USB数据线,连接开发板的OTG接口和PC的USB接口,使用开发板配带的电源连接到开发板的电源接口,然后开发板的拨码开关设置成USB启动,如图 11所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 11

(如果我们使用的是NAND版本的开发板,我们需要先拔掉TF卡)然后按下开发板的电源开关,使开发板上电,此时我们会看到MFG烧写工具识别到开发板,如图 12所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 12

(如果我们使用的是NAND版本的开发板,我们需要插入TF卡),然后我们点击MFG烧写工具的“Start”按钮,开始烧写镜像,如图 13所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 13

等到进度条显示绿色,烧写完成,如图 14所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 14

然后我们在按下开发板的电源按键给开发板断电,然后修改拨码开关设置正常启动。
如果您的板子是EMMC版本(8GB Flash存储),拨码开关如图 15所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 15

如果您的开发板是NAND版本(512M Flash存储),拨码开关如图 16所示(设置成TF卡启动模式):
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 16

最后我们在按下开发板的电源开关,给开发板上电,此时我们会看到开发板的LED2被点亮了,如图 17所示:
【北京迅为】i.MX6ULL终结者编译LED汇编程序

图 17

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

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

本文地址:https://blog.csdn.net/BeiJingXunWei/article/details/108545172