【ARM 裸机】汇编 led 驱动之编译程序

2024-04-14 20:04

本文主要是介绍【ARM 裸机】汇编 led 驱动之编译程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编译程序这一节分为四个步骤:

1、将 .s .c 文件变成 .o 文件,使用 arm-linux-gnueabihf-gcc;

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

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

2、将所有的 .o 文件连接为 .elf 文件,使用 arm-linux-gnueabihf-ld;

led.o 文件并不是我们可以下载到开发板中运行的文件,一个工程中所有的 C 文件和汇编文件都会编译生成一个对应的 .o 文件,需要将这.o 文件连接起来组合成可执行文件。
连接就是将所有的 .o 文件连接在一起,并且连接到指定的地方,本实验连接的时候要指定连接起始地址;连接起始地址就是代码运行的起始地址,对于 6ULL ,连接起始地址应该指向 RAM 地址,RAM 分为内部 RAM 和外部 RAM,内部 128KB 的 RAM 地址范围是0X900000~0X91FFFF;外部 RAM 也就是 DDR,现在使用板子 DDR 是 512MB,地址为 0X80000000 ~ 0X9FFFFFFF,裸机学习的过程中,连接地址选为0X87800000,方便以后的学习,因为后面 Uboot 的连接地址就是 0X87800000,统一使用 0X87800000 这个链接地址,不容易记混。那么要使用 DDR 的话,是不是要初始化,现在并没有进行 DDR 的初始化,怎么使用呢?其实对于 I.MX 来说,.bin 文件并不能直接运行,需要添加一个头部,这个头部包含了 DDR 的初始化,I.MX 系列 SOC 内部 boot ram 会从 SD卡、EMMC等外部存储中读取头部信息来初始化 DDR,并且将 .bin 文件拷贝到指定的地方(连接起始地址),.bin 的运行地址一点要和连接起始地址一致,位置无关代码除外

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

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

3、将 .elf 文件转为 .bin 文件,使用 arm-linux-gnueabihf-objcopy;

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

上述命令中,“ -O ”指定以什么格式输出,“ binary ”表示以二进制格式输出,“ -S ”表示不要复制源文件中的重定位信息和符号信息,“ -g ”表示不复制源文件中的调试信息,上述命令执行完成以后,工程目录如下图所示,终于等到了想要的东西 led.bin;
在这里插入图片描述

4、将 .elf 文件转为汇编,反汇编,使用 arm-linux-gnueabihf-objdump;

大多数情况下我们都是用 C 语言写例程的,有时候需要查看其汇编代码来调试代码,因此就需要进行反汇编;

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

上述代码中的“ -D ”表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件,如下图所示;
在这里插入图片描述
现在可以烧写程序了,其实在第三步完成之后就可以烧写程序了,第四步是为了调试代码。

这篇关于【ARM 裸机】汇编 led 驱动之编译程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903886

相关文章

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI

bash: arm-linux-gcc: No such file or directory

ubuntu出故障重装了系统,一直用着的gcc使用不了,提示bash: arm-linux-gcc: No such file or directorywhich找到的命令所在的目录 在google上翻了一阵发现此类问题的帖子不多,后来在Freescale的的LTIB环境配置文档中发现有这么一段:     # Packages required for 64-bit Ubuntu

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机,作为现代会议室革新的核心装备,正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备,更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步,特别是COB(Chip On Board)超微小间距LED技术的引入,LED智能会议一体机正迎来前所未有的发展机遇,成为大势所趋。 COB技术通过将LED芯片直接封装在基

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6