历史上的今天
返回首页

历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2021年10月29日 | Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动

2021-10-29 来源:eefocus

前言

我们是要编译出在 ARM 开发板上运行的可执行文件,所以要使用交叉编译器 arm-linux-gnueabihf-gcc 来编译。


交叉编译链的安装参考另外一篇博文:交叉编译链的安装


编译代码

本试验就一个 leds.s 源文件,所以编译比较简单。


源文件代码(leds.s):


.global _start @全局标号


_start:

    /*使能所有外设时钟 */

    LDR R0 , =0x020c4068  @CCGR0 

    LDR R1 , =0xffffffff  @要想CCGR0写入的数据

    STR R1 , [R0]         @将R1的值写入到R0中

    

    LDR R0 , =0x020c406c  @CCGR1

    STR R1 ,[R0]


    LDR R0 , =0x020c4070  @CCGR1

    STR R1 ,[R0]


    LDR R0 , =0x020c4074  @CCGR1

    STR R1 ,[R0]


    LDR R0 , =0x020c4078  @CCGR1

    STR R1 ,[R0]


    LDR R0 , =0x020c407c  @CCGR1

    STR R1 ,[R0]


    LDR R0 , =0x020c4080  @CCGR1

    STR R1 ,[R0]


    /*配置 GPIO_I003  PIN的复用为GPIO

    * IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 0101 =5

    * IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器的地址为0x020E_0068

    */

    LDR R0 , =0x020E0068  @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03

    LDR R1 , =0x5          @要写入的数据

    STR R1 , [R0]          @将5写入IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03


    /*配置 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的电器属性

    * IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03的地址时0x020E_02F4

    * bit0 :    0 低速率

    * bit5-3:   110 R0/6  驱动能力

    * bit7-6:   10 100MHz速度

    * bit11:    0 关闭开路输出

    * bit12:    1 使能pull/keeper

    * bit15-14: 00 100K下拉

    * bit16:    0 关闭hys    

    * 向寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03写入 0x10b0

    */


    LDR R0 , = 0x020E02F4

    LDR R1 , = 0x10b0

    STR R1 ,[R0]


    /*设置GPIO功能

     *设置GPIO1_GDIR寄存器  设置GPIO1_GPIO03为输出

     *寄存器GPIO_GDIR的地址是  0x0209C004

     * 设置GPIO1_GDIR寄存器bit3为1也就是GPIO1_GPIO03为输出

     */

    LDR R0 , = 0x0209C004

    LDR R1 , = 0x8

    STR R1 ,[R0]


    /*打开LED,也就是设置GPIO1_GPIO03为0 

     *GPIO1_DR 寄存器地址为0x0209C000

    */


    LDR R0 , = 0x0209C000

    LDR R1 , =0

    STR R1 ,[R0]


loop:

    b loop


1.把 .s 文件编译成 .o文件

在这里插入图片描述

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

在这里插入图片描述

其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 led.s 编译完成以后的文件名字为 leds.o。执行上述命令以后就会编译生成一个 leds.o 文件


2.把 .o文件编译成连接文件 .elf

arm-linux-gnueabihf-ld 用来将众多的.o 文件链接到一个指定的链接位置。


代码要运行,那就必须处于运行地址处,否则代码肯定运行出错。比如 I.MX6U 支持 SD 卡、EMMC、NAND 启动,因此代码可以存储到 SD 卡、EMMC 或者 NAND 中,但是要运行的话就必须将代码从 SD 卡、EMMC 或者NAND 中拷贝到其运行地址(链接地址)处,“存储地址”和“运行地址”可以一样


裸机例程都是烧写到 SD 卡中,上电以后 I.MX6U 的内部 boot rom 程序会将可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM 中(0X900000~0X91FFFF),也可以在外部的 DDR 中。


我们把链接地址都放在 DDR中,链接起始地址为 0X87800000。I.MX6U-ALPHA 开发板的DDR 容量有两种:512MB 和256MB,起始地址都为 0X80000000,只不过 512MB 的终止地址为 0X9FFFFFFF,而 256MB 容量的终止地址为 0X8FFFFFFF。之所以选择 0X87800000 这个地址是因为后面要讲的 Uboot 其链接地址就是 0X87800000,这样我们统一使0X87800000 这个链接地址,不容易记混。


确定了链接地址以后就可以使用 arm-linux-gnueabihf-ld 来将前面编译出来的 led.o 文件链接到 0X87800000 这个地址,使用如下命令:



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


上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里我们命名为 led.elf。上述命令执行完以后就会在工程目录下多一个 led.elf 文件

在这里插入图片描述

led.elf 文件也不是我们最终烧写到 SD 卡中的可执行文件,我们要烧写的.bin 文件,因此还需要将 led.elf 文件转换为.bin 文件,这里我们就需要用到 arm-linux-gnueabihf-objcopy 这个工具了。


3.arm-linux-gnueabihf-objcopy 格式转换生成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 文件。


4.arm-linux-gnueabihf-objdump 反汇编

大多数情况下我们都是用 C 语言写试验例程的,有时候需要查看其汇编代码来调试代码,因此就需要进行反汇编,一般可以将 elf 文件反汇编,比如如下命令:


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


上述代码中的“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件

在这里插入图片描述
在这里插入图片描述

可以看出 led.dis 里面是汇编代码,而且还可以看到内存分配情况。在0X87800000 处就是全局标号_start,也就是程序开始的地方。通过 led.dis 这个反汇编文件可以明显的看出到我们的代码已经链接到了以 0X87800000 为起始地址的区域。


这些命令一条条的敲太麻烦了,我们把它整理成一个Makefile文件


5.整理成makefile文件

是用“touch”命令在工程根目录下创建一个名为“Makefile”的文件,如图

在这里插入图片描述

创建好 Makefile 文件以后就需要根据 Makefile 语法编写 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

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

clean:

rm -rf *.o led.bin led.elf led.dis


注意: Makefile 命令前一定要是tab键形成的四个空格


创建好 Makefile 以后我们就只需要执行一次“make”命令即可完成编译

在这里插入图片描述

推荐阅读

史海拾趣

台湾义隆电子(ELAN)公司的发展小趣事

作为一家有社会责任感的企业,义隆电子一直关注可持续发展问题。公司积极推广绿色生产理念,采取环保措施减少生产过程中的污染排放。同时,义隆电子还关注社会公益事业,积极参与各种慈善活动,回馈社会。这些举措不仅提升了公司的品牌形象,也为公司的长期发展奠定了坚实基础。

请注意,以上故事框架仅供参考,具体的故事内容需要根据义隆电子的实际情况进行撰写。

Custom Components Inc公司的发展小趣事

Custom Components Inc(简称CCI)公司的发展历程始于一个技术突破。在公司成立的初期,CCI的研发团队成功开发了一种新型的电子元件,这种元件在性能和成本上均优于市场上的同类产品。这一技术突破立即引起了行业的关注,多家电子设备制造商纷纷向CCI抛出橄榄枝,希望建立长期合作关系。

随着市场需求的不断增长,CCI逐步扩大了生产规模,并通过技术创新不断提升产品质量。同时,公司还积极开拓国际市场,与海外客户建立了稳定的业务往来。凭借卓越的产品性能和良好的市场口碑,CCI逐渐在电子行业中崭露头角。

GWM Associates公司的发展小趣事
采用差分放大电路、共源共栅放大电路等结构,以提高增益和降低噪声。同时,注意电路的布局和布线,避免引入额外的噪声。
Elcoma公司的发展小趣事

面对日益变化的市场环境和客户需求,Elcoma公司始终保持创新的精神。他们不断投入研发资金,引进高端人才,加强技术创新和产品研发。同时,Elcoma还积极探索新的商业模式和市场机会,以适应市场变化并抓住发展机遇。这种创新驱动的发展策略使Elcoma在电子行业中保持领先地位,并为企业的未来发展奠定了坚实的基础。

B.B. Battery公司的发展小趣事

面对日益严峻的环境问题,B.B. Battery公司积极响应国家绿色发展的号召,致力于推动绿色生产。他们引进环保型生产设备和技术,减少生产过程中的污染物排放。同时,公司还研发出多款环保型电池产品,为客户提供更加绿色、高效的能源解决方案。这些举措不仅提升了公司的社会责任感,也为公司的可持续发展奠定了坚实基础。

ddm hopt + schuler GmbH & Co KG公司的发展小趣事

ddm hopt + schuler GmbH & Co KG公司自创立之初,就专注于电子制造设备的研发与生产。在20世纪90年代,公司成功研发出一款具有革命性意义的自动化生产线,极大地提高了电子产品的生产效率和质量。这一技术突破迅速赢得了市场的认可,公司开始在全球范围内扩张业务,与多家知名电子品牌建立了长期合作关系。

问答坊 | AI 解惑

音频电路集锦下载

音频电路集锦 [ 本帖最后由 shuijian 于 2008-10-21 17:25 编辑 ]…

查看全部问答>

急救警报手镯 随时保证你的安全

急救警报手镯        在人潮涌动的海边玩耍,如果遇到危险,呼救的声音往往会被人声和海浪声淹没。即便有救生员在高塔上时刻监控,危险依旧难以避免。设计师便根据这一情况,推出了这款急救手镯。 …

查看全部问答>

wince 启动卡住

下面是启动的信息: VIVI bootloader 0.1.4 (chris@yangchu.com) (gcc version 2.95.3 20010315 (release)                              & ...…

查看全部问答>

s3c2410电池管理

怎么像手机一样提示电池电量? 接触过的朋友帮帮忙,谢谢!…

查看全部问答>

有奖征集高人帮助在AMTEL单片机上开发发送彩信功能?

硬件资源:      CPU     :ATMEL AVR MEGA64      扩展存储:64kBYTE RAM      通信接口:GSM/GPRS模块,内嵌TCP/IP协议栈,与CPU通过RS232口连接 如有意承接, ...…

查看全部问答>

大家有什么好建议

想做一个让人看了有点神奇,迷惑不解,会发光之类的玩意,大家有什么好的建议或意见?电子钟,交通灯,流水灯,摇摇棒人家都做了。。。我改做什么呢?大家都玩过些啥玩意  给点建议好吗? 谢谢。。。。…

查看全部问答>

Freescale步进电机驱动参考设计

这是Freescaler提供的步进电机驱动代码,大家可以参考参考,有兴趣的也可以看看。…

查看全部问答>

转让手中的2440开发板给需要的人(已出)

大学毕业了 工作和嵌入式不相关  所以转让手中的2440开发板给需要的人  版型是mini2440   板子买的时候就标配256M  nand flash  免除升级麻烦说句过来人的话给学习arm的人 现在很多新人都追求arm11  因为它可以跑And ...…

查看全部问答>

MSP-EXP430G2开发板导学资料及原理图

有关MSP430 LaunchPad的文件资料都是在TI官网上都可以下载。如果你手头有这个板子或者即将有这款板子,我先推荐这两个资料是你初步学习的最好资料。经管都是英文,大家还是要慢慢地适应,学电子这一行都是国外的东西,看英文文档是最习以为常的。我 ...…

查看全部问答>