arm-linux-gnueabihf交叉编译的一个例子,较详细

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

提示:以下是本篇文章正文内容,下面案例可供参考

将I.MX6U的IO作为GPIO使用的步骤

1、使能GPIO对应的时钟
2、设置寄存器IOMUXC_SW_MUX_CTL_PAD_XX_XX,使其复用为 GPIO功能(配置复用)
3、设置寄存器IOMUXC_SW_PAD_CTL_PAD_XX_XX,设置IO的上下拉,速度等(配置IO参数)
4、配置GPIO,设置输入输出,是否使用中断,默认输出电平等

实际例子

原子哥在线教育
根据原理图分析,需要对GPIO1_IO03做如下的配置:
1、使能GPIO1时钟
GPIO1的时钟由CCM_CCGR1的bit27和bit26两位控制,都设置为1即可。
2、设置GPIO1_1O03的复用寄存器“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03”的地址为0x020E0068,然后设置此寄存器。将GPIO1_IO03这个IO复用为GPIO,即ALT5。
3、配置GPIO1_IO03
找到GPIO1_IO03的配置寄存器“IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03”的地址为0x020E02F4,根据实际使用情况,配置此寄存器。
4、设置GPIO
复用GPIO1_IO03为GPIO功能,所以需要配置GPIO。找到GPIO3对应的GPIO组寄存器地址。
作为输出功能的话,GPIO1_GDIR的bit3要设置为1,表示输出。
5、控制GPIO的输出电平
上述4个步骤已经配置好GPIO1_IO03了,只要向GPIO1_DR寄存器的bit3写入0即可控制GPIO1_IO03输出低电平,反之写入1控制输出高电平。即能够控制LED灯。

编写代码

.global _start /*全局标号*/

_start:
ldr r0, =0x020C4068
ldr r1, =0xFFFFFFFF
str r1, [r0]

ldr r0, =0x020C406C
str r1, [r0]

ldr r0, =0x020C4070
str r1, [r0]

ldr r0, =0x020C4074
str r1, [r0]

ldr r0, =0x020C4078
str r1, [r0]

ldr r0, =0x020C407C
str r1, [r0]

ldr r0, =0x020C4080
str r1, [r0]

ldr r0, =0x020E0068
ldr r1, =0x5
str r1, [r0]

ldr r0, =0x020E02F4
ldr r1, =0X10B0
str r1, [r0]

ldr r0, =0x0209C004
ldr r1, =0X0000008
str r1, [r0]

ldr r0, =0x0209C000
ldr r1, =0
str r1, [r0]

loop:
    b loop

编译代码

arm-linux-gnueabihf-gcc -g -c led.s -o led.o

-g代表生成调试信息,GDB能够使用这些调试信息进行代码调试。
-c是编译源文件,但是不链接
-o是指定编译产生文件的名字

链接文件

arm-linux-gnueabihf-ld

arm-linux-gnueabihf-ld用来将众多的.o文件链接到一个指定的链接位置。
所以要做的就是确定一下最终的可执行文件其运行的起始地址,也就是链接地址。这里要对“存储地址”和“运行地址”进行区分。存储是可执行文件存储在哪里,执行是代码运行的时候所处的位置。代码要运行就必须处于运行地址处,否则代码肯定要出错。
可以将可执行文件存储到SD卡,EMMC或者NAND中。但是要运行的话,就必须将代码从SD卡EMMC或者NAND中拷贝到其运行地址(连接地址)处,“存储地址”和“运行地址”可以一样。
确定了链接地址以后,就可以使用命令:

arm-linux-gnueabihf-ld -Ttext 0X87000000 led.o -o led.elf

-Ttext就是指定链接地
-o就是置顶链接生成的elf文件名
led.elf也不是最终要烧写到SD卡中的可执行文件,要烧写.bin文件,因此还需要将led.elf转换为.bin文件需要用到如下命令:

arm-linux-gnueabihf-objcopy

它就是一个格式转换的工具,将led.elf文件转换为led.bin文件

arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

-O指定以什么格式输出,binary表示以二进制输出
-S表示不要复制源文件中的重定位信息和符号信息
-g 表示不复制源文件中的调试信息
至此得到了led.bin文件。

反汇编

C语言编译的程序,当需要查看汇编代码来调试时,就需要进行反汇编,一般可以将elf文件反汇编,命令如下:

arm-linux-gnueabihf-objdump -D led.elf > led.dis

-D代表反汇编所有的段
反汇编结束后就会在当前目录下出现一个led.dis的文件

总结

有关代码编译和arm-linux-gnueabihf交叉编器的使用见上述内容。
最后是将.bin文件烧写。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值