ThreadX源码:Cortex-A7的tx_thread_irq_nesting_end(嵌套中断结束动作).s汇编代码分析

0 参考资料

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

1 前言

tx_thread_irq_nesting_end.S是用来实现Cortex-A7 IRQ嵌套中断的结束函数实现的汇编文件。

2 源码分析

源码如下:

1.#ifdef TX_ENABLE_FIQ_SUPPORT
2.DISABLE_INTS    =       0xC0                    // Disable IRQ/FIQ interrupts
3.#else
4.DISABLE_INTS    =       0x80                    // Disable IRQ interrupts
5.#endif
6.MODE_MASK       =       0x1F                    // Mode mask
7.IRQ_MODE_BITS   =       0x12                    // IRQ mode bits8.    .global  _tx_thread_irq_nesting_end
9.    .type    _tx_thread_irq_nesting_end,function
10._tx_thread_irq_nesting_end:
11.    MOV     r3,lr                               @ Save ISR return address
12.    MRS     r0, CPSR                            @ Pickup the CPSR
13.    ORR     r0, r0, #DISABLE_INTS               @ Build disable interrupt value
14.    MSR     CPSR_c, r0                          @ Disable interrupts
15.    LDMIA   sp!, {r1, lr}                       @ Pickup saved lr (and r1 throw-away for 
16.                                                @   8-byte alignment logic)
17.    BIC     r0, r0, #MODE_MASK                  @ Clear mode bits
18.    ORR     r0, r0, #IRQ_MODE_BITS              @ Build IRQ mode CPSR
19.    MSR     CPSR_c, r0                          @ Re-enter IRQ mode
20.#ifdef __THUMB_INTERWORK
21.    BX      r3                                  @ Return to caller
22.#else
23.    MOV     pc, r3                              @ Return to caller
24.#endif

代码逐行分析:

1.#ifdef TX_ENABLE_FIQ_SUPPORT
2.DISABLE_INTS    =       0xC0                    // Disable IRQ/FIQ interrupts
3.#else
4.DISABLE_INTS    =       0x80                    // Disable IRQ interrupts
5.#endif
6.MODE_MASK       =       0x1F                    // Mode mask
7.IRQ_MODE_BITS   =       0x12                    // IRQ mode bits

说明:

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

8.    .global  _tx_thread_irq_nesting_end

说明:

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

9.    .type    _tx_thread_irq_nesting_end,function

说明:

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

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

10._tx_thread_irq_nesting_end:

指示_tx_thread_irq_nesting_end函数入口。

11.    MOV     r3,lr                               @ Save ISR return 

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

12.    MRS     r0, CPSR

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

13.    ORR     r0, r0, #DISABLE_INTS

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

14.    MSR     CPSR_c, r0

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

15.    LDMIA   sp!, {r1, lr} 

在系统模式下r1、lr依次出栈,保证8字节对齐。
LDMIA指令用于将寄存器出栈。
用法如下:
在这里插入图片描述

16.    BIC     r0, r0, #MODE_MASK 
18.    ORR     r0, r0, #IRQ_MODE_BITS 

构造CPSR寄存器内容,首先将模式选择位清空,然后将模式设置为IRQ模式。
CPSR寄存器低5位为处理器模式选择位,定义如下:
在这里插入图片描述

19.    MSR     CPSR_c, r0 

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

21.    BX      r3

执行结束,返回父函数。
如果编译器生成的代码使用Thumb指令集,则执行该语句。
BX指令用法如下:
在这里插入图片描述

23.    MOV     pc, r3 

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

3 总结

tx_thread_irq_nesting_start.s的主要功能就是在完成了中断嵌套工作之后,将模式由系统模式切换到IRQ模式(切换到IRQ模式前使能IRQ)。
这里有个关键操作,就是将进入嵌套中断时保存在系统模式栈区的LR出栈,以便退出中断结束时返回中断打断点继续执行,LR仍然是打断前的值,否则系统模式下函数无法正常返回(LR存储了函数返回地址)。

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

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

相关文章

【 ACM独立出版,见刊后1个月检索!!!】第二届通信网络与机器学习国际学术会议(CNML 2024,10月25-27)

第二届通信网络与机器学习国际学术会议(CNML 2024) The 2nd International Conference on Communication Networks and Machine Learning 官方信息 会议官网:www.cn-ml.org The 2nd International Conference on Communication Networks an…

jd 京东h5st 最新版 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我…

【Qt网络编程】Tcp多线程并发服务器和客户端通信

目录 一、编写思路 1、服务器 (1)总体思路widget.c(主线程) (2)详细流程widget.c(主线程) (1)总体思路chat_thread.c(处理聊天逻辑线程&…

运筹说 第125期 | 存储论经典例题讲解1

通过前几期的学习,我们已经学会了存储论的基本概念、确定型存储模型、单周期的随机型存储模型、其他的随机型存储模型以及存储论应用研究中的一些问题。在实际工作中,我们能发现存储论在能源行业中有着许多应用,本期小编选择了其中一些确定型…

PyQt5-折叠面板效果

效果预览 实际效果中带有白色面板,看如下代码 实现代码 import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QFrame, QLabel, QSizePolicy from PyQt5.QtCore import QPropertyAnimation, QEasingCurve, Qtclass CollapsiblePanel(QW…

C#:强大编程语言的多面魅力

C#:强大编程语言的多面魅力 一、C# 语言的特点与优势 (一)简洁的语法与精心设计 C# 在继承 C 和 C 的强大功能的同时,去掉了一些复杂特性,如宏和多重继承,使得语言更加简洁易懂。C# 是一种面向对象的语言…

openGauss之NestedLoop Join内表 Reuse

一. 前言 openGuass支持在做nestloop的时候,支持通过Materialize的方式将内表缓存到内存中,然后外表的数据内表数据进行碰撞的时候,如果内表已经缓存了数据,那么直接从缓存中直接读取内表的数据,从而实现内部数据Reuse…

基于SSM的在线家用电器销售系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSSMVueMySQL的在线家…

7--SpringBoot-后端开发、原理

配置优先级 SpringBoot 项目当中支持的三类配置文件: application.properties application.yml application.yaml 配置文件优先级排名(从高到低): 1. properties配置文件 2. yml配置文件 3. yaml配置文件 在SpringBoot项目当…

MySQL 日志篇:Redo 相关线程

在 MySQL 中,用户线程开启事务更改数据时,系统内部会生成相应的 Redo Record。为了保证事务的持久性,这些 Redo Record 需要以 Redo Log 的形式在事务提交之前写入磁盘 (也称为“落盘”)。 为了提高事务的吞吐率 (单位时间内系统处理的事务数…

JavaSE - 面向对象编程01

01 什么是面向对象编程(oop) 答:就是只关心对象之间的交互,而并不关心任务是怎样具体完成的。例如把一个大象放进冰箱需要几步?如果是面向对象编程只会思考冰箱和大象之间的交互,那么给出的答案就是:把冰箱门打开&…

不可错过的AIGC浪潮:提升效率与竞争力的必备神器

随着人工智能生成内容(AIGC)技术的迅猛发展,它在提升工作效率和改善生活质量方面展示了巨大的潜力。对职场人来说,了解AIGC如何改变各个行业,并探讨其未来发展中的风险和机遇,将有助于他们更好地利用这项技…

三相可控整流电路 (三相半波,三相桥式)

目录 1. 三相半波整流电路 2. 三相桥式全控整流电路 三相可控整流电路利用三相交流电源,通过可控硅(晶闸管)将交流电整流为直流电。主要有两种常见类型:三相半波整流电路和三相桥式全控整流电路。 1. 三相半波整流电路 三相半波…

Java数据存储结构——二叉查找树

文章目录 22.1.2二叉查找树22.1.2.1 概述22.1.2.1二叉查找树添加节点22.1.2.2二叉查找树查找节点22.1.2.3 二叉树遍历22.1.2.4 二叉查找树的弊端 22.1.2二叉查找树 22.1.2.1 概述 二叉查找树,又称二叉排序树或者二叉搜索树 二叉查找树的特点: 每一个节点上最多有…

你的绩效是不是常年都是B

原创不易,求赞,求关注,🙏🙏🙏🙏🙏🙏🙏🙏 目录 原创不易,求赞,求关注,🙏🙏&#x1f64…

PCL 点云生成DSM图 (高程模型图)

🙋 结果预览 🔗接上篇 Python 点云生成高程模型图(DSM) 一、代码实现 #include <pcl/io/pcd_io.h> //PCD读写类相关的头文件 #include

使用java程序对字符串进行加密

程序功能 程序的功能是对用户输入的字符串&#xff0c;使用常见的三种加密算法&#xff08;MD5、SHA-1 和 SHA-256&#xff09;进行加密&#xff0c;并输出每种算法加密后的结果。 主要步骤包括&#xff1a; 用户通过控制台输入一个字符串。 程序使用 MessageDigest 类&#x…

DFS:深搜+回溯+剪枝实战解决OJ问题

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 排列、子集问题 1.1 全排列I 1.2 子集I 1.3 找出所有子集的异或总和 1.4 全排列II 1.5 字母大小写全排列 1.6 优美的排列 二 组合问题 2.1 电话号码的数字组合 …

三菱模拟量入门接线与编程详解

当我们学会完基础后。下面就需要学习模拟量,希望小编的文章对读者有所帮助! 什么是模拟量? 模拟量是指一些连续变化的物理量(简单来说就是连续变化的量),在PLC中通常电压信号为0~10V,电流信号为4~20mA。 为什么要使用模拟量? 当我们需要检测如电压、电流、压力、速度、…

【计网】从零开始使用TCP进行socket编程 --- 客户端与服务端的通信实现

阵雨后放晴的天空中&#xff0c; 出现的彩虹很快便会消失。 而人心中的彩虹却永不会消失。 --- 太宰治 《斜阳》--- 从零开始使用TCP进行socket编程 1 TCP与UDP2 TCP服务器类2.1 TCP基础知识2.2 整体框架设计2.3 初始化接口2.4 循环接收接口与服务接口 3 服务端与客户端测试…