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

FreeRTOS学习笔记(六):汇编指令笔记

文章目录

  • 一、 MSR 和 MRS
      • 1. MRS指令(Move to Register from Special register)
      • 2. MSR指令(Move to Special register from Register)
      • 典型应用场景
      • 重要说明
  • 二、 DSB 和 ISB
      • 1. DSB(Data Synchronization Barrier)
      • 2. ISB(Instruction Synchronization Barrier)
      • 关键区别
      • 总结

/* 任务句柄 */
typedef void * TaskHandle_t;//通用指针或泛指针。指向某个对象,但该对象不属于任何类型

一、 MSR 和 MRS

在ARM汇编中,MSRMRS是用于访问特殊寄存器(Special Registers)的指令,它们在系统级编程中非常重要,通常用于配置处理器状态、中断控制、内存管理等核心功能。

1. MRS指令(Move to Register from Special register)

  • 功能:将特殊寄存器的值读取到通用寄存器中
  • 语法MRS{条件码} 通用寄存器, 特殊寄存器
  • 示例
    MRS R0, CPSR    ; 将当前程序状态寄存器(CPSR)的值读取到R0
    MRS R1, SPSR    ; 将保存的程序状态寄存器(SPSR)的值读取到R1
    MRS R2, SCTLR    ; 读取系统控制寄存器到R2(ARMv7及以上)
    
  • 用途:通常用于读取处理器状态、配置信息等,以便进行检查或修改

2. MSR指令(Move to Special register from Register)

  • 功能:将通用寄存器的值写入到特殊寄存器中
  • 语法MSR{条件码} 特殊寄存器, 通用寄存器
    或使用立即数操作(部分寄存器支持):MSR{条件码} 特殊寄存器, #立即数
  • 示例
    MSR CPSR_c, R0   ; 将R0的值写入CPSR的控制位域(c表示控制位)
    MSR SPSR, R1     ; 将R1的值写入SPSR
    MSR SCTLR, R2    ; 将R2的值写入系统控制寄存器
    MSR CPSR_c, #0x1F ; 设置CPSR的控制位(进入用户模式)
    
  • 注意
    • 对于CPSR/SPSR,通常使用位域限定符(如_c_x_s_f)指定要修改的部分
    • 很多特殊寄存器的访问受到权限限制,只能在特权模式下操作

典型应用场景

  1. 模式切换:通过修改CPSR的M位域切换处理器模式

    MRS R0, CPSR        ; 读取当前CPSR
    BIC R0, R0, #0x1F   ; 清除模式位
    ORR R0, R0, #0x13   ; 设置为SVC模式
    MSR CPSR_c, R0      ; 写入CPSR的控制位域
    
  2. 中断控制:启用或禁用中断

    MRS R0, CPSR
    ORR R0, R0, #0xC0   ; 禁用IRQ和FIQ中断 (设置I位和F位)
    MSR CPSR_c, R0
    
  3. 系统配置:配置内存管理单元(MMU)、缓存等

    MRS R0, SCTLR       ; 读取系统控制寄存器
    ORR R0, R0, #0x1    ; 置位MMU使能位
    MSR SCTLR, R0       ; 启用MMU
    

重要说明

  • 特殊寄存器的种类和功能因ARM架构版本(如ARMv6、ARMv7、ARMv8)而异
  • 错误使用这些指令可能导致系统崩溃或安全漏洞
  • 在ARMv8的AArch64模式下,这些指令的语法和支持的寄存器有所变化

这些指令是操作系统内核、引导程序和设备驱动程序开发的基础工具,用于直接控制处理器的核心功能。

在ARM汇编中,DSB(Data Synchronization Barrier)和ISB(Instruction Synchronization Barrier)是内存屏障指令(Memory Barrier Instructions),用于控制指令和数据的执行顺序,确保内存操作的可见性和顺序性,在多处理器系统、设备驱动和实时系统中尤为重要。

二、 DSB 和 ISB

1. DSB(Data Synchronization Barrier)

  • 功能:确保在DSB指令执行完成前,所有之前的内存访问操作(加载/存储)都已完成,并且其结果对系统中的其他组件(如其他处理器、DMA控制器)可见。

  • 作用:阻止后续的内存操作执行,直到所有先前的内存操作彻底完成(包括写入实际物理内存、缓存一致性同步等)。

  • 语法DSB <option>
    其中<option>指定作用范围(可选,默认是完整屏障):

    • #SY:系统级屏障(默认),影响所有内存访问
    • #ST:仅影响存储操作(Store)
    • #LD:仅影响加载操作(Load)
  • 示例

    ; 确保所有之前的存储操作完成后,再读取设备状态
    STR R0, [R1]       ; 向设备寄存器写入命令
    DSB                ; 等待写入完成
    LDR R2, [R1, #4]   ; 读取设备状态(确保读取到的是最新状态)
    
  • 典型用途

    • 设备驱动中,确保对硬件寄存器的写入已生效后再进行后续操作
    • 多处理器间共享数据时,保证数据更新的可见性
    • 内存映射I/O操作中,避免读写操作乱序

2. ISB(Instruction Synchronization Barrier)

  • 功能:刷新处理器的指令流水线(Instruction Pipeline),确保ISB之后的指令从更新后的指令缓存或内存中重新取指执行

  • 作用:使所有之前的指令(包括修改系统状态的指令,如MSR)的效果在后续指令中可见,强制流水线重新同步。

  • 语法ISB <option>
    可选<option>DSB类似,默认#SY

  • 示例

    ; 修改处理器状态后,确保后续指令在新状态下执行
    MRS R0, CPSR       ; 读取状态寄存器
    ORR R0, R0, #0x80  ; 修改中断屏蔽位
    MSR CPSR_c, R0     ; 写入新状态
    ISB                ; 刷新流水线,确保后续指令使用新状态
    
  • 典型用途

    • 修改处理器状态(如中断使能、内存管理配置)后,确保后续指令按新状态执行
    • 代码自修改(如动态生成指令)后,确保新指令被正确取指
    • 切换内存映射(如页表更新)后,避免旧映射的指令被错误执行

关键区别

指令核心作用影响范围典型场景
DSB确保数据访问的顺序和完成内存操作(加载/存储)设备I/O、共享内存同步
ISB确保指令执行的顺序和同步指令流水线和取指状态修改、代码更新

总结

DSBISB是ARM架构中保证系统正确性的关键指令,尤其在:

  • 多处理器或多核系统中维护内存一致性
  • 与硬件设备交互时确保操作顺序
  • 修改处理器核心配置(如中断、MMU)后保证状态同步

错误省略这些指令可能导致难以调试的问题(如数据不一致、指令执行异常),尤其是在高性能或实时系统中。

http://www.dtcms.com/a/391818.html

相关文章:

  • 【复刻】中国城市数字经济发展对环境污染的影响及机理研究(2011-2021年)
  • Blazer:一个免费开源、基于SQL的数据分析与可视化工具
  • 软件体系架构——系统架构评估与ATAM
  • sam2 docker部署
  • 深度学习------卷积神经网络
  • Amazon SES + NestJS 实战:零成本打造高送达率邮箱验证方案
  • MySQL 8.0临时表空间深度解析
  • 低秩矩阵:揭示高维数据中的简约之美
  • QR Wizard for Mac 好用的二维码生成器
  • 【redis】redis知识点
  • C语言模版(机试666)
  • 高通camx架构学习(二)——深入理解高通Camx Hal
  • 戴尔笔记本的奇怪功能
  • Linux文件系统结构与用户管理完全指南
  • 鸿蒙保存图片到相册
  • 【C语言】喝汽水问题分析:20元能喝多少瓶汽水?
  • 二物理层-ADSL-思考题
  • PyQt6之滑动条
  • 虚拟机ubuntu安装中文输入法
  • 康奈尔大学视觉-语言-动作模型全面综述:概念、进展、应用与挑战
  • 单片机--中断实验
  • 嵌入式 - GPIO
  • 一款商用的基于SpringBoot+VUE的出货单智能比对系统
  • systemctl 在启动服务时的 常用参数
  • 【MySQL】SQL性能分析
  • 【软件测试Linux】详细Linux介绍和各种命令的场景应用
  • 【MySQL】使用C/C++链接mysql数据库
  • 【复现】【充换电站】考虑用户充电负荷-最优分时电价互动的光储充换电站优化模型
  • 多光谱相机按不同分类的几种类型
  • Linux中select、poll 和 epoll的作用