【正点原子FreeRTOS学习笔记】————(4)FreeRTOS中断管理

news2024/12/27 11:51:01

这里写目录标题

  • 一、什么是中断?(了解)
  • 二、中断优先级分组设置(熟悉)
  • 三、中断相关寄存器(熟悉)
  • 四、FreeRTOS中断管理实验(掌握)

一、什么是中断?(了解)

简介:让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断
在这里插入图片描述
中断执行机制,可简单概括为三步:
1,中断请求:外设产生中断请求(GPIO外部中断、定时器中断等)
2,响应中断:CPU停止执行当前程序,转而去执行中断处理程序(ISR)
3,退出中断:执行完毕,返回被打断的程序处,继续往下执行

二、中断优先级分组设置(熟悉)

ARM Cortex-M 使用了 8 位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器 ,但STM32,只用了中断优先级配置寄存器的高4位 [7 : 4],所以STM32提供了最大16级的中断优先等级
在这里插入图片描述
STM32 的中断优先级可以分为抢占优先级和子优先级
抢占优先级: 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断
子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行
注意:中断优先级数值越小越优先

一共有 5 种分配方式,对应着中断优先级分组的 5 个组
在这里插入图片描述
通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)即可完成设置(在HAL_Init中设置)

特点:
1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数

2、建议将所有优先级位指定为抢占优先级位,方便FreeRTOS管理

3、中断优先级数值越小越优先,任务优先级数值越大越优先
在这里插入图片描述

三、中断相关寄存器(熟悉)

三个系统中断优先级配置寄存器,分别为 SHPR1、 SHPR2、 SHPR3
SHPR1寄存器地址:0xE000ED18
SHPR2寄存器地址:0xE000ED1C
SHPR3寄存器地址:0xE000ED20
在这里插入图片描述
FreeRTOS如何配置PendSV和Systick中断优先级?
在这里插入图片描述
所以:PendSV和SysTick设置最低优先级
设置最低:保证系统任务切换不会阻塞系统其他中断的响应
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三个中断屏蔽寄存器,分别为 PRIMASK、 FAULTMASK 和BASEPRI
在这里插入图片描述
FreeRTOS所使用的中断管理就是利用的BASEPRI这个寄存器
BASEPRI:屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断
比如: BASEPRI设置为0x50,代表中断优先级在5 ~15内的均被屏蔽,0 ~4的中断优先级正常执行

关中断程序示例:

#define portDISABLE_INTERRUPTS() 		vPortRaiseBASEPRI()
static portFORCE_INLINE void vPortRaiseBASEPRI( void ) 
{ 
	uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; 
	__asm 
	{
		msr basepri, ulNewBASEPRI 
		dsb 
		isb
	} 
}
#define configMAX_SYSCALL_INTERRUPT_PRIORITY            ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        5      /* FreeRTOS可管理的最高中断优先级 */ 

中断优先级在5 ~ 15的全部被关闭

当BASEPRI设置为0x50时:
在这里插入图片描述
在中断服务函数中调度FreeRTOS的API函数需注意:
1、中断服务函数的优先级需在FreeRTOS所管理的范围内
2、在中断服务函数里边需调用FreeRTOS的API函数,必须使用带“FromISR”后缀的函数

开中断程序示例:

#define portENABLE_INTERRUPTS()		 vPortSetBASEPRI( 0 )
static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) 
{ 
	__asm
	{
		msr basepri, ulBASEPRI
	} 
}

FreeRTOS中断管理就是利用BASEPRI寄存器实现的

四、FreeRTOS中断管理实验(掌握)

1、实验目的:学会使用FreeRTOS的中断管理!
本实验会使用两个定时器,一个优先级为4,一个优先级为6,注意:系统所管理的优先级范围:5~15,
现象:两个定时器每1s,打印一段字符串,当关中断时,停止打印,开中断时持续打印。

2、实验设计:将设计2个任务:start_task、task1
2个任务的功能如下
在这里插入图片描述
在freertos_demo.c里,设置任务1


/**
 * @brief       start_task
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           /* 进入临界区 */
    /* 初始化TIM3、TIM5 */
    btim_tim3_int_init(10000-1, 7200-1);    //1s计时
    btim_tim5_int_init(10000-1, 7200-1);
    /* 创建任务1 */
    xTaskCreate((TaskFunction_t )task1,
                (const char*    )"task1",
                (uint16_t       )TASK1_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK1_PRIO,
                (TaskHandle_t*  )&Task1Task_Handler);
    vTaskDelete(StartTask_Handler); /* 删除开始任务 */
    taskEXIT_CRITICAL();            /* 退出临界区 */
}

/**
 * @brief       task1
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void task1(void *pvParameters)
{
    uint32_t task1_num = 0;
    
    while (1)
    {
        if (++task1_num == 5)
        {
            printf("FreeRTOS关闭中断\r\n");
            portDISABLE_INTERRUPTS();       /* FreeRTOS关闭中断 */
            delay_ms(5000);
            printf("FreeRTOS打开中断\r\n");
            portENABLE_INTERRUPTS();        /* FreeRTOS打开中断 */
        }
        
        vTaskDelay(1000);
    }
}

在bim.c里配置定时器后,在中断服务函数里设置


/**
 * @brief       定时器更新中断回调函数
* @param        htim:定时器句柄指针
 * @retval      无
 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == (&g_tim3_handle))
    {
        printf("TIM3输出\r\n");
    }
    else if (htim == (&g_tim5_handle))
    {
        printf("TIM5输出\r\n");
    }
}

实验结果:
在这里插入图片描述
TIM3的优先级是4,TIM5的优先级是6,首先打印"TIM3输出"和“TIM5”五次,然后执行FreeRTOS关闭中断,中断优先级高于5的TIM3中断继续执行,中断优先级低于5的TIM5中断停止运行,5s后FreeRTOS打开中断,TIM5中断可以执行

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

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

相关文章

华为数通 HCIP-Datacom H12-831 题库补充(3/27)

2024年 HCIP-Datacom&#xff08;H12-831&#xff09;最新题库&#xff0c;完整题库请扫描上方二维码&#xff0c;持续更新。 如图所示&#xff0c;关于R4路由器通过IS-IS计算出来的IPv6路由&#xff0c;哪一选项的描述是错误的&#xff1f; A&#xff1a;R4通过IS—IS只学习到…

【企业动态】吉利雷达汽车来访东胜物联,考察交流,洽谈车联网生态合作

近日&#xff0c;我们非常高兴接待吉利雷达汽车一行莅临东胜物联位于湖州市的生产工厂&#xff0c;进行参观考察&#xff0c;并就未来的合作展开深入商讨与交流。 雷达新能源汽车隶属于吉利控股集团&#xff0c;是一家专注于户外生态的中高端新能源智能汽车企业。雷达通过共享吉…

【启发式算法】同核分子优化算法 Homonuclear Molecules Optimization HMO算法【Matlab代码#70】

文章目录 【获取资源请见文章第4节&#xff1a;资源获取】1. 算法简介2. 部分代码展示3. 仿真结果展示4. 资源获取 【获取资源请见文章第4节&#xff1a;资源获取】 1. 算法简介 同核分子优化算法&#xff08;Homonuclear Molecules Optimization&#xff0c;HMO&#xff09;是…

网页版短信系统后台开发要点|短信平台软件开发搭建

在开发网页版短信系统的后台时&#xff0c;有一些关键要点需要注意&#xff0c;以确保系统的稳定性、安全性和高效性。以下是一些开发网页版短信系统后台时的重要要点&#xff1a; 用户管理&#xff1a;实现用户权限管理功能&#xff0c;包括用户注册、登录、角色分配等&#x…

Redis为什么快

引言 Redis是一个高性能的开源内存数据库,以其快速的读写速度和丰富的数据结构支持而闻名。作为一个轻量级、灵活的键值存储系统,Redis在各种应用场景下都展现出了惊人的性能优势。无论是作为缓存工具、会话管理组件、消息传递媒介,还是在实时数据处理任务和复杂的分布式系…

YOLOv9改进策略:卷积魔改 | SPD-Conv,低分辨率图像和小物体涨点明显

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;SPD-Conv由一个空间到深度(SPD)层和一个无卷积步长(Conv)层组成,特别是在处理低分辨率图像和小物体等更困难的任务时。 &#x1f4a1;&#x1f4a1;&#x1f4a1;SPD-Conv在多个数据集验证能够暴力涨点&#x…

python3字典的排序

创建一个字典 dict1{a:2,b:3,c:8,d:4} 1、分别取键、值 取字典的所有键&#xff0c;所有的值&#xff0c;利用dict1.keys()&#xff0c;dict1.vaules()&#xff0c; 由于键&#xff0c;值有很多个&#xff0c;所以要加s&#xff0c;另外注意这里要加括号&#xff0c;这样的小…

java spirng和 mybatis 常用的注解有哪些

当在Java Spring和MyBatis中进行开发时&#xff0c;常用的注解对于简化配置和提高开发效率非常重要。以下是更多常用的注解以及它们的详细说明和用途&#xff1a; 在Spring中常用的注解&#xff1a; Component&#xff1a; 用途&#xff1a;表明一个类会作为组件被Spring容器管…

YOLOv9改进策略:block优化 | Transformer架构ConvNeXt 网络在检测中大放异彩

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;Transformer架构 ConvNeXt 网络在图像分类和识别、分割领域大放异彩&#xff0c;同时对比 Swin-T 模型&#xff0c;在多种任务中其模型的大小和准确率均有一些提升&#xff0c;模型的 FLOPs 较大的减小且 Acc …

创建AI智能体

前言 灵境矩阵是百度推出的基于文心大模型的智能体&#xff08;Agent&#xff09;平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类型的开发方式&#xff0c;打造大模型时代的产品能力。开发者可以通过 prompt 编排的方式低成本开发智能体&am…

保姆级指导0基础如何快速搭建“对话机器人”类ChatGPT

参考了CDSN上的文章&#xff0c;但发现不work&#xff0c; 不是这里有问题&#xff0c;就是那里有问题&#xff0c;查阅了大量的资料&#xff0c;做了无数次试验&#xff0c;终于整理出来了一个完整的教程&#xff0c;保可用&#xff0c;保真~~~~~如果各位遇到什么问题&#xf…

哈希的一些题目

题目1&#xff1a;星空之夜 1402. 星空之夜 - AcWing题库 刚开始看到这个题目感觉一懵&#xff0c;因为这个哈希是关于形状的哈希&#xff0c;不知道要怎么表示。 但是这道题的数据范围比较小&#xff0c;暴力也可以过。 暴力的方法是&#xff1a;搜索每一个连通块并保存下来…

Redis中的客户端(一)

客户端 概述 Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接&#xff0c;每个客户端可以向服务器发送命令请求&#xff0c;而服务器则接收并处理客户端发送的命令请求&#xff0c;并向客户端返回命令回复。通过使用由IO多路复用技术实现的文件…

LeetCode:1319. 连通网络的操作次数(并查集 Java)

目录 1319. 连通网络的操作次数 题目描述&#xff1a; 实现代码与解析&#xff1a; 并查集 原理思路&#xff1a; 1319. 连通网络的操作次数 题目描述&#xff1a; 用以太网线缆将 n 台计算机连接成一个网络&#xff0c;计算机的编号从 0 到 n-1。线缆用 connections 表示…

JAVA面试大全之JVM和调休篇

目录 1、类加载机制 1.1、类加载的生命周期&#xff1f; 1.2、类加载器的层次? 1.3、Class.forName()和ClassLoader.loadClass()区别? 1.4、JVM有哪些类加载机制&#xff1f; 2、内存结构 2.1、说说JVM内存整体的结构&#xff1f;线程私有还是共享的&#xff1f; 2.2…

.NET高级面试指南专题二十三【 B+ 树作为索引有什么优势】

B 树作为索引有许多优势&#xff0c;这些优势使其成为许多数据库管理系统中首选的索引结构之一。以下是 B 树作为索引的一些主要优势&#xff1a; 高效的查询性能&#xff1a;B 树是一种平衡树结构&#xff0c;具有良好的平衡性和高度平衡的性质&#xff0c;这使得在 B 树上进行…

JaveSE—IO流详解:对象输入输出流(序列化及反序列化)

一. 基础理论知识 &#x1f4cc;怎么理解对象输入输出流 &#xff1f; ○ 把java中的对象输出到文件中&#xff0c;从文件中把对象输入到程序中. &#x1f4cc;为什么要这样做(目的) &#xff1f; 当我们创建一个对象时, 如new Student( "小张",20 ); 数据存储在…

[AIGC] MySQL存储引擎详解

MySQL 是一种颇受欢迎的开源关系型数据库系统&#xff0c;它的强大功能、灵活性和开放性赢得了用户们的广泛赞誉。在 MySQL 中&#xff0c;有一项特别重要的技术就是存储引擎。在本文中&#xff0c;我们将详细介绍什么是存储引擎&#xff0c;以及MySQL中常见的一些存储引擎。 文…

对AOP的理解

目录 一、为何需要AOP&#xff1f;1、从实际需求出发2、现有的技术能解决吗&#xff1f;3、AOP可以解决 二、如何实现AOP&#xff1f;1、基本使用2、更推荐的做法2.1 “基本使用”存在的隐患2.2 最佳实践2.2.1 参考Transactional&#xff08;通过AOP实现事务管理&#xff09;2.…

C++零基础入门学习视频课程

教程介绍 本专题主要讲解C基础入门学习&#xff0c;所以不会涉及很深入的语法和机制。但会让你整体多面的了解和学习C的核心内容&#xff0c;快速学习使用C&#xff0c;我们的目标是先宏观整体把握&#xff0c;在深入各个击破&#xff01; 学习地址 链接&#xff1a;https:/…