历史上的今天

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

正在发生

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

发布者:tanjunhui 来源: eefocus关键字:Linux  ARM  编译驱动 手机看文章 扫描二维码
随时随地手机看文章

前言

我们是要编译出在 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”命令即可完成编译

在这里插入图片描述

关键字:Linux  ARM  编译驱动 引用地址:Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动

上一篇:Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡运行
下一篇:Linux之ARM(IMX6U)裸机汇编LED驱动实验--驱动编写

推荐阅读

        华为在上周五于上海发布了Mate 20系列,该系列包括4款新机:Mate 20、Mate 20 Pro、Mate 20 X和Mate 20 RS保时捷设计。很多人在盼望着早点入手的同时,也好奇大家都倾向于买哪一款,毕竟4款手机的价位段有所区分。外媒最新放出的一则投票,正好展示了华为Mate 20系列在歪果仁心中的喜好程度。华为Mate 20系列  据媒体报道,GS...
XDA主编Max Weinbach今日在其Twitter上表示,“三星在Galaxy S10 One UI 2.0 Beta中增加了对Exynos 9830和骁龙865的支持,此芯片可能被应用到Galaxy S11上。”。在此之前Max Weinbach曾爆料过三星Galaxy S11有望搭载另一款功能强大的移动处理器,此次推文验证了之前的猜测。 除此之外,Max Weinbach还表示,Galaxy S11有三种型号,SM-...
对于苹果来说,未来推出更大存储版本的iPhone是一定的,因为用户的需求在走高。据最新消息称,苹果可能会推出1TB版本的iPhone,而首发机型可能是下代iPhone,目前名称暂定iPhone 13,而之所以这么做最直接的一个原因是,他们想要让iPhone全力支持8K视频录制了(通过变形镜头实现45FPS录制8K视频)。如果上述消息是真的,那么iPhone提供1TB版本是没有任何...
苹果一年一度的旗舰 iPhone 13 Pro 和 iPhone 13 Pro Max 于 2021 年 9 月 24 日正式发售。iPhone 13 Pro 全系标配 ProMotion 自适应性屏幕,功耗更低的 A15 芯片,以及更强大的相机等。但是很多用户会开始纠结,那既然 iPhone 13 Pro 和 iPhone 13 Pro Max 看起来只有大小的差别,那还要买更贵的 iPhone 13 Pro Max ...

史海拾趣

问答坊 | AI 解惑

C程序 哪位帮看看该怎么改

#include<reg51.h>   sbit led1=P0^0;   sbit led2=P0^1;   sbit led3=P0^2;   sbit led4=P2^7;   sbit sound=P2^6;   sbit scl=P3^7;   sbit sda=P3^6;   ...…

查看全部问答∨

按键扫描程序取密码的问题

for循环取6次Key_scan()的返回值 for(i=0;i…

查看全部问答∨

推荐开发板

有没有好的开发板给介绍下(500块左右),硬件全且要新点 资料要全,用来学习linux方面的 有用过的最好?…

查看全部问答∨

关于电源的问题

我用ams1117输出3.3v(供给显示屏),再用max619输出5v(供给单片机)。在没有负载(显示器)的情况下都很正常,可是一旦接入3.3v显示屏后,电压就会被拉低,输出只有2.6v左右,5v输出还是挺正常的。所以显示屏就不亮了 想知道原因呢,望高人指点…

查看全部问答∨

关于Verilog的一个问题

小弟是初学者,刚刚学习Verilog不久, 想请问一道题目:如何用verilog 编写 频率可以控制的信号发生器(正弦或预先) 麻烦专家给出详细且具体的解答,万分感谢!!…

查看全部问答∨

牛人是需要拿出来晒&来膜拜的~

  《植物大战僵尸》的移植版本一直层出不穷,这版《植物大战僵尸》牛的是用了数万行JS代码纯手写的,而且背后作者还是辣妈……   试想,可能我们周围还有很多像她这样的人:他们低调的活跃在网页开发或网页设计领域,他们身怀绝技却不为人所知 ...…

查看全部问答∨

如何验证精密电阻是否真的如标的那样 千分之一甚至万分之五

本帖最后由 辛昕 于 2014-2-16 01:49 编辑 想了想,这个问题其实可以简化为 1.一个精密电流源; 2.一个精密电阻; 3.一个精密AD 再精密的东西都存在一定的误差范围。 那么,我该如何处理最后的结果 并评价其中 精密电阻 的 精度是否达标呢 ...…

查看全部问答∨

“学模拟+《运算放大器噪声优化手册》04 示波器测量噪声

本帖最后由 dontium 于 2015-1-23 11:46 编辑 示波器可以使操作者观察到时域的噪声波形,大部分不同类型的噪声具有截然不同的波形,可根据波形来判定是何种类型的噪声主导。 模拟示波器的一个缺点就是不能捕获低频噪声(1/f) 数字示波器可以捕 ...…

查看全部问答∨

【TI首届低功耗设计大赛】+@fxyc87+第四课 自发电测试

本帖最后由 fxyc87 于 2014-10-27 16:33 编辑 很久就看到TI金刚狼的低功耗了 前段时间学习了下它的基础操作 列了三个教程, 这次真刀真枪开始干了 先搞个自发电的东西给金刚狼供电吧 准备搞个自发电的低功耗手表玩玩 在网上搜了一下【能量 ...…

查看全部问答∨

请教一个编译器提示

<a href="file:/E:/ti/ccsv5/tools/compiler/dmed/HTML/MSP430/1538.html">#1538-D</a> (ULP 10.1) ISR WirelessReceive calls function Spi_Strobe. Recommend moving function call away from ISR, or inlining the function, or ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved