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

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 bits4   .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.xdnf.cn/news/1537780.html

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

相关文章

文本多语言 AI 摘要 API 数据接口

文本多语言 AI 摘要 API 数据接口 文本 / 文本摘要 AI 生成文本摘要 AI 处理 / 智能摘要。 1. 产品功能 支持多语言摘要生成;支持长文本处理;基于 AI 模型,持续迭代优化;不存储 PDF 文件,处理完即释放,保…

讲个故事5.0

一、DORL的输入 1.1 训练集 训练集共有两个,分别为dataset_train和train_collector。dataset_train用于训练用户模型,即训练论文图6中的GPM,该训练过程有验证集无测试集;train_collector用于学习策略,即学习论文图6中…

ollama安装(ubuntu20.04)

Ollama是一款开源的自然语言处理工具,它可以帮助开发者快速构建文本处理应用。 ollama官网: https://ollama.ai/ 一、ollama 自动安装 linux统一采用sh脚本安装,一个命令行搞定。 curl -fsSL https://ollama.com/install.sh | sh二、ollama 手动安装 o…

springboot实战学习笔记(2)

目录 1、手动创建springboot工程,选择Maven构建。 2、Maven生成的,可能需要再main目录下new一个resources目录,再在其下目录new一个配置文件。 3、 pom文件中让当前的工程继承父工程依赖:、删去无用依赖。 4、引入后端环境所需要的…

Chainlit集成Langchain并使用通义千问AI知识库高级检索(多重查询)网页对话应用教程

前言 之前写过几篇利用Chainlit集成Langchain和国内通义千问大模型集成的知识库检索增加的网页对话应用的技术文章。文章中关于Langchain的知识库检索只是入门级别的教学,本篇文章针对Langchain的知识库高级检索技术和之前对话应用的代码进行完善。 本次主要改进的…

Flask-JWT-Extended登录验证

1. 介绍 """安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外,你还可以指定其他的选项,例如:过期时间 (max_age)&…

一款.NET开源的i茅台自动预约小助手

前言 今天大姚给大家分享一款.NET开源、基于WPF实现的i茅台APP接口自动化每日自动预约(抢茅台)小助手:HyggeImaotai。 项目介绍 该项目通过接口自动化模拟i茅台APP实现每日自动预约茅台酒的功能,软件会在指定时间开始对管理的用…

gh-ost

优质博文:IT-BLOG-CN 一、gh-ost的作用 gh-ost是由Github提供的Online DDL工具,使用binlog代替之前的触发器做异步增量数据同步,从而降低主库负载。 基于触发器的Online DDL工具原理: 【1】根据原表结构执行alter语句&#xff…

leetcode-4. 寻找两个正序数组的中位数

题目描述 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1: 输入:nums1 [1,3], nums2 [2] 输出:2.0…

婚礼弹幕上墙阳光正好,爱意正浓,打造一场出圈的唯美婚礼!

原文地址 婚礼现场的弹幕功能可以给整个场景增添温暖和喜庆的氛围。通过手机发送祝福,让亲友可以即时将祝福传达给新人,同时这些祝福以弹幕的形式在大屏幕上滚动展示,增加了现场互动的乐趣。墙上新闻搭配的功能则更加抢眼,不仅可…

基于代理的分布式身份管理方案

目的是使用分布式的联合计算分发去替换掉区块链中原有的类第三方可信中心的证书机制,更加去中心化。 GS-TBK Group Signatures with Time-bound Keys. CS-TBK 算法 Complete subtree With Time-bound Keys,该算法是用来辅助检测用户的签名是否有效&…

LabVIEW提高开发效率技巧----使用快捷键

在LabVIEW的开发过程中,熟练掌握和运用快捷键可以极大地提升工作效率,减少重复性操作所花费的时间。快捷键不仅可以加快编程速度,还能让开发者更加专注于逻辑实现和功能设计。细问问将详细介绍LabVIEW中的常用快捷键,特别是强大的…

【变化检测】基于HANet建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下: 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、HANet模型训练与预测 4、Onnx运行及可视化 运行环境:Python3.8,torch1.12.0cu113,onnxruntime1.19.2【这里装CPU版,GPU版低于1.19.2算子报错】 likyo…

一招解决微软copilot提示:该服务在您所在的地区不可用

随着windows 11的推出很多网友都开始注意到了微软copilot AI助手。科技快速发展当前AI已经是一个家喻户晓的名词了, 尤其是一些之前体验过ai强大功能的用户,对AI更加是爱不释手。虽然win 11 版本已经将copilot集成到系统当中,然后不少网友在想要体验时却…

kali里面搭建docker容器

注意事项:kali版本,镜像源 (1)权限为管理员: sudo su (2) 更新软件包列表并升级已安装的软件包 apt-get update apt-get upgrade 出错了,应该是更新源出问题了。 (3)更换镜像源&am…

stm32开发之串口空闲中断和环形数组的最简单的组合使用

前言 本次使用的是lwrb开源的源码;测试环境使用的是stm32f407zgt6这里不介绍lwrb的内容,如有需要请自行去查阅.这里会使用到rt_container_of的宏定义(相关介绍请参考rt_thread或linux源码相关的宏定义,其表达的内容是一致的)这里使用的是threadx做为os本…

Java调用数据库 笔记05

一. 数据库(通过各种驱动来实现调用): (应用程序通过接口控制的各种数据库驱动来调用数据库-->jdbc方法) 1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类…

TCP并发服务器的实现

一请求一线程 问题 当客户端数量较多时,使用单独线程为每个客户端处理请求可能导致系统资源的消耗过大和性能瓶颈。 资源消耗: 线程创建和管理开销:每个线程都有其创建和销毁的开销,特别是在高并发环境中,这种开销…

开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择

摘要:本文探讨了开源 AI 智能名片链动 21 模式 O2O 商城小程序在社群经济中的重要性,着重分析了如何借助该小程序适时举办大型活动以维持和引爆社群活跃度。通过对活动时机选择的研究,强调了针对社群用户量身定制活动时机的必要性&#xff0c…

简单了解微服务--黑马(在更)

认识微服务 单体架构 不适合大型复杂项目 微服务架构 将单体结构的各个功能模块拆分为多个独立的项目 拆取的独立项目分别开发,在部署的时候也要分别去编译打包,分别去部署,不同的模块部署在不同的服务器上,对外提供不同的功能…