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

嵌入式ARM设计编程(三) 处理器工作模式

文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。

一、实验目的

(1) 通过实验掌握学会使用msr/mrs 指令实现ARM 处理器工作模式的切换,观察不同模式下的寄存器,加深对CPU 结构的理解;

(2) 通过实验掌握ld 中如何使用命令行指定代码段起始地址。

二、实验环境

硬件:PC机。

软件:ADS1.2 集成开发环境

三、实验内容

通过 ARM 汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别;掌握ARM 不同模式的进入与退出。

四、实验要求

(1)按照2.3节介绍的方法, 在ADS下创建一个工程asmmodelab,完成各个模式下的堆栈初始化工作,并将R1-R12的内容存入当前模式下堆栈。通过AXD运用单步执行方式调试程序,验证工作模式的切换,注意观察CPSR寄存器中的变化。随着程序调试过程中在模式间的切换,使用寄存器观察器切换到不同的工作模式下观察SP(R13)的变化情况。

(2)实验过程中请记录并思考以下内容:

1)程序复位之后系统处于什么模式?

2)记录每种模式下的初始堆栈指针,以及执行R1-R12内容压栈后本模式堆栈相关内存单元的数值。并分析快速中断FIQ模式与其他模式存入的R1-R12有什么不同。

3)切换成用户模式之后还能否从用户模式切换到其他模式(如系统模式)?

4)用户模式下能否执行堆栈压栈操作?如果能得话,观察用户模式下压栈之前和压栈之后其堆栈区域的变化情况。

5)观察本程序模式切换过程中SPSR有无变化,并解释其原因。

五、实验情况

1、实验源代码(含注释):

usr_stack_legth equ 64 ;定义各个模式的栈空间长度
svc_stack_legth equ 32
fiq_stack_legth equ 16
irq_stack_legth equ 64
abt_stack_legth equ 16
und_stack_legth equ 16               area reset,code,readonly ;定义code片段reset只读entry ;设置程序入口伪指令code32 ;定义后面的指令为32位的ARM指令;设置各个寄存器中的内容
start    mov r0,#0mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5mov r6,#6mov r7,#7mov r8,#8mov r9,#9mov r10,#10mov r11,#11mov r12,#12bl initstack  ;跳转至initstack,并且初始化各模式下的堆栈指针,打开IRQ中断(将cpsr寄存器的i位清0)mrs r0,cpsr        ;r0<--cpsrbic r0,r0,#0x80    ;cpsr的I位置0,开IRQ中断msr cpsr_cxsf,r0   ;cpsr<--r0;切换到用户模式msr cpsr_c,#0xd0  ;设置11010000,其中I,F位置1,禁止IRQ和FIQ中断,T=0,ARM执行,M[4:0]为10000,切换到用户模式mrs r0,cpsr          ;r0<--cpsrstmfd sp!,{r1-r12}   ;将R1-R12入栈     
;观察用户模式能否切换到其他模式;切换到管理模式msr cpsr_c,#0xdf    ;设置11011111,其中I,F位置1,禁止IRQ和FIQ中断,T=0,ARM执行,M[4:0]为11111,切换到系统模式mrs r0,cpsr			;r0<--cpsrstmfd sp!,{r1-r12}  ;将寄存器列表中的r1-r12寄存器存入堆栈halt  b halt ;从halt跳转到halt循环initstack  mov r0,lr   ; r0<--lr,因为各种模式下r0是相同的而各个模式不同       ;设置管理模式堆栈msr cpsr_c,#0xd3   ; 设置11010011 切换到管理模式ldr sp,stacksvc    ;设置管理模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈,满递减模式;设置中断模式堆栈msr cpsr_c,#0xd2   ;设置11010010  切换到中断模式ldr sp,stackirq    ;设置中断模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈,满递减模式;设置快速中断模式堆栈msr cpsr_c,#0xd1   ; 设置11010001  切换到快速中断模式ldr sp,stackfiq    ;设置快速中断模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈,满递减模式;设置中止模式堆栈   msr cpsr_c,#0xd7   ; 设置11010111  切换到中止模式ldr sp,stackabt    ;设置中止模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈,满递减模式;设置未定义模式堆栈   msr cpsr_c,#0xdb   ; 设置11011011  切换到未定义模式ldr sp,stackund    ;设置未定义模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈,满递减模式;设置系统模式堆栈    msr cpsr_c,#0xdf   ; 设置11011111  切换到系统模式ldr sp,stackusr    ;设置系统模式堆栈地址stmfd sp!,{r1-r12} ;R1-R12入栈,满递减模式mov pc,r0 ;返回;为各模式堆栈开辟一段连续的字存储空间
stackusr    dcd  usrstackspace+(usr_stack_legth-1)*4
stacksvc    dcd  svcstackspace+(svc_stack_legth-1)*4
stackirq    dcd  irqstackspace+(irq_stack_legth-1)*4
stackfiq    dcd  fiqstackspace+(fiq_stack_legth-1)*4
stackabt    dcd  abtstackspace+(abt_stack_legth-1)*4
stackund    dcd  undstackspace+(und_stack_legth-1)*4;定义data段并命名area reset,data,noinit,align=2
;为各模式堆栈分配存储区域
usrstackspace space usr_stack_legth*4
svcstackspace space svc_stack_legth*4
irqstackspace space irq_stack_legth*4
fiqstackspace space fiq_stack_legth*4
abtstackspace space abt_stack_legth*4
undstackspace space und_stack_legth*4end

2、实验过程(含结果截图及相应文字解释):

实验过程中请记录并思考以下内容:

1)程序复位之后系统处于什么模式?

由上可知,系统复位后处于管理模式。

2)记录每种模式下的初始堆栈指针,以及执行R1-R12内容压栈后本模式堆栈相关内存单元的数值。并分析快速中断FIQ模式与其他模式存入的R1-R12有什么不同。

①管理模式

由上图可知,管理模式初始指针为0x8244。

执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示,可知压栈后,堆栈指针变为0x8214,离初始的堆栈指针0x30字节,即12个字(32位系统),从内存单元的数值可以看到分别与R1-R12存储的数值对应。

②中断模式

由上图可知,中断模式初始指针为0x8344。

执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示,可知压栈后,堆栈指针变为0x8314,离初始的堆栈指针0x30字节,即12个字(32位系统),从内存单元的数值可以看到分别与R1-R12存储的数值对应。

③快速中断模式

由上图可知,快速中断模式初始指针为0x8384。

执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示,可知压栈后,堆栈指针变为0x8354,离初始的堆栈指针0x30字节,即12个字(32位系统),从内存单元的数值可以看到分别与R1-R7存储的数值对应,说明该模式下仅能压入R1-R7,因为快速中断模式有自己的R8-R12。

④中止模式

由上图可知,中止模式初始指针为0x83C4。

执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示,可知压栈后,堆栈指针变为0x8394,离初始的堆栈指针0x30字节,即12个字(32位系统),从内存单元的数值可以看到分别与R1-R12存储的数值对应。

⑤未定义模式

由上图可知,未定义模式初始指针为0x8404。

执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示,可知压栈后,堆栈指针变为0x83D4,离初始的堆栈指针0x30字节,即12个字(32位系统),从内存单元的数值可以看到分别与R1-R12存储的数值对应。

⑥系统模式

由上图可知,系统模式初始指针为0x81C4。

执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示,可知压栈后,堆栈指针变为0x8194,离初始的堆栈指针0x30字节,即12个字(32位系统),从内存单元的数值可以看到分别与R1-R12存储的数值对应。

⑦用户模式:

由上图可知,用户模式初始指针为0x8194。

执行R1-R12内容压栈后本模式堆栈相关内存单元的数值如上图所示,可知压栈后,堆栈指针变为0x8164,离初始的堆栈指针0x30字节,即12个字(32位系统),从内存单元的数值可以看到分别与R1-R12存储的数值对应。

3)切换成用户模式之后还能否从用户模式切换到其他模式(如系统模式)?

由上图可知,当进行切换管理模式时,模式仍是用户模式,因此可知切换成用户模式之后,不能操作CPSR返回到其他模式。

4)用户模式下能否执行堆栈压栈操作?如果能得话,观察用户模式下压栈之前和压栈之后其堆栈区域的变化情况。

压栈前:

压栈后:

压栈后存储单元情况:

答:用户模式下可以执行堆栈压栈操作,且以4个字节(1个字)为单位进行压栈操作,压栈前堆栈区域情况如左图,压栈后如右图所示,对应的存储单元情况如上图。

5)观察本程序模式切换过程中SPSR有无变化,并解释其原因。

答:除了用户模式和系统模式,其余模式下都有一个私有SPSR保存状态寄存器. 用来保存切换到该模式之前的执行状态,SPSR是异常模式的程序状态保存寄存器, 当特定的异常中断发生时,这个寄存器存放CPSR的内容,在异常中断退出时,可以用SPSR来恢复CPSR,但是通过观察可知,整个切换过程中没有异常的发生,因此SPSR没有变化。

六、总结

ARM处理器模式分别是usr(用户模式),fiq(快速中断模式),irq(通用中断模式),svc(管理模式),abt(终止模式),sys(系统模式)以及und(未定义模式)。也通过ARM指令,实现了ARM不同模式的进入与退出,切换各种处理器模式,并观察各种模式下寄存器的区别。当特定的异常出现时,进入相应的模式。每种模式都有某些附加的寄存器,以避免异常出现时用户模式的状态不可靠。此外也使用状态寄存器到通用寄存器的传送指令(MRS)以及通用寄存器到状态寄存器的传送指令(MSR),修改状态寄存器通过“读取-修改-写回”三个步骤操作来实现。

相关文章:

嵌入式ARM设计编程(三) 处理器工作模式

文章和代码已归档至【Github仓库&#xff1a;hardware-tutorial】&#xff0c;需要的朋友们自取。或者公众号【AIShareLab】回复 嵌入式 也可获取。 一、实验目的 &#xff08;1&#xff09; 通过实验掌握学会使用msr/mrs 指令实现ARM 处理器工作模式的切换&#xff0c;观察不…...

jenkins构建报错:.java:16: error: package javafx.util does not exist

1、报错 jenkins构建报错 package javafx.util does not exist2、报错原因 代码发现使用了javafx类&#xff0c;该类仅存在OracleJDK中&#xff0c;OpenJDK中没有该类。 jenkins服务器安装的是openjdk 3、卸载OpenJDK 具体不概述了 4、离线安装OracleJDK 1&#xff09;…...

【第三天】策略模式

前言 策略模式是针对不同算法给出不同实现的方式&#xff0c;解耦代码&#xff0c;减少代码中if.....else代码书写量。 一、策略模式UNL类图 对象角色Context 上下文对象&#xff0c;依赖Strategy接口&#xff0c;一般像Context传入Strategy实现对象&#xff0c;执行策略方法…...

以应用为导向,看声纹识别中的音频伪造问题

声纹识别&#xff0c;又称说话人识别&#xff0c;是根据语音信号中的声纹特征来识别话者身份的过程&#xff0c;也是一种重要的生物认证手段。历经几十年的研究&#xff0c;当前声纹识别系统已取得了令人满意的性能表现&#xff0c;并在安防、司法、金融、家居等诸多领域中完成…...

RocketMQ源码分析之CommitLog消息存储机制

1、消息存储分析 1.1 DefaultMessageStore 概要 其核心属性如下&#xff1a; messageStoreConfig 存储相关的配置&#xff0c;例如存储路径、commitLog文件大小&#xff0c;刷盘频次等等。CommitLog commitLog comitLog 的核心处理类&#xff0c;消息存储在 commitlog 文件中…...

亿级高并发电商项目-- 实战篇 --万达商城项目 九(广告服务、安装Redis优化用户缓存、广告服务实现类等开发)

专栏&#xff1a;高并发---分布式项目 亿级高并发电商项目-- 实战篇 --万达商城项目搭建 一 &#xff08;商家端与用户端功能介绍、项目技术架构、数据库表结构等设计&#xff09; 亿级高并发电商项目-- 实战篇 --万达商城项目搭建 一 &#xff08;商家端与用户端功能介绍、项…...

FreeMarker生成word文档,固定word模板

该方法也就是通过freemarker生成固定的word文档&#xff0c;动态的word模板布局不能用该方法。 也就是必须有一个固定的模板文档是.ftl类型 如果初始文件为 需要手动改为&#xff1a; 也就是所有需要替换的地方&#xff0c;都需要有${XX}替换。 主要步骤为&#xff1a; 将 w…...

前端必学的CSS制作Switch动画开关按钮演示

目录 前言 CSS 制作的 Switch 动画开关按钮 1.Html构建 2.CSS编写 3.完整代码 index.html文件 style.css文件 总结 前言 随着前端技术的不断发展与进步&#xff0c;界面交互的样式要求和美感也越来越高&#xff0c;很多网页的交互都加上了css动画,这里作者给大家分享一…...

C语言运算符(左值右值,基本运算符)

一.数据对象&#xff0c;左值&#xff0c;右值&#xff0c;运算符 数据对象&#xff1a;用于存储值的数据存储区域统称&#xff0c;而使用变量名是标识对象的一种方法&#xff08;还有指针&#xff0c;后面会教的&#xff09; 左值&#xff1a;用于标识特定数据对象的名称或表…...

【自学Python】一文读懂Python字符串是否是数字

Python字符串是否是数字 Python字符串是否是数字教程 在开发过程中&#xff0c;有时候我们需要判断一个 字符串 是否是 数字 形式&#xff0c;在 Python 中&#xff0c;判断字符串是否只由数字组成的函数为 isnumeric() 。 isnumeric() 函数只能判断 unicode 字符串&#xf…...

【PTA Advanced】1146 Topological Order(C++)

目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 C 知识UP 代码 题目 This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topological order obtained from the given dire…...

基于stm32mp157的嵌入式linux+qt项目实战物联网毕业设计选题之智慧医疗项目

stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器&#xff0c;集成2个Cortex-A7核和1个Cortex-M4 核&#xff0c;A7核上可以跑Linux操作系统&#xff0c;M4核上可以跑FreeRT…...

Java实现邮件发送功能

确定发件人邮箱和密码某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”) 对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码) 确认发件人邮箱的 SMTP 服务器地址发件人邮箱的 SMTP 服务器地址, 必须…...

springboot+vue简单对接支付宝完整流程

源码 前端 vue-demo https://www.aliyundrive.com/s/dmnY8G6N6RM 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#xff0c;视频原画倍速播放。 后端 aliPay https://www.aliyundrive.com/s/H2JFBjGWuf2 …...

Map 查找表

Map体现的结构是一个多行两列的表格,其中左列称为key,右列称为value.Map总是成对保存数据,并且总是根据key获取对应的value.因此我们可以将查询的条件作为key查询对应的结果作为value保存到Map中.Map有一个要求:key不允许重复(equals比较的结果)java.util.Map接口,是所有Map的顶…...

python--石头剪刀布游戏(列表)

本使用了下面几篇文章的知识&#xff1a; python(8)--列表初阶使用_码银的博客-CSDN博客 python(7)--if语句_码银的博客-CSDN博客 一、学习目标 利用列表实现石头剪刀布游戏 二、实验环境 Pycharm社区版、win11 三、代码 先贴代码&#xff0c;有需要的直接拿&#xff0c;想要进…...

Project Caliper:目标是打造最佳VR手柄

一提到Valve Index&#xff0c;人们很快联想到它的五指追踪VR手柄&#xff0c;这款支持手势追踪和体感反馈的高端VR手柄&#xff0c;是市面上最强大的C端VR手柄之一。尽管如此&#xff0c;它依然存在许多缺陷&#xff0c;比如配备的小型摇杆质量不佳、集成式设计不利于维修、人…...

自动驾驶:BEV开山之作LSS(lift,splat,shoot)原理代码串讲

自动驾驶&#xff1a;BEV开山之作LSS&#xff08;lift,splat,shoot&#xff09;原理代码串讲前言Lift参数创建视锥CamEncodeSplat转换视锥坐标系Voxel Pooling总结前言 目前在自动驾驶领域&#xff0c;比较火的一类研究方向是基于采集到的环视图像信息&#xff0c;去构建BEV视角…...

C# 如何实现对“属性”的扩展

目录一、为什么要扩展属性二、如何做&#xff1f;一、为什么要扩展属性 属性是一个类的特征&#xff0c;随着开发的不断升级&#xff0c;这种特征可能在一直变化&#xff0c;有时候为了向下兼容&#xff0c;一般属性的数量都是直接递增的。 例如&#xff1a;一个Person类&…...

EBS 物料属性 先后台对应关系 MTL_SYSTEM_ITEMS_B

Introductionweb The basic table mtl_system_items_b is the basic table of item in ERP system and there are a lot of columns,but I don’t know used of each column,particularly the column like %_flag. The reason of general exception may be because the ‘%_fl…...

MYSQL数据库-主从复制(原理及搭建)

文章目录1 概述2 原理3 搭建3.1 主库配置3.2 从库配置1 概述 主从复制是指将主数据库的DDL和 DML操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行(也叫重做)&#xff0c;从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进…...

3GPP-NR Band25标准定义频点和信道(3GPP V17.7.0 (2022-12))

Reference test frequencies for NR operating band n25 Table 4.3.1.1.1.25-1: Test frequencies for NRoperating band n25 and SCS 15 kHz CBW [MHz]carrierBandwidth...

微信小程序 之 原生开发

目录 一、前期预备 1. 预备知识 ​2. 注册账号 - 申请AppID 3. 下载小程序开发工具 4. 小程序项目结构 ​5. 小程序的MVVM架构 二、创建小程序项目 1. 查看注册的appId ​2. 创建项目 ​3. 新建页面 01 - 创建text页面文件夹 ​02 - 新建text的page ​03 - 在app.json中配置 ​…...

常用vim命令和vim基本使用及Linux用户的管理,用户和组相关文件

常用vim命令和vim基本使用及Linux用户的管理&#xff0c;用户和组相关文件1. vim 的基本介绍和使用1.1 vim的三种模式1.2 常用vim命令【小白】1.3 Vim键盘图&#xff1a;2. Linux用户管理2.1 添加用户2.2 删除用户2.3 修改账号3. Linux系统用户组的管理4. 用户和组相关文件4.1 …...

阿里云服务器部署前后端分离项目

阿里云服务器部署 【若依】 前后端分离项目 文章目录一、域名解析二、服务器操作系统置空三、部署方式四、需安装环境配置五、Linux服务器安装相应内容&#xff08;具体安装步骤&#xff09;&#xff08;一&#xff09;安装JDK&#xff08;3种方式&#xff09;使用Yum安装&…...

内核经典数据结构list 剖析

前言&#xff1a;linux内核中有很多经典的数据结构&#xff0c;list(也称list_head)为其中之一&#xff0c;这些数据结构都是使用C语言实&#xff0c;并且定义和实现都在单独的头文件list.h中。可以随时拿出来使用。list.h的定义不同linux发行版本路径不同,我们可以在/usr/incl…...

华为OD机试 - 考优选核酸检测点(Python)| 真题+思路+考点+代码+岗位

优选核酸检测点 题目 张三要去外地出差,需要做核酸,需要在指定时间点前做完核酸, 请帮他找到满足条件的核酸检测点。 给出一组核酸检测点的距离和每个核酸检测点当前的人数给出张三要去做核酸的出发时间 出发时间是 10 分钟的倍数 同时给出张三做核酸的最晚结束时间题目中…...

在魔改PLUS-F5280开发板上使用合封qsp iflash

文章目录引言硬件调整软件调整总结引言 由于目前灵动官网暂未发布正式版的PLUS-F5280开发板&#xff0c;可以使用现有的PLUS-F5270 v1.2开发板&#xff08;下文简称PLUS-F5270开发版&#xff09;替换为MM32F5280微控制器芯片&#xff0c;改装为PLUS-F5280开发板。本文记录了使…...

uni-app 瀑布流

效果图 一、组件 components/u-myWaterfall.vue <template><view class"u-waterfall"><view id"u-left-column" class"u-column"><slot name"left" :leftList"leftList"></slot></view&…...

华为OD机试 - 去除多余空格(Python)| 真题+思路+考点+代码+岗位

去除多余空格 题目 去除文本多余空格,但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标,去除多余空格后刷新关键词的起始和结束下标。 条件约束: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oQABYuJD-1676475739950)(https://…...

做网站的价位/百度搜索引擎优化详解

可以访问 查看更多关于 消息中间件 的原创文章。移山是禧云自研的数据迁移平台&#xff0c;包含异构数据源的迁移、实时数据同步等服务。有兴趣的可以看这里&#xff1a;本文主要介绍移山实时数据同步服务产生的背景以及整体架构设计。可以访问一. 移山实时数据同步服务产生背…...

wordpress置顶精华图标/推广引流

本套文章是Java8官方GC调优指南的全文翻译&#xff0c;点击查看原文,原文章名称《Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide》4 Sizing the Generations 设置分代大小下图描述了堆内存已提交空间和虚拟空间的区别。在JVM启动初…...

网站建设论文框架/新闻软文发稿平台

我们知道定义一个委托之后&#xff0c;就可以像MyDelegate&#xff08;3&#xff0c;7&#xff09;这样回调方法&#xff0c;其实每一个委托对象都是一个类对象&#xff0c;每一个委托对象中都有一个Invoke的同步成员方法&#xff08;查MSDN得知&#xff09;&#xff0c;系统实…...

郑州网站建设选微锐x/商业软文案例

(1)String类是不可变类&#xff0c;即创建一个String对象后&#xff0c;包含在此对象中的字符序列是不可改变的&#xff0c;直至对象被销毁 String a”123”; a”456”; System.out.println(a);//结果是456 解释&#xff1a;重新对a赋值&#xff0c;并不是改变原来堆中实例对…...

建设网站需要什么知识/徐州百度seo排名

披萨店销售集 一个虚构的比萨饼店一年的销售额&#xff0c;包括每个订单的日期和时间以及提供的比萨饼&#xff0c;以及有关类型、大小、数量、价格和成分的其他详细信息。 数据集基本情况 文件类型 CSV文件 标签 商业食品与饮料时间序列&#xff0c;数据结构&#xff0c…...

自己做网站需要买什么/游戏推广论坛

一、Android Studio使用夜神模拟器进行调试开发&#xff1a; 1、首先打开Android Studio工具&#xff0c;然后再运行夜神模拟器 2、打开夜神模拟器bin运行目录&#xff08;如cd D:\Nox\bin&#xff09; 3、cmd执行命令&#xff1a;nox_adb.exe connect 127.0.0.1:62001&…...