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

news2025/5/24 16:09:29

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

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 文件,如下图所示;
在这里插入图片描述
现在可以烧写程序了,其实在第三步完成之后就可以烧写程序了,第四步是为了调试代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1593431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lua学习笔记19(面相对象学习的一点总结)

print("*****************************面相对象总结*******************************") object{} --实例化方法 function object:new()local obj{}self.__indexselfsetmetatable(obj,self)return obj end-------------------------如何new一个对象 function object:…

Redis入门(常用命令、spring-boot-starter-data-redis)

Redis redis是一个基于内存的key-value的结构数据库 启动: redis-server.exe redis.windows.conf 客户端链接:redis-cli.exe [-h 目标ip] [-p 端口] [-a 密码] 修改链接密码: 在redis.windows.conf中的requirepass 123456 常用的数据类…

事务隔离级别的无锁实现方式 -- MVCC

MVCC的全称是Multiversion Concurrency Control(多版本并发控制器),是一种事务隔离级别的无锁的实现方式,用于提高事务的并发性能,即事务隔离级别的一种底层实现方式。 在了解MVCC之前,我们先来回顾一些简单的知识点:…

leetCode刷题 27. 移除元素

目录 1.思路: 2.解题方法: 3.复杂度: 4.Code 题目: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须…

商城系统必备营销功能——分销裂变

电商流量红利已经过去,现在的电商营销,重点在于私域用户,在于客户资源裂变。人们通过分销裂变挖掘客户资源,能降低获客成本,对于需要解决成本困扰的企业来说,确实是个不错的选择。今天,我们就来…

FFmpeg: 自实现ijkplayer播放器--09音频重采样输出

文章目录 流程图音视设备输出回调函数重采样写入音频流因SDL输出音频采样格式为S16(一个采样点2个字节),而音频解码后采样格式通常为float planar(一个采样点4个字节),故需要重采样 重采样的条件:音频解码后的任意一个参数和需要的参数不同时,进行重采样,参数为: 采样格…

Nginx健康检查

Nginx健康检查nginx_upstream_check_module nginx健康检查介绍: ​ 主动健康检查,nignx定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健…

Java并发--内存结构图及线程安全

内存结构图 内存-> (开辟的数组) -> (方法区,堆,栈,程序计数器,本地方法栈) 堆:几乎所有的对象实例都在这里分配内存。堆中每个对象的头信息都标属着他属于哪个类。 方法区它用于存储已被虚拟机加载的类型信息…

牛客_左右最值最大差_C++题解

原题链接:牛客 题目缩写:给你一个数组,由你来进行一个切分,分为两份,每份至少有1个元素;你分出来的这两个区间中各自有一个最大值,两者之差再求绝对值就是答案,这个答案越大越好&am…

认识异常(2)

❤️❤️前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&a…

【Linux系统】操作备忘录

Linux命令 打开终端的快捷键:Ctrl Alt t 退出终端的命令:exit 终端命令行复制/粘贴的快捷键 :Ctrl Shift c / v 对于所有不太熟悉的命令,都可以在终端输入 命令名称 --help 来查看具体用法。例如: 文件和目录…

电池电量监测系统设计 单片机+LabVIEW+Matlab+Protues+Keil程序

目录 前言 提供 软件 系统展示 1.放电试验及其处理 2.硬件系统原理图 3.下位机程序 4.显示 5.上位机界面 6.上位机程序 7.文档 资料下载地址:电池电量监测系统设计 单片机LabVIEWMatlabProtuesKeil程序 前言 这套系统首先使用Matlab分析获得了电压…

项目5-博客系统3+接口完

1.实现显示用户信息 ⽬前⻚⾯的⽤⼾信息部分是写死的. 形如 我们期望这个信息可以随着用户登陆而发生改变. • 如果当前⻚⾯是博客列表⻚, 则显⽰当前登陆⽤⼾的信息. • 如果当前⻚⾯是博客详情⻚, 则显⽰该博客的作者⽤⼾信息. 注意: 当前我们只是实现了显⽰⽤⼾名, 没有…

Swagger的使用教程

Swagger简介 Swagger是一个规范和完整的API框架,可用于生成、描述、调用Restful风格的Web服务的接口文档。如果你在SpringBoot中使用的话,在项目启动后可以自动生成在线可调用的API文档,非常方便! 在SpringBoot中集成 首先在po…

797. 所有可能的路径

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序) graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向…

办公小助手来啦! Textin接口,轻松提取文件信息,让你如虎添翼!

😎大家是不是经常为了一堆文件而头疼呢?📚别担心,Textin接口它来了!🎉 一、Textin的神秘面纱 1. Textin是谁? 🔍Textin接口,一款专业的文件信息提取工具,只…

Arco design 发布到生成环境F5刷新报错404

问题:开发环境没问题,生成环境正常跳转也没问题但是F5刷新报错 解决办法一:修改 history: createWebHistory(), 改为history: createWebHashHistory(),

微服务-6 Gateway网关

一、网关搭建 此时浏览器访问 localhost:10010/user/list 后正常返回数据,说明网关已生效,其原理流程图如下: 二、网关过滤器 作用:处理一切进入网关的请求和微服务响应。 1. 网关过滤器的分类: a. 某个路由的过滤器 …

C语言 | Leetcode C语言题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; int removeDuplicates(int* nums, int numsSize) {if (numsSize 0) {return 0;}int fast 1, slow 1;while (fast < numsSize) {if (nums[fast] ! nums[fast - 1]) {nums[slow] nums[fast];slow;}fast;}return slow; }