【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+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

如何在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