Cortex-A7的GIC(全局中断控制器)使用方法(7):基于stm32MP135的GIC配置中断效果测试
0 参考资料
STM32MP13xx参考手册.pdf(RM0475)
ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification.pdf
1 GIC配置中断效果测试
前面我们已经实现了GIC的配置,为了验证GIC是否配置有效,本例使用软件触发EXTI中断,来测试这些GIC配置的优先级位数、主优先级位数是否有效。
1.1 优先级位数测试
测试方法(测试优先级位数是否有效):
初始化GIC优先级位数为5,主优先级个数也为5,这样配置以后主优先级0-30(大于31)的中断都会响应。配置外部中断EXTI0的主优先级为0,配置外部中断EXTI1的主优先级为30,同时触发这2个软件中断查看能否正常响应。
(1)测试代码
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{switch (GPIO_Pin){case GPIO_PIN_0:printf("EXTI0 Rising\r\n");break;case GPIO_PIN_1:printf("EXTI1 Rising\r\n");break;}
}void EXTI0_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}void EXTI1_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
}void gic_test_example(void)
{int ret;ret = gic_init(5, 5);printf("gic init : %s\r\n", ret == 0 ? "ok" : "fail");ret = gic_prio_config(EXTI0_IRQn, 0, 0);printf("gic prio config 0 : %s\r\n", ret == 0 ? "ok" : "fail");ret = gic_prio_config(EXTI1_IRQn, 30, 0);printf("gic prio config 1 : %s\r\n", ret == 0 ? "ok" : "fail");SET_BIT(EXTI->SWIER1, 1);HAL_Delay(100);SET_BIT(EXTI->SWIER1, 2);HAL_Delay(100);
}
(2)测试结果

0-30的抢占优先级中断均能响应。
1.2 主优先级测试
测试方法(测试高主优先级中断能否抢占低主优先级中断,前面代码分析已经得出结论:无法抢占):
初始化GIC优先级位数为5,主优先级个数也为5,这样配置以后主优先级在0-30(大于31)的中断都会响应。配置外部中断EXTI0的主优先级为30,配置外部中断EXTI1的主优先级为0,首先生成外部中断EXTI0,然后在EXTI0中生成外部中断EXTI1,查看EXTI1能否抢占EXTI0执行。相关测试代码如下:
(1)测试代码
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{switch (GPIO_Pin){case GPIO_PIN_0:imx_printf("EXTI0 Rising 1\r\n");SET_BIT(EXTI->SWIER1, 2);HAL_Delay(10);imx_printf("EXTI0 Rising 2\r\n");break;case GPIO_PIN_1:imx_printf("EXTI1 Rising\r\n");break;}
}void EXTI0_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}void EXTI1_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
}void gic_test_example(void)
{int ret;ret = gic_init(5, 5);imx_printf("gic init : %s\r\n", ret == 0 ? "ok" : "fail");ret = gic_prio_config(EXTI0_IRQn, 10, 0);imx_printf("gic prio config 0 : %s\r\n", ret == 0 ? "ok" : "fail");ret = gic_prio_config(EXTI1_IRQn, 0, 0);imx_printf("gic prio config 1 : %s\r\n", ret == 0 ? "ok" : "fail");SET_BIT(EXTI->SWIER1, 1);HAL_Delay(100);
}
(2)测试结果

受限于目前STM32MP135对中断的处理方式,高抢占优先级中断无法抢占已经在执行的低抢占优先级中断。
1.2 子优先级测试
测试方法(测试主优先级相同情况下,子优先级更高的能否先响应):
初始化GIC优先级位数为5,主优先级个数为3。配置外部中断EXTI0的主优先级为5、子优先级为1,配置外部中断EXTI1的主优先级为5、子优先级为0。同时生成软件中断EXTI0、EXTI1,查看EXTI1能否先于EXTI0执行。
(1)测试代码
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{switch (GPIO_Pin){case GPIO_PIN_0:imx_printf("EXTI0 Rising\r\n");break;case GPIO_PIN_1:imx_printf("EXTI1 Rising\r\n");break;}
}void EXTI0_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}void EXTI1_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
}void gic_test_example(void)
{int ret;__disable_irq();ret = gic_init(5, 3);imx_printf("gic init : %s\r\n", ret == 0 ? "ok" : "fail");ret = gic_prio_config(EXTI0_IRQn, 5, 1);imx_printf("gic prio config 0 : %s\r\n", ret == 0 ? "ok" : "fail");ret = gic_prio_config(EXTI1_IRQn, 5, 0);imx_printf("gic prio config 1 : %s\r\n", ret == 0 ? "ok" : "fail");SET_BIT(EXTI->SWIER1, 3);__enable_irq();HAL_Delay(100);
}
(2)测试结果

在相同抢占优先级情况下,响应优先级更高的中断先响应。
1.3 相同主、子优先级下谁先响应测试
如果中断主、子优先级均相同,则比较中断编号(ID),中断编号(ID)越小优先级越高。

EXTI0的中断编号比EXTI0小,应该先执行。
初始化GIC优先级位数为5,主优先级个数为3。配置外部中断EXTI0的主优先级为5、子优先级为0,配置外部中断EXTI1的主优先级为5、子优先级为0。同时生成软件中断EXTI0、EXTI1,查看EXTI0能否先于EXTI1执行。

EXTI0比EXTI1早响应,结论成立。
2 结论
(1)当前stm32MP135的中断处理方式无法实现中断抢占。
(2)主优先级更高的中断更先响应;主优先级一致则子优先级更高的中断优先响应;主优先级和子优先级都一致的中断编号(ID)更小的中断优先响应。
相关文章:
Cortex-A7的GIC(全局中断控制器)使用方法(7):基于stm32MP135的GIC配置中断效果测试
0 参考资料 STM32MP13xx参考手册.pdf(RM0475) ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification.pdf 1 GIC配置中断效果测试 前面我们已经实现了GIC的配置,为了验证GIC是否配置有效,本例…...
c++动态数组new和delete
文章目录 动态数组的使用大全1. **基本创建和初始化**2. **动态调整大小**3. **动态数组的使用与标准库 std::vector**4. **动态数组作为函数参数**输出 5. **使用动态数组存储用户输入** 动态数组的使用大全 1. 基本创建和初始化 示例: #include <iostream&g…...
Redis热点知识速览(redis的数据结构、高性能、持久化、主从复制、集群、缓存淘汰策略、事务、Pub/Sub、锁机制、常见问题等)
Redis是一个开源的、使用内存作为存储的、支持数据结构丰富的NoSQL数据库。它的高性能、灵活性和简单易用使其在许多场景下成为首选的缓存解决方案。以下是Redis的常见和热点知识总结。 数据结构 Redis支持五种基本数据结构: String:字符串是Redis中最…...
【C++浅析】lambda表达式:基本结构 使用示例
基本结构 [捕获列表](参数列表) -> 返回类型 { // 函数体 } 捕获列表 ([ ]): 用于指定外部变量的捕获方式。可以: 通过值捕获:[x]通过引用捕获:[&x]捕获所有变量通过值:[]捕获所有变量通过引用:[&]自…...
利用Redis获取权限的多种方式
更多实战内容,可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/10333.html Redis是我们在实战中经常接触到的一款数据库,因其在前期打点中被利用后可直接影响服务器安全所以在攻防过程中也备受红队关注,在本文中会重点分享一…...
LeetCode - LCR 146- 螺旋遍历二维数组
LCR 146题 题目描述: 给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。 螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完…...
如何获取Bing站长工具API密钥
Bing站长工具近期悄然上线了网站URL推送功能,似乎有意跟随百度的步伐。这个新功能允许站长通过API向Bing提交链接数据,当然也可以通过Bing站长工具手动提交。 本文将详细介绍如何通过Bing站长工具生成用于网站链接推送的API密钥。 首先,访问…...
NC 调整数组顺序使奇数位于偶数前面(一)
系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 输入一个长度…...
Unity异步把图片数据从显存下载到内存(GPU->CPU)
Unity异步把图片数据从显存下载到内存(GPU->CPU) 1.c#核心代码 using System.Collections; using System.Collections.Generic; using Unity.Collections; using UnityEditor.PackageManager.Requests; using UnityEngine; using UnityEngine.Rende…...
【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接
【MySQL】C/C引入MySQL客户端 安装mysqlclient库mysql接口介绍初始化mysql_init链接数据库mysql_real_connect下发mysql命令mysql_query获取出错信息mysql_error获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields判断结果列数mysql_field…...
Wireshark分析工具
简单用例 首先打开软件,左上角点文件,选中要分析的文件列表。 导入用tcpdump抓的包后进行分析,这里要输入过滤条件,对网络包进行一定的过滤处理。(这里172网段是阿里云的地址,用自己写的python2脚本对阿里…...
linux网络配置脚本
通过脚本,设置静态ip以及主机名 因为企业9的网络配置文件和企业7的不一样所以,我们以rhel9和rhel7为例 rhel7/centos7/openeuler #!/bin/bash cat > /etc/sysconfig/network-scripts/ifcfg-$1 << EOF DEVICE$1 ONBOOTyes BOOTPROTOnone IPAD…...
IT管理:我与IT的故事4
首先,宣布一个“坏消息”。最近Herry童鞋的办公邮箱似乎有些“抽抽”了,所以邮件出现了延迟、拒收、被拒收、甚至是石沉大海的现象。为了能够更好的和大家进行沟通,大家如果发邮件到我办公邮箱的时候,若不嫌麻烦,可以抄…...
短链接系统设计方案
背景 需要设计一个短链接系统,主要功能主要有如下几点: ToB: 输入一个长链接,转换成短链接。这个短链接有时效性,可以设定指定过期时间。这个系统的每天会生成千万级别的短链接。数据具备可分析功能。 ToC…...
Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)
目录 需求实验步骤0. 实验环境1. Linux2. CiscoIOS基础设置保存密钥登陆测试 3. CiscoNexus基础配置保存密钥登陆测试 需求 在实际工作中,常会遇到自动化的需求,那么在自动采集、配置等对网络设备的自动化需求中,不可避免的会遇到需要登录-&…...
QT判断操作系统类型和CPU架构
一、判断操作系统类型 1.在.pro文件中判断 macx { # mac only } unix:!macx{ # linux only } win32 { # windows only }2.在代码中判断 可以包含QGlobal头文件,判断预定义宏 #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif#ifdef Q_OS_LINUX // …...
input[type=checkbox]勾选框自定义样式
效果图: <template> <input class"rule-checkbox" type"checkbox" checked v-model"isChecked" /> </template><script setup lang"ts"> import { ref } from vue; const isChecked ref(); </…...
鼠害监测系统:科技守护农业安全
在农业生产中,鼠害一直是威胁作物安全、影响产量的重要因素。然而,随着科技的飞速发展,鼠害监测系统正逐步成为现代农业防治鼠害的重要利器。 鼠害监测系统巧妙融合了现代光电、数控及物联网技术,实现了诱鼠、投喂鼠药、鼠情监测及…...
Ubuntu20.04如何安装配置JDK
资源准备 官方下载地址(根据自己的系统版本选择不同版本进行下载即可):Java Downloads | Oracle 如无特殊需要可直接移步至下方JDK1.8安装包 https://download.csdn.net/download/qq_43439214/89646731 安装步骤 创建Java目录 sudo mkdir …...
Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)
文章目录 一、代理的设置1.1 urllib 的代理设置1.2 requests 的代理设置1.3 httpx 的代理设置1.4 aiohttp 的代理设置1.4 Selenium 的代理设置1.6 Playwright 的代理设置 二、代理池的构建和维护2.1 代理池的模块构成2.2 代理池的实现 网站为了避免爬虫采集数据可能会采取一些反…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
