我们在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所示:
我们可以看到通过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所示:
我们需要把链接文件转换成“.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所示:
至此我们生成了最终的可执行程序“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所示:
然后使用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所示:
如果要清除工程,我们在终端执行“make clean”即可。
至此关于arm交叉编译器的使用,我们就先介绍到这里。编译生成了led.bin执行文件,下一步我们还需要给led.bin文件添加一些数据头才能执行。我们为用户提供了添加数据头的工具“create_imx”(光盘资料的“i.MX6UL终结者光盘资料\01_开发及烧写工具\2.裸机镜像制作工具”目录下),我们通过ssh工具拷贝该文件到led工程目录下,然后在终端输入命令“./create_imx led.bin”,生成bare.imx文件,如图 6所示:
现在我们开始使用MFG烧写工具来烧写(光盘资料的“i.MX6UL终结者光盘资料\01_开发及烧写工具\ 3.mfgtools_for_6ULL”文件夹),首先我们进到该文件夹,我们修改“cfg.ini”文件,如果您的板子是EMMC版本(8G flash容量),按照图 7的方式修改:
如果您的板子是NAND版本(512MB flash容量)(NAND版本的裸机验证我们需要使用一张TF卡),按照图 8所示修改:
修改完“cfg.ini”配置文件,然后我们在Ubuntu系统生成的“bare.imx”文件通过ssh工具拷贝到MFG烧写工具的“Profiles\Linux\OS Firmware\files\linux\”目录下,如图 9所示:
MFG烧写工具打开以后,我们使用开发板配带的USB数据线,连接开发板的OTG接口和PC的USB接口,使用开发板配带的电源连接到开发板的电源接口,然后开发板的拨码开关设置成USB启动,如图 11所示:
(如果我们使用的是NAND版本的开发板,我们需要先拔掉TF卡)然后按下开发板的电源开关,使开发板上电,此时我们会看到MFG烧写工具识别到开发板,如图 12所示:
(如果我们使用的是NAND版本的开发板,我们需要插入TF卡),然后我们点击MFG烧写工具的“Start”按钮,开始烧写镜像,如图 13所示:
然后我们在按下开发板的电源按键给开发板断电,然后修改拨码开关设置正常启动。
如果您的板子是EMMC版本(8GB Flash存储),拨码开关如图 15所示:
如果您的开发板是NAND版本(512M Flash存储),拨码开关如图 16所示(设置成TF卡启动模式):
最后我们在按下开发板的电源开关,给开发板上电,此时我们会看到开发板的LED2被点亮了,如图 17所示:
本节我们详细的介绍了如何编译代码,并且如何使用MFG烧写生成的镜像到开发板的Flash里面,并最终运行测试。后面我们的程序都是用MFG工具进行代码的烧写。