Cortex-A7的GIC(全局中断控制器)使用方法(6):基于stm32MP135的IRQ初始化及处理流程分析

news2024/9/22 7:36:41

0 参考资料

STM32MP13xx参考手册.pdf(RM0475)
ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification.pdf

1 基于Cortex-A7的STM32MP135的IRQ初始化及处理流程分析

熟悉基于Cortex-M内核的stm32系列MCU的一定对中断向量表非常熟悉,在Cortex-M中断向量表存放了所有中断服务函数的地址,使用前需要设置中断向量偏移地址确定中断向量基地址,一旦产生异常或中断处理器就会自动跳转到相应的中断服务函数中执行中断(例如EXTI0_IRQHandler、USART1_IRQHandler等)。如下是基于Cortex-M7的stm32H743的部分中断向量表:O
在这里插入图片描述

在Cortex-A7中也有中断向量表,不过并没有包含所有的IRQ中断,而是将所有中断均归类到IRQ中。中断向量表如下:
在这里插入图片描述
因此发生中断时不会直接跳转到相应的中断服务函数内执行,而是跳转到IRQ中断服务函数统一处理。下面分析STM32MP135的IRQ初始化及处理流程。

1.1 初始化向量表基地址

   /* Set Vector Base Address Register (VBAR) to point to this application's vector table */
  "LDR    R0, =Vectors                             \n"
  "MCR    p15, 0, R0, c12, c0, 0                   \n"
  "ISB                                             \n"

这里通过设置VBAR(向量基地址寄存器)初始化向量基地址。
Vectors函数定义如下:

/*----------------------------------------------------------------------------
  Exception / Interrupt Vector Table
 *----------------------------------------------------------------------------*/
void Vectors(void) {
  __asm__ volatile(
  ".align 7                                         \n"
  "LDR    PC, =Reset_Handler                        \n"
  "LDR    PC, =Undef_Handler                        \n"
  "LDR    PC, =SVC_Handler                          \n"
  "LDR    PC, =PAbt_Handler                         \n"
  "LDR    PC, =DAbt_Handler                         \n"
  "LDR    PC, =Rsvd_Handler                         \n"
  "LDR    PC, =IRQ_Handler                          \n"
  "LDR    PC, =FIQ_Handler                          \n"
  );
}

编译之后的地址如下:
在这里插入图片描述
正好和Cortex-A7中定义的异常/中断偏移地址相对应,当发生IRQ中断时,PC指针便移动到相对于中断向量基地址+0x18的位置,然后执行语句“LDR PC, =IRQ_Handler”,将IRQ_Handler函数的地址放入PC指针,便开始执行IRQ_Handler函数。
需要注意的是,Reset_Handler函数被定义在代码段最开始的位置,这样当从BOOT跳转到APP或者stm32内部bootloader跳转时,只需要将PC指针指向代码段首地址便可以实现跳转。
在这里插入图片描述
注:0x2ffe0000是代码段首地址。

1.2 IRQ_Handler函数处理中断流程

IRQ_Handler函数如下:

void __attribute__((interrupt("IRQ"))) IRQ_Handler(void)
{
#elif defined(__ICCARM__)
__irq __arm void IRQ_Handler(void)
{
#endif
    uint32_t ItId;
    IRQHandler_t handler;

    while (1U)
    {
        /* Get highest pending Interrupt Id from GIC driver*/
        ItId = (uint32_t)IRQ_GetActiveIRQ();

        if (ItId <= GIC_HIGHEST_INTERRUPT_VALUE) /* Highest value of GIC Valid Interrupt */
        {
            /* Check validity of IRQ */
            if (ItId >= (uint32_t)MAX_IRQ_n)
            {
                SystemInit_IRQ_ErrorHandler();
            }
            else
            {
                /* Find appropriate IRQ Handler (Require registration before!) */
                handler = IRQ_GetHandler((IRQn_ID_t)ItId);

                if (handler != NULL)
                {
                    /* Call IRQ Handler */
                    handler();
                }
                else
                {
                    /* Un register Handler , error ! */
                    SystemInit_IRQ_ErrorHandler();
                }
            }

            /* End Acknowledge interrupt */
            IRQ_EndOfInterrupt((IRQn_ID_t)ItId);
        }
        else
        {
            /* Normal case: whenever there is no more pending IRQ , IAR returns ACKNOWLEDGE special IRQ value */
            if (ItId == GIC_ACKNOWLEDGE_RESPONSE)
            {
                break;
            }
            /* Spurious IRQ Value (1022)  ... */
            else
            {
                SystemInit_IRQ_ErrorHandler();
            }
        }
    }
}

执行步骤如下:
(1)获取激活/挂起的最高优先级中断ID
(2)查找中断ID对应的中断服务函数
(3)跳转到中断服务函数执行中断服务
(4)发送中断处理结束信号,本次中断处理完毕
(5)继续步骤(1)直到中断全部处理完毕
从以上步骤可以看到一个和Corex-M处理中断明显不同的地方,那就是高优先级中断已经无法抢占低优先级中断,这个在后面的实验中可以看到。

2 总结

(1)基于Cortex-A7的STM32MP135的IRQ不支持高优先级中断抢占低优先级中断执行

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

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

相关文章

RabbitMQ练习(Hello World)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials RabbitMQ是一个消息代理&#xff0c;它接受并转发消息。你可以将其想象成一个邮局&#xff1a;当你将需要邮寄的信件放入邮筒时&#xff0c;你可以确信邮递员最终会将邮件投递给你的收件人。在这个…

LDR6500-type-c 接口小封装PD取电协议芯片

LDR6500 Type-C PD取电芯片是一种基于Type-C接口的电源传输的协议芯片&#xff0c;它通过Type-C接口中的CC&#xff08;Configuration Channel&#xff09;线进行通信&#xff0c;协商电压、电流及供电方向。当设备连接时&#xff0c;双方会进行握手通信&#xff0c;以确定彼此…

在AMD GPU上进行Grok-1模型的推理

Inferencing with Grok-1 on AMD GPUs — ROCm Blogs 我们展示了如何通过利用ROCm软件平台&#xff0c;能在AMD MI300X GPU加速器上无缝运行xAI公司的Grok-1模型。 介绍 xAI公司在2023年11月发布了Grok-1模型&#xff0c;允许任何人使用、实验和基于它构建。Grok-1的不同之处…

Java学习Day29:查漏补缺

1.只创建对象不创建文件 2.过滤器 使用匿名内部类实现FileFilter接口&#xff0c;实现过滤&#xff1b; 递归实现遍历目录及子目录下的后缀为。txt文件 public class ioRee {public static void main(String[] args) throws IOException {File file new File("D:\\A&quo…

pywebview 入门

pywebview 入门 文档地址 地址 https://pywebview.flowrl.com/guide/ 一、pywebview 简介 1. 什么是 pywebview&#xff1f; pywebview 是一个轻量级的 python 库&#xff0c;旨在简化桌面应用程序的开发。它利用系统的 WebView 组件&#xff0c;使得开发人员可以使用现代 …

web过滤器,前后端同步异步交互,跨域问题,json等知识点

一.过滤器 (1)什么是过滤器 过滤器(Filter)&#xff1a;是web服务器管理所有的web资源例如servlet,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等。 (2)过滤器的作用 通过过滤器可以实现对服务器web资源的拦截&#xff0c;例如编码过滤器通过对web资源的过滤拦截可以实…

python-素数回文(赛氪OJ)

[题目描述] 现在给出一个素数&#xff0c;这个素数满足两点&#xff1a; 1、 只由 1∼9 组成&#xff0c;并且每个数只出现一次&#xff0c;如 13,23,1289 。 2、 位数从高到低为递减或递增&#xff0c;如 2459,87631 。 请你判断一下&#xff0c;这个素数的回文数是否为素数&a…

python之matplotlib (1 介绍及基本用法)

介绍 matplotlib是Python中的一个绘图库&#xff0c;它提供了一个类似于 MATLAB 的绘图系统。使用matplotlib你可以生成图表、直方图、功率谱、条形图、错误图、散点图等。matplotlib广泛用于数据可视化领域&#xff0c;是 Python 中最著名的绘图库之一。 同样matplotlib的安…

day23-测试自动化之Appium的滑动和拖拽事件、高级手势ActionChains、手机操作API

目录 一、滑动和拖拽事件 1.1.应用场景 1.2.swipe滑动事件 1.3.scroll滑动事件 1.4.drag_and_drop拖拽事件 1.5.滑动和拖拽事件的选择 二、高级手势ActionChains 2.1.应用场景 2.2.使用步骤 2.3.注意点 2.4.方法 1).手指轻敲操作 (掌握) 2).手势按下和抬起操作(掌握&#xff0…

【Win/Mac】InDesign 2024(id2024排版和设计软件)中文安装版

目录 一、软件概述 二、下载 三、主要特点 系统要求&#xff08;Windows 系统&#xff09; 一、最低系统要求 二、推荐系统要求 三、图形处理器要求 系统要求&#xff08;Mac 系统&#xff09; 一、最低系统要求 二、推荐系统要求 三、图形处理器要求 使用方法 一、…

【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】

&#x1f48c; 所属专栏&#xff1a;【单片机开发软件技巧】 &#x1f600; 作  者&#xff1a; 于晓超 &#x1f680; 个人简介&#xff1a;嵌入式工程师&#xff0c;专注嵌入式领域基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大家&#xff1…

缓存学习

缓存基本概念 概念 对于缓存&#xff0c;最普遍的理解是能让打开某些页面速度更快的工具。从技术角度来看&#xff0c;其本质上是因为缓存是基于内存建立的&#xff0c;而内存的读写速度相比之于硬盘快了xx倍&#xff0c;因此用内存来代替硬盘作为读写的介质当然能大大提高访…

亲测解决OneDrive: Proxy Authentication Error - 2606

这个问题由网络配置有误引起&#xff0c;解决方法是换网络或者关闭代理。 解决方法 换一个网络&#xff0c;比如手机wifi。如果开了代理可以把代理关了。 原版笔记 use vanilla network

RK3588——Linux系统烧录(以Firefly的Core-3588L为例)

Firefly的Core-3588L官网 1. 硬件连接 首先先用Type-C 一端数据线板子的OTG&#xff0c;另一端连接电脑的USB。 按住设备上的 RECOVERY &#xff08;恢复&#xff09;键并保持&#xff0c;连接电源&#xff0c;保持2秒左右&#xff0c;松开RECOVERY &#xff08;恢复&#xff…

图模型训练

一、依赖安装 网址&#xff1a;pyg-team/pytorch_geometric: Graph Neural Network Library for PyTorch (github.com) 找到此处&#xff0c;点击here进入依赖安装界面 找到自己安装的torch版本并点击&#xff0c;&#xff0c;进入安装依赖 二、用库自带的数据集 代码&#x…

WCT系列(二):SyncTransactionQueue类详解

SyncTransactionQueue类&#xff1a; 接上一回的WindowContainerTransaction类讲解&#xff0c;上一篇博客根据TaskView.java中的updateTaskVisibility()方法分析了WindowContainerTransaction的功能及使用。本次继续上一篇的思路&#xff0c;主要拆解syncTransactionQueue类。…

【JUC】06-可重入锁

可重入锁&#xff1a;又称递归锁。在外层使用锁后&#xff0c;内层仍然可以使用&#xff0c;并不发生死锁&#xff0c;这样的锁就叫可重入锁。synchronized默认是一个可重入锁。 public class Demo01 {public synchronized void m1() {System.out.println(Thread.currentThrea…

软件函数过期-软件开发故障处理-开发语言升级-全栈软件架构师-软件修仙界掌握几十门开发语言

一、软件界通用关键字 obsolete&#xff0c;deprecated&#xff0c;deprecation 二、多语言全栈&#xff0c;所有语言混合开发是什么&#xff1f;十几门开发语言 组合1、php/java/aspJSCandroid 平台物联网设备&#xff0c;智能音箱 组合2&#xff1a;C#PHPPYTHON 组合3&am…

云计算的三大服务模式:IaaS、PaaS、SaaS的深入解析

在数字化转型的浪潮中&#xff0c;云计算以其独特的灵活性、可扩展性和成本效益&#xff0c;正逐渐成为企业IT架构的核心。云计算提供了三种主要的服务模式&#xff0c;分别是基础设施即服务&#xff08;IaaS&#xff09;、平台即服务&#xff08;PaaS&#xff09;和软件即服务…

【算法/学习】双指针

✨ 少年要迎着朝阳&#xff0c;活得肆无忌惮 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;算法学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &a…