x86_64编译ARM交叉编译LED汇编程序

devtools/2025/1/20 15:13:34/
x86_64搭建ARM交叉编译工具链

我们是要编译出在ARM开发板上运行的可执行文件,所以要使用交叉编译器arm-linux-gnueabihf-gcc来编译。因此本试验就一个led.s源文件,所以编译比较简单。先将led.s编译为对应的.o文件,在终端中输入如下命令:

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

这里编写了一个leds.s文件,参考IMX6ULL开发板手册

.global _start  /* 全局标号 *//* * 描述:_start函数,程序从此函数开始执行此函数完成时钟使能、 *      GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。 */_start:  /* 例程代码 */  /* 1、使能所有时钟 */  ldr r0, =0X020C4068   /* CCGR0 */  ldr r1, =0XFFFFFFFF    str r1, [r0]        ldr r0, =0X020C406C    /* CCGR1 */  str r1, [r0]  ldr r0, =0X020C4070    /* CCGR2 */  str r1, [r0]    ldr r0, =0X020C4074    /* CCGR3 */  str r1, [r0]    ldr r0, =0X020C4078    /* CCGR4 */  str r1, [r0]    ldr r0, =0X020C407C    /* CCGR5 */  str r1, [r0]    ldr r0, =0X020C4080    /* CCGR6 */  str r1, [r0]    /* 2、设置GPIO1_IO03复用为GPIO1_IO03 */  ldr r0, =0X020E0068  /* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */  ldr r1, =0X5    /* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */  str r1,[r0]  /* 3、配置GPIO1_IO03的IO属性     *bit 16:0 HYS关闭   *bit [15:14]: 00 默认下拉     *bit [13]: 0 kepper功能     *bit [12]: 1 pull/keeper使能     *bit [11]: 0 关闭开路输出     *bit [7:6]: 10 速度100Mhz     *bit [5:3]: 110 R0/6驱动能力     *bit [0]: 0 低转换率     */    ldr r0, =0X020E02F4  /*寄存器SW_PAD_GPIO1_IO03_BASE */    ldr r1, =0X10B0    str r1,[r0]  /* 4、设置GPIO1_IO03为输出 */    ldr r0, =0X0209C004  /*寄存器GPIO1_GDIR */    ldr r1, =0X0000008        str r1,[r0]  /* 5、打开LED0   * 设置GPIO1_IO03输出低电平   */  ldr r0, =0X0209C000  /*寄存器GPIO1_DR */   ldr r1, =0       str r1,[r0]/* * 描述:loop死循环 */loop:  b loop    

      

裸机例程都是烧写到SD卡中,上电以后I.MX6U的内部boot rom程序会将可执行文件拷贝到链接地址处,这个链接地址可以在I.MX6U的内部 128KB RAM中(OX900000~OX91FFFF),也可以在外部的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

裸机代码的链接起始地址为0X87800000。要使用DDR,那么必须要初始化DDR,对于I.MX来说bin文件不能直接运行,需要添加一个头部,这个头部信息包含了DDR的初始化参数,I.MX系列SOC内部boot rom会从SD卡,EMMC等外置存储中读取头部信息,然后初始化DDR,并且将bin文件拷贝到指定的地方。

Bin的运行地址一定要和链接起始地址一致。位置无关代码除外。

生成led.bin

反汇编

I.MX6ULL支持SD卡、EMMC、NAND、nor、SPI flash等等启动。裸机例程选择烧写到SD卡里面。

在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡绝对地址上。而且对于I.MX而言,不能直接烧写bin文件,比如先在bin文件前面添加头部。

在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡绝对地址上。而且对于I.MX而言,不能直接烧写bin文件,比如先在bin文件前面添加头部。完成这个工作,需要使用正点原子提供的imxdownload 软件。Imxdownload使用方法,确定要烧写的SD卡文件,我的是/dev/sdf。给予imxdownload

可执行权限:

Chmod 777 imxdownload

烧写:

./imxdownload led.bin /dev/sdf

Imxdownlaod会向led.bin添加一个头部,生成新的load.imx文件,这个load.imx文件就是最终烧写到SD卡里面去的。


编写Makefile

led.bin:leds.s  arm-linux-gnueabihf-gcc -g -c leds.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.disclean:  rm -f led.bin *.o led.elf led.dis


http://www.ppmy.cn/devtools/152124.html

相关文章

OODA循环在网络安全运营平台建设中的应用

OODA循环最早用于信息战领域,在空对空武装冲突敌对双方互相较量时,看谁能更快更好地完成“观察—调整—决策—行动”的循环程序。 双方都从观察开始,观察自己、观察环境和敌人。基于观察,获取相关的外部信息,根据感知…

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库,已经包含三方库。 一、运行效果:二、源代码来源及编程语言:三、环境搭建:安装红警2安装VS2022下载代码,源代码其实不太多&#xff0c…

数据结构(线性表的链式实现):稀疏多项式

#include <iostream> //稀疏多项式合并 typedef struct PNode {int expn;//指数float coef;//系数struct PNode *next; }PNode,*Polyn; void create_polyn(Polyn &s,int n) {snew PNode ;//头节点s->nextnullptr;PNode *qnew PNode;PNode *prenew PNode;qs;for (…

SSL/TLS的数据压缩机制

SSL&#xff08;Secure Sockets Layer&#xff09;或其后继协议TLS&#xff08;Transport Layer Security&#xff09;在默认情况下不负责对数据进行压缩。但它确实支持一种数据压缩的机制&#xff0c;只是这个特性在实际中被限制或禁用。具体解释如下&#xff1a; 1. SSL/TLS…

Oracle 可观测最佳实践

简介 Oracle 数据库是一种广泛使用的商业关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由甲骨文公司&#xff08;Oracle Corporation&#xff09;开发。它支持 SQL 语言&#xff0c;能够存储和管理大量数据&#xff0c;并提供高级数据管理功能&#xff0c;如数…

Spring boot面试题----Spring Boot核心注解有哪些

一、@SpringBootApplication 功能: 这是一个组合注解,相当于同时使用了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解。它是 Spring Boot 应用程序的入口点,通常添加在应用程序的主类上,例如:@SpringBootApplication public class MyApplicatio…

SpringBoot 集成 Gitee 实现三方登录

前段时间学习了 Oauth2 相关的授权流程 刚好想实践一下&#xff0c;就利用 Gitee 的官方文档进行了实践 源代码地址&#xff1a;gitee-spring-boot: Gitee的Oauth2三方登录实现 用的是 h2 数据库&#xff0c;按照 readme 步骤运行 Gitee 会返回用户信息 后端会判断 Gitee …

Linux使用SSH连接GitHub指南

基础配置流程 步骤1:生成SSH密钥 打开终端:首先,打开你的Linux终端。 生成SSH密钥对:输入以下命令来生成一个新的SSH密钥对: ssh-keygen -t rsa -b 4096 -C "your_email@example.com"-t rsa:使用RSA加密算法生成密钥。-b 4096:密钥长度为4096位,增加安全性。…