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

news2024/9/21 12:36:47

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 bits

8.    .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.coloradmin.cn/o/2152336.html

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

相关文章

AIoT应用开发:给机器人装上‘眼睛‘,接入CV能力,实现人脸识别

最近新入手了一台 arm 开发板,希望打造一款有温度、有情怀的陪伴式 AI 对话机器人。 大体实现思路如下: 前几篇,给板子装上LLM 大脑、耳朵和嘴巴装上: 如何在手机端部署大模型?手机端跑大模型:Ollma/ll…

Windows通过网线传文件

文章目录 网线网络中看不到另一台计算机Nginx参考文献 网线 两台电脑用网线连接 电脑A 控制面板\网络和 Internet\网络和共享中心 → 更改适配器设置 → 右键以太网(未识别的网络) → 属性 → Internet 协议版本 4 (TCP/IPv4) 属性 → 使用下面的 IP …

【vmware】vmware中手动安装vmwaretools

问题: vmware中点击安装vmwaretools时出现如下: VMware Tools 不再随旧版客户机操作系统的 VMware Workstation 一起提供。 请从 https://packages-prod.broadcom.com/tools/frozen/windows/winPreVista.iso 下载,并参阅 https://knowledge.broadcom.co…

机器学习笔记(一)初识机器学习

1.定义 机器学习是一门多学科交叉专业,涵盖概率论知识,统计学知识,近似理论知识和复杂算法知识,使用计算机作为工具并致力于真实实时的模拟人类学习方式,并将现有内容进行知识结构划分来有效提高学习效率。 机器学习有…

2024年开放式蓝牙耳机十大排名震撼揭晓!哪款开放式耳机是音质王者?

​耳机市场上,有线入耳式、无线蓝牙入耳式和开放式耳机三足鼎立,各展风采。有线入耳式耳机虽然连接稳定,但线缆易缠绕,佩戴不够稳固;无线入耳式耳机虽然剪断了线的束缚,但长时间使用可能会引起耳朵不适。相…

人家90年代就尝试过的模式:我们所热衷的“数科公司”

在数字经济时代的浪潮中,央国企及一些大型集团企业作为经济发展的中流砥柱,正积极顺应时代潮流,加速数字化转型步伐。通过深度挖掘与整合内部资源,一批以数字经济为核心业务的“数科公司”应运而生,并迅速壮大&#xf…

SpringBoot设置mysql的ssl连接

因工作需要,mysql连接需要开启ssl认证,本文主要讲述客户端如何配置ssl连接。 开发环境信息: SpringBoot: 2.0.5.RELEASE mysql-connector-java: 8.0.18 mysql version:8.0.18 一、检查服务端是否开启ssl认…

Unity 设计模式 之 结构型模式 -【装饰者模式】【外观模式】【享元模式】【代理模式】

Unity 设计模式 之 结构型模式 -【装饰者模式】【外观模式】【享元模式】【代理模式】 目录 Unity 设计模式 之 结构型模式 -【装饰者模式】【外观模式】【享元模式】【代理模式】 一、简单介绍 二、装饰者模式(Decorator Pattern) 1、什么时候使用装…

OpenAI或于9月24日发布ChatGPT高级语音模式

🦉 AI新闻 🚀 OpenAI或于9月24日发布ChatGPT高级语音模式 摘要:科技媒体报道,OpenAI计划在9月24日进一步推广ChatGPT的高级语音模式,预计将正式发布。该模式于7月向部分ChatGPT Plus用户开放,提供更为真实…

心理辅导平台的构建:Spring Boot技术解析

3 系统分析 3.1可行性分析 在进行可行性分析时,我们通常根据软件工程里方法,通过四个方面来进行分析,分别是技术、经济、操作和法律可行性。因此,在基于对目标系统的基本调查和研究后,对提出的基本方案进行可行性分析。…

云栖大会Day1:云应用开发平台 CAP 来了

2024 云栖大会开幕,在大会第一天,阿里云正式发布全新产品——云应用开发平台 CAP。CAP 拥有丰富的场景化应用模板,可以极速体验,并且具备更低的成本优势以及灵活组装等特点,成为广大开发者与企业必备的一站式应用开发平…

芯片验证板卡设计原理图:372-基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台

基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台 一、板卡概述 基于V7的高性能PCIe信号处理板,北京太速科技板卡选用Xilinx 公司Virtex7系列FPGA XC7VX690T-2FFG1761C为处理芯片,板卡提供两个标准FMC插槽,适用于…

R18 NES 之SSB-less SCell operation for inter-band CA

在TR 21.918 Summary of Rel-18 Work Items 中可以看到SSB-less SCell operation for inter-band CA 是Network energy savings for NR 的一部分,其中还包括cell DTX/DRX 等等其他内容。 网络节能是 5G/NR 成功的关键,可以减少对环境的影响(温室气体排放)并节省运营成本。R…

全网首创开源:基于视频、物联、AI服务一体化解决方案

BasicLab-AIoT 引领创新智慧视觉物联网云平台,无界融合物联网技术、流媒体摄像头实时传输与AI人工智能解析,开启智能监控与数据分析新纪元。 我们不仅实现了设备的互联互通,更通过深度整合高清流媒体视频流与前沿AI算法,为摄像头…

Hive企业级调优[3]—— Explain 查看执行计划

Explain 查看执行计划 Explain 执行计划概述 EXPLAIN 命令呈现的执行计划由一系列 Stage 组成。这些 Stage 之间存在依赖关系,每一个 Stage 可能对应一个 MapReduce Job 或者一个文件系统的操作等。如果某 Stage 对应了一个 MapReduce Job,则该 Job 在 …

【开源】LVGL+FreeRTOS 基于STM32F411CEU6的健康助手项目制作

视频演示 【开源】LVGLFreeRTOS 基于STM32F411的智能健康助手小项目 网盘链接在最底下!!!无套路!!!直接分享!!! 硬件介绍 STM32F411CEU6 主控 TFT 1.8inch 显示屏 DTH…

基于SpringBoot+Vue的智慧物业管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏:Java精选实战项目源码、Python精…

828华为云征文 | 云服务器Flexus X实例:one-api 部署,支持众多大模型

目录 一、one-api 介绍 二、部署 one-api 2.1 拉取镜像 2.2 部署 one-api 三、运行 one-api 3.1 添加规则 3.2 运行 one-api 四、添加大模型 API 4.1 添加大模型 API 五、总结 本文通过 Flexus云服务器X实例 部署 one-api。Flexus云服务器X实例是新一代面向中小企业…

SOC的几种估算方法

一、前言 一般来说,业内可以将SOC的精度做到5%左右,如果想要让SOC精度进一步提升,这时需要提高电流采样的精度或者提高电流在0点的宽度(业内一般是判断电流小于一定的值,则说明电流为0),但这种提…

【LeetCode每日一题】——401.二进制手表

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 回溯 二【题目难度】 简单 三【题目编号】 401.二进制手表 四【题目描述】 二进制手表顶部…