ThreadX源码:Cortex-A7的tx_thread_irq_nesting_start(嵌套中断开始动作).s汇编代码分析

news2024/9/20 9:10:35

0 参考资料

Cortex M3权威指南(中文).pdf(可以参考ARM指令集用法)

1 前言

tx_thread_irq_nesting_start.s是用来实现Cortex-A7 IRQ嵌套中断的开始函数实现的汇编文件。

2 源码分析

源码如下:

1  IRQ_DISABLE     =       0x80                    // IRQ disable bit
2  MODE_MASK       =       0x1F                    // Mode mask
3  SYS_MODE_BITS   =       0x1F                    // System mode bits

4   .global  _tx_thread_irq_nesting_start
5   .type    _tx_thread_irq_nesting_start,function
6   _tx_thread_irq_nesting_start:
7   MOV     r3,lr                               // Save ISR return address
8   MRS     r0, CPSR                            // Pickup the CPSR
9   BIC     r0, r0, #MODE_MASK                  // Clear the mode bits
10 ORR     r0, r0, #SYS_MODE_BITS              // Build system mode CPSR
11 MSR     CPSR_c, r0                          // Enter system mode
12 STMDB   sp!, {r1, lr}                       // Push the system mode lr on the system mode stack
13 //   and push r1 just to keep 8-byte alignment
14 BIC     r0, r0, #IRQ_DISABLE                // Build enable IRQ CPSR
15 MSR     CPSR_c, r0                          // Enter system mode
16 #ifdef __THUMB_INTERWORK
17 BX      r3                                  // Return to caller
18 #else
19 MOV     pc, r3                              // Return to caller
20 #endif

代码逐行分析:

1  IRQ_DISABLE     =       0x80                    // IRQ disable bit
2  MODE_MASK       =       0x1F                    // Mode mask
3  SYS_MODE_BITS   =       0x1F                    // System mode bits

说明:

汇编中可以使用EQU或=指令来定义宏常量,编译器会将这些定义的符号替换为它们所指定的值。

4   .global  _tx_thread_irq_nesting_start

说明:

.global 用于定义全局符号,以便于被其他文件引用;.local 用于定义局部符号, 仅在当前文件使用。

5   .type    _tx_thread_irq_nesting_start,function

说明:

.type用于设置符号的type属性,可选值为function或object(函数或对象(如全局变量))

这里设置_tx_thread_irq_nesting_start的属性为函数,可以供其它文件调用。

6   _tx_thread_irq_nesting_start:

指示_tx_thread_irq_nesting_start函数入口。

7   MOV     r3,lr

功能:
将lr(程序链接寄存器(用来保存子程序返回地址))的值保存到寄存器R3。

8   MRS     r0, CPSR

功能:
将CPSR寄存器的值保存到R0寄存器,特殊的寄存器如CPSR和SPSR必须通过该指令读取。

9   BIC     r0, r0, #MODE_MASK 

清空模式选择位,将R0寄存器的低5bit(0x1F)清空。

1、指令格式
bic{条件}{S} Rd,Rn,operand
2、指令说明
该指令的效果是,根据operand哪个位为1,清除Rn对应的位,然后将结果存入Rd。

CPSR寄存器低5位为处理器模式选择位,定义如下:
在这里插入图片描述

10 ORR     r0, r0, #SYS_MODE_BITS 

构造模式选择位,将R0寄存器的低5bit(0x1F)全部置1,配置为系统模式。
ORR指令是逻辑“或”指令。

1、指令格式
orr{条件}{S} Rd,Rn,operand
2、指令说明
orr指令,将Rn的值与操作数operand按位逻辑”或”,结果存放到目的寄存器Rd 中。
或者说,根据operand哪个位为1,将Rn对应的位设置为1,然后将结果存入Rd。

11 MSR     CPSR_c, r0

将R0寄存器的值存入CPSR寄存器,进入系统模式。
功能:将R0寄存器的值保存到CPSR寄存器,特殊的寄存器如CPSR和SPSR必须通过该指令写入。

12 STMDB   sp!, {r1, lr}  

在系统模式下将lr、r1依次压栈,保证8字节对齐。
STMDB指令用于将寄存器压栈。
举例:

指令:stmdb sp!,{r0-r12,lr}
含义:sp = sp - 4,先压lr,sp =lr(即将lr中的内容放入sp所指的内存地址)。sp = sp - 4,再压r12,sp = r12。sp = sp - 4,再压r11,sp = r11…sp = sp - 4,最后压r0,sp = r0。

14 BIC     r0, r0, #IRQ_DISABLE

构造CPSR寄存器内容,也就是将IRQ使能位置0,使能IRQ。
相关寄存器描述如下:
在这里插入图片描述
在这里插入图片描述

15 MSR     CPSR_c, r0

将R0寄存器的值写入CPSR寄存器,进入使能IRQ的系统模式。

17 BX      r3 

执行结束,返回父函数。
如果编译器生成的代码使用Thumb指令集,则执行该语句。
BX指令:带状态切换的跳转指令

BX 指令跳转到指令中所指定的目标地址, 目标地址处的指令既可以是ARM 指令,也可以是Thumb指令。因为 BX 指令会根据 Rm的最低两位切换处理器的状态(ARM指令是4字节对齐,最低两位可以用作状态指示,如果最低两位是0,表示切换到ARM状态;Thumb指令是2字节对齐,最低一位可以用作指示,如果最低一位是1,表示切换到Thumb状态)

19 MOV     pc, r3 

将r3寄存器的值写入PC,返回父函数。
如果编译器生成的代码使用ARM指令集,则执行该语句。

3 总结

tx_thread_irq_nesting_start.s的主要功能就是在进入IRQ时,将模式切换到系统模式然后使能IRQ(硬件进入IRQ会自动失能IRQ),使得IRQ能够被嵌套。
这里有个关键操作,在系统模式下需要将进入中断前的LR压入系统模式栈区,以便后面退出中断时LR值恢复被中断打断,避免系统模式下进入子函数(使用BL指令会修改LR的值)后LR被修改无法返回父函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

遍历指定的目录a中的所有子目录及所有文件os.walk(root_dir)

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 遍历指定的目录a 中的所有子目录 及所有文件 os.walk(root_dir) [太阳]选择题 已知已经存在的目录和文件情况如下: a目录下有子目录b,有两个文件:a1.txt和…

Flet全平台开发:软件开发界勇士为Python语言补短板的一次极具挑战性的尝试、冲刺和华丽亮相

一、Flet创始人和开发者介绍、开发Flet的背景介绍 Flet 的创始人和开发者 Feodor Fitsner 是俄罗斯人,就职于微软。 Flet 的第一个版本于 2022 年 6 月发布。这是一个相对较新的库,它基于 Flutter 框架,首先支持的是用 Python 语言开发软件…

2024/9/17 pytorch-卷积神经网络

一、torch.nn pytorch有很多接口,其中的torch.nn可以让我们方便的调用以便生成神经网络各层 1.torch.nn.Module 是一个构成神经网络层的一个基本类别,一般生成一个类别来继承nn.module torch.tensor(a)将a初始化为一个tensor类型数据 一般这种已经固…

攻防世界--->hackme

学习笔记。 下载 查壳。 64ida打开。 进入main&#xff1a; 跟进&#xff1a; 这是密文 咋一看这程序感觉很复杂&#xff0c;很复杂&#xff1a; 脚本&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h>int main() {unsigned char …

Qt --- 信号和信号槽

前言 Linux信号Signal&#xff0c;系统内部的通知机制&#xff0c;进程间通信方式。 信号源&#xff1a;谁发的信号。 信号的类型&#xff1a;哪种类别的信号。 信号的处理方式&#xff1a;注册信号处理函数&#xff0c;在信号被触发的时候自动调用执行。 Qt中的信号和Lin…

Bugku---密码学---乐谱密码

题目出处&#xff1a;首页 - Bugku CTF ✨打开后发现是一张乐符图 ✨一般我们所熟悉的「Do Re Mi Fa Sol La Si」&#xff0c;若写成音名&#xff0c;即是「C D E F G A B」。不过德国人习惯使用的音名则是「C D E F G A H」&#xff0c;「B」代表 音名B♭ 。 C也就是后面的4&…

Rust练手项目,写个有趣的小工具定时从一言网获取一段有趣的话并推送通知

Rust练手项目&#xff0c;写个有趣的小工具 代码 继续练习Rust, 写个小工具定时从一言网获取一段有趣的话并提示&#xff0c;如下 练习以下Rust点 并发编程 Mutex, Arc指针使用HTTP请求Windows Gui 代码 Cargo.toml [package] name "funny_word" edition "20…

YOLOv8目标检测模型——遥感小目标检测经验分享

小目标检测——YOLOV8 一、引言 背景介绍 &#xff08;1&#xff09;目标检测的重要性 目标检测在许多领域都具有极其重要的作用。在自动驾驶中&#xff0c;目标检测能够识别道路上的障碍物和行人&#xff0c;确保行车安全。在视频监控中&#xff0c;目标检测能够实时发现异…

【matlab】生成 GIF 的函数(已封装可直接调用)

文章目录 前言一、函数输入与输出二、函数代码三、例程&#xff08;可直接运行&#xff09;参考文献 前言 生成 gif 图片时遇到的问题&#xff0c;为了后续调用方便&#xff0c;封装为函数 一、函数输入与输出 输入&#xff1a; cell_figure: cell 数组&#xff0c;数组元素是…

Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用增强版

前言 之前使用Chainlit集成LlamaIndex并使用通义千问大语言模型的API接口&#xff0c;实现一个基于文档文档的网页对话应用。 可以点击我的上一篇文章《Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用》 查看。 本次针对上一次的代码功能进一步的完善…

Cursor与Copilot:编程界的双雄对决

引子 在技术快速发展的当下&#xff0c;编程几乎成为了现代社会的基础能力。Cursor与Copilot作为当前备受瞩目的编程助手&#xff0c;各自展现出了独特的魅力。它们不仅改变了程序员的工作方式&#xff0c;更是提升了代码编写的效率&#xff0c;成为了编程界的“双雄”。 Curs…

软件安全、逆向分析、加密与解密--crackme2详解

本次使用到的软件有&#xff1a;PEiD、IDA、X32dbg 刚学逆向不久&#xff0c;可能有些地方会有错误&#xff0c;欢迎各位大佬指导 执行 运行程序 点击About 点击确定&#xff0c;输入如图数据 点击try Now 点击确定&#xff0c;回到主界面 点击Exit&#xff0c;退出 查壳&a…

Docker:SpringBoot项目创建Docker镜像并推送到阿里云容器镜像仓库

0. 准备工作 os&#xff1a;macos 15.0 jdk&#xff1a;1.8 docker&#xff1a;26.0.0 1. 阿里云容器镜像服务创建实例 创建个人版 个人实例创建成功 个人镜像加速器地址 2. 安装Docker Desktop Docker Desktop是Docker的一个集成工具&#xff0c;非必须&#xff0c;过程…

指纹与指甲检测系统源码分享

指纹与指甲检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

这个时代唯一“不变“的又是{变}

这个时代唯一不变的就是“变”&#xff0c;所以每个人都得有规划意识&#xff0c;首先要对自己的价值有清晰的认知&#xff0c;你核心卖点是什么。第二&#xff0c;你取得的成绩是通过平台成就的还是通过自身努力取得的&#xff0c;很多人在一家平台待久了之后&#xff0c;身上…

在Unity UI中实现UILineRenderer组件绘制线条

背景介绍 在Unity的UI系统中&#xff0c;绘制线条并不像在3D世界中那样直观(使用Unity自带的LineRender组件在UI中连线并不方便,它在三维中更合适)。没有内置的工具来处理这种需求。如果你希望在UI元素之间绘制连接线&#xff08;例如在UI上连接不同的图标或控件&#xff09;&a…

26. 构建一个矩形平面几何体

定义矩形几何体顶点坐标 一个矩形平面&#xff0c;可以至少通过两个三角形拼接而成。而且两个三角形有两个顶点的坐标是重合的。 注意三角形的正反面问题&#xff1a;保证矩形平面两个三角形的正面是一样的&#xff0c;也就是从一个方向观察&#xff0c;两个三角形都是逆时针…

Docker 消息队列RabbitMQ 安装延迟消息插件

介绍 RabbitMQ的官方推出了一个插件&#xff0c;原生支持延迟消息功能。该插件的原理是设计了一种支持延迟消息功能的交换机。当消息投递到交换机后可以暂存一定时间&#xff0c;到期后再投递到队列。 查看版本号 docker exec rabbit名字 rabbitmqctl version根据版本下载 插…

neo4j(spring) 使用示例

文章目录 前言一、neo4j是什么二、开始编码1. yml 配置2. crud 测试3. node relation 与java中对象的关系4. 编码测试 总结 前言 图数据库先驱者 neo4j&#xff1a;neo4j官网地址 可以选择桌面版安装等多种方式,我这里采用的是docker安装 直接执行docker安装命令: docker run…

一键更换软件源的工具——chsrc

前言 经常用pip&#xff0c;ubuntu的apt&#xff0c;或者centos的yum等包下载工具的人不可避免的一件事就是——“更换软件源”&#xff0c;因为以上三个包下载工具的软件源一般都是默认为国外的官方网站&#xff0c;由于国情问题&#xff0c;下载速度就会非常慢&#xff0c;所…