当前位置: 首页 > 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.lqws.cn/news/465103.html

相关文章:

  • css上下滚动文字
  • 博图SCL语言GOTO语句深度解析:精准跳转
  • 第三章 线性回归与感知机
  • FastGPT:开启大模型应用新时代(4/6)
  • 使用 Telegraf 向 TDengine 写入数据
  • 升级到 .NET 9 分步指南
  • 软件工程概述:核心概念、模型与方法全解析
  • 以智能管控削减能耗开支,楼宇自控系统激活建筑运营价值增量
  • MolyCamCCD复古胶片相机:复古质感,时尚出片
  • maxcomputer 和 hologres中的EXTERNAL TABLE 和 FOREIGN TABLE
  • LeetCode-2390. 从字符串中移除星号
  • 力扣网C语言编程题:多数元素
  • DAY 38 Dataset和Dataloader类
  • 分布式锁的四种实现方式:从原理到实践
  • 高云GW5AT-LV60 FPGA图像处理板
  • React Native自定义底部弹框
  • Docker高级管理--容器通信技术与数据持久化
  • 华为云Flexus+DeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建b站视频总结大模型
  • Java ArrayList集合和HashSet集合详解
  • 【自动鼠标键盘控制器|支持图像识别】
  • 从代码学习深度学习 - 预训练BERT PyTorch版
  • 文本分类与聚类:让信息“各归其位”的实用方法
  • 最具有实际意义价值的比赛项目
  • CMS与G1的并发安全秘籍:如何在高并发的垃圾回收中保持正确性?
  • 【开源初探】基于 Qwen2.5VL的文档解析工具:docext
  • 【Linux-shell】探索Dialog 工具在 Shell 图形化编程中的高效范式重构
  • synchronized 和 ReentrantLock 的区别
  • 探索 Oracle Database 23ai 中的 SQL 功能
  • 团结引擎 1.5.0 更新 | OpenHarmony 平台开发体验全面升级,突破游戏类应用帧率限制
  • CertiK联创顾荣辉将于港大活动发表演讲,分享Web3安全与发展新视角