【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

相关文章

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

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