当前位置: 首页 > news >正文

day44-硬件学习之arm启动代码

一、跳转指令实现函数调用

  • LR(链接寄存器):保留函数返回地址

1.1 bl指令

        跳转指令bl,使LR保存当前函数进入前的下一条指令的地址,使函数调用后可以返回下一条指令的地址;

1.2 bx指令

        跳到目标地址;


1.3 栈的使用方法 

函数调用前,保护现场,调用后恢复现场 :

        使用栈(先进后出的特性);


栈的使用方法:

1.3.1.空增

        保护时,SP先写,再加;

        恢复时,SP先减,再读;

1.3.2 满增 

        保护时,SP先加,再写;

        恢复时,SP先读,再减;

1.3.3 满减

        保护时,SP先减,再写;

        恢复时,SP先读,再加;

1.3.4 空减

        保护时,SP先写,再减;

        恢复时,SP先加,再读;


1.4 ARM内核使用满减栈,使用方法

1.4.1 stmfd指令

入栈保护时,使用stmfd指令;

        stmfd <c><Rn>{!}, <registers>:

        其中:

  • !是让栈指针的内容随程序发生变化
  • 命令含义是把多个寄存器保存到Rn寄存器中
  • 举例:stmfd sp!, {r0-r12, lr}

1.4.2 ldmfd指令 

出栈恢复时,使用ldmfd指令;

        如:ldmfd sp!, {r0-r12, lr}

二、汇编与C语言混合调用

注意:由主调者负责保护现场和恢复现场

2.1 汇编为主调

 步骤:

  1. 首先确保SP指针有效
  2. 对函数声明:import(导入)         export(导出)
  3. 保护现场
  4. 使用bl跳转
  5. 恢复现场

注意:

若参数4个以内,R0-R3传递参数;

若有第五个参数,只能用栈的方式来传参:

  •         stmfd sp!, {r4}
  •         ldmfd sp!, {r4}

main.c 

start.s 

2.2 c为主调

在汇编中,声明c的函数,import main

                                         export asm_add 

main.c 

start.s 

三、准备工作

3.1 切换模式

CPS命令修改CPSR寄存器的M[4:0]

        如,CPS #<mode>

        (但不支持keil) 

解决方法:

(1) msr指令:读取cpsr、spsr寄存器

mrs r0, cpsr

(2) 于r0中,设置相关数据,设为User模式(10000)

bic r0, r0, #(0x1F << 0)    //低5位清零
orr r0, r0, #0x10           //第5位置一

(3) msr指令:写入cpsr、spsr寄存器

msr cpsr_c, r0

(4)将User模式下的SP进行设置

ldr sp, =0x40001000
sub sp, sp, #1024

3.2 异常处理被占用(解决),初始化异常向量表 

3.3 产生软件中断异常

加^,表示恢复执行前cpsr寄存器的值

四、IMX6ULL入门

  • Windows编写代码
  • Ubuntu编写代码

主要部分:

  1. 搭建编程环境
  2. 汇编点灯
  3. 下载程序

4.1 引脚的功能复用

  • 说明哪些引脚归哪个外设使用
  • PAD:引脚
  • MUX:功能复用

以点亮LED为例:

        GPIO1组的3号引脚

数据寄存器        GPIO data register(GPIOx_DR) 

方向寄存器 

 

http://www.lryc.cn/news/573322.html

相关文章:

  • 【Datawhale组队学习202506】零基础学爬虫 02 数据解析与提取
  • 【simulink】IEEE5节点系统潮流仿真模型(2机5节点全功能基础模型)
  • 【智能体】dify部署本地步骤
  • LeetCode第279题_完全平方数
  • 湖北理元理律师事务所企业债务纾困路径:司法重整中的再生之道
  • 蓝桥杯备赛篇(上) - 参加蓝桥杯所需要的基础能力 1(C++)
  • 华为OD机试_2025 B卷_判断一组不等式是否满足约束并输出最大差(Python,100分)(附详细解题思路)
  • 车载电子电器架构 --- 电子电气架构设计方案
  • QC -io 服务器排查报错方式/报错: Failed to convert string to integer of varId variable!“
  • 2.7 Python方法调用机制解析:从描述符到字节码执行
  • 学习C++、QT---03(C++的输入输出、C++的基本数据类型介绍)
  • 【无标题】使用 Chocolatey 安装 WSL 管理工具 LxRunOffline
  • 贪心算法思路详解
  • Mac电脑-Markdown编辑器-Typora
  • 利用nRF54L15-DK的DEBUG OUT接口调试用户设计的ARM处理器系统
  • springboot口腔管理平台
  • 【分布式理论】读确认数与写确认数:分布式一致性的核心概念
  • WPF Style样式 全局样式资源字典
  • 获取 DOM 与 nextTick:Vue 中的 DOM 操作
  • CTF--PhP Web解题(走入CTF)
  • 增量学习ASAP的源码剖析:如何实现人形的运动追踪和全身控制(核心涉及HumanoidVerse中的agents模块)
  • Redis集群部署终极指南:架构选型、生产部署与深度优化
  • 人形机器人_双足行走动力学:本田机械腿的倒立摆模型
  • rt-thread中使用usb官方自带的驱动问题记录
  • 【全开源】填表问卷统计预约打卡表单系统+uniapp前端
  • 基于FPGA的白噪声信号发生器verilog实现,包含testbench和开发板硬件测试
  • 基于物联网的智能饮水机系统设计
  • API网关Apisix管理接口速查
  • STM32 CAN简介及帧格式
  • AR眼镜与3D建模社区建设