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

这里写目录标题

  • 一、什么是中断?(了解)
  • 二、中断优先级分组设置(熟悉)
  • 三、中断相关寄存器(熟悉)
  • 四、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.mzph.cn/news/774829.shtml

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

相关文章

深入理解C语言宏定义

目录 一、前言 二、宏的相关语法 2.1 #define 2.2 #undef 2.3 #运算符 2.4 ##运算符 三、宏替换的规则 四、宏与函数 一、前言 我们都知道#define语句可以定义常量&#xff0c;在编译器预处理时会全部将名字替换为常量。与此同时&#xff0c;#define也允许把参数替换到…

【八股】2024春招八股复习笔记3(测试、运维、安全、游戏、客户端)

【2023秋招-2024春招】八股系列&#xff0c;共8篇 【八股】2023秋招八股复习笔记1&#xff08;CSBase部分WXG题&#xff09;【八股】2023秋招八股复习笔记2&#xff08;C基础 & 操作系统&#xff09;【八股】2023秋招八股复习笔记3&#xff08;智力题 & 非技术题50道&…

开放大学2024年春《数控技术 060253》综合大作业参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1数控系统的核心是&#xff08; &#xff09; …

【项目管理——时间管理】【自用笔记】

1 项目时间管理&#xff08;进度管理&#xff09;概述 过程&#xff1a;&#xff08;2—6&#xff09;为规划过程组&#xff0c;7为监控过程组 题目定义&#xff1a;项目时间管理又称为进度管理&#xff0c;是指确保项目按时完成所需的过程。目标&#xff1a;时间管理的主要目标…

SQLAlchemy修改postgres表的jsonb字段失效

今天遇到一灵异事件&#xff0c;ORM更新操作&#xff0c;一字段始终不生效&#xff0c;最后发现问题原因是postgres的jsonb导致的 表结构&#xff1a; CREATE TABLE XX(value jsonb default {},...)ORM: from flask_sqlalchemy import SQLAlchemy from sqlalchemy.dialects.…

Rust GUI学习 小部件系列(一):如何在iced窗口中使用颜色选择器colorpicker

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 前言&#xff1a; 本系列是iced的小部件应用介绍系列&#xff0c;主要介绍iced、iced_aw两个库中涉及的各种小部件的使用及实例演示。 本文所介绍的是co…

安捷伦Agilent E5071B网络分析仪

181/2461/8938产品概述&#xff1a; Agilent E5071B 网络分析仪可为射频组件提供快速、准确的测量。与同类网络分析仪相比&#xff0c;其宽动态范围和低迹线噪声可实现更高的测试质量和吞吐量。内置 2、3 和 4 个测试端口可同时测量具有最多四个端口的组件的所有信号路径。Agi…

中国土壤厚度空间分布数据

土壤层次分为覆盖层 林溶层 淀积层 母质层&#xff0c;其中在林溶层中的最上面那层就是我们通常说的土壤厚度在这一层中&#xff0c;这一层也被称为腐殖层&#xff0c;是肥力性质最好的一层&#xff0c;植物根系和微生物也集中在这一层。至于覆盖层在森林土壤中比较常见&#x…

2024年【G3锅炉水处理】考试题及G3锅炉水处理考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G3锅炉水处理考试题参考答案及G3锅炉水处理考试试题解析是安全生产模拟考试一点通题库老师及G3锅炉水处理操作证已考过的学员汇总&#xff0c;相对有效帮助G3锅炉水处理考试报名学员顺利通过考试。 1、【多选题】锅筒…

ClickHouse 最全面试题及参考答案全解析

1. 请简述 ClickHouse 的核心特性及其适用场景 ClickHouse 是一个开源的列式数据库管理系统(DBMS),专为在线分析处理(OLAP)场景设计。其核心特性包括: 列式存储:数据按列存储,优化了分析查询的性能,因为只需读取查询中涉及的列。数据压缩:列式存储天然适合压缩,大幅…

记录一次Vcenter跨VDS网络迁移

纯文字叙述&#xff1a; 1、客户的网络需要迁移vds.但物理网卡已经分配给了其他的VDS。 2、操作思路&#xff1a; 1.先创建好新的VDS以及对应的旧VDS的业务端口组以及Vmker。 2.将Esxi主机加入到新的VDS&#xff0c;不选择物理网卡&#xff0c;只是加入。 3.在Esxi主机侧选中新…

vivado 在远程主机上启动作业、ISE命令图、实施类别,战略描述和指令映射

在远程主机上启动作业 一旦配置了远程主机&#xff0c;使用它们启动Vivado作业就很容易了。下图显示了启动运行对话框。启动跑步时&#xff0c;选择“在远程上启动跑步”hosts或Launch在群集上运行&#xff0c;然后选择特定的群集。这些作业将使用您的要执行的预配置设置。 作业…

Leetcode70. 爬楼梯(动态规划)

Leetcode原题 Leetcode70. 爬楼梯 标签 记忆化搜索 | 数学 | 动态规划 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;示例 1&#xff1a;输入&#xff1a;n 2 输出&#xff1a;2 解…

阿里云服务器安装MySQL(宝塔面板)

只写关键步骤 1. 创建一个云服务器实例 2 修改密码&#xff0c;登录服务器 3. 安装宝塔面板 进入https://www.bt.cn/new/index.html 进入宝塔面板地址 4. 安装Mysql 5. 创建数据库&#xff08;可导入数据库&#xff09; 6. 测试连接数据库 打开Navicat&#xff08;或其他数据…

谈谈 Python 中的 McNemar 检验(三)

前两个文章主要讲的是 McNemar 的原理&#xff0c;文章参考如下&#xff1a; 谈谈 Python 中的 McNemar 检验(一)-CSDN博客 谈谈 Python 中的 McNemar 检验(二)-CSDN博客 这一篇主要说一说 McNemar 的具体算法。 引用上面第一篇文章里的例子&#xff0c;关键是看数据 b 和 …

centos安装jdk的坑

文章目录 一、安装jdk二、查找jdk的目录三、配置JAVA_HOME 一、安装jdk 我们一般用yum search java | grep jdk查询可以安装的jdk 但是一定要注意如下图&#xff0c;必须知道jdk和jre的区别 yum install java-1.8.0-openjdk-devel.x86_64二、查找jdk的目录 用如下命令 sudo…

【C语言基础篇】字符串处理函数(七)字符转换函数

个人主页&#xff1a; 倔强的石头的博客 系列专栏 &#xff1a;C语言指南 C语言刷题系列 系列文章 【C语言基础篇】字符串处理函数&#xff08;一&#xff09;strlen的介绍及模拟实现-CSDN博客 【C语言基础篇】字符串处理函数&#xff08;二&#xff09;strcpy…

数仓项目总结--持续更新中

业务及需求调研 应详细调研业务流程&#xff0c;确定各个业务领域中业务线对应的业务模块&#xff0c;以及所有的业务活动。。进行需求调研&#xff0c;其一&#xff0c;提取出现有报表系统中的需求指标&#xff0c;其二与运营、分析人员沟通获知常用的需求指标。 开发过程中应…

基于Vue.js 实现简易拖拽指令

基于 Vue.js 实现简易拖拽指令 在 Web 开发中&#xff0c;拖拽功能是一项常见而又实用的功能。无论是制作网页游戏、实现可拖拽的组件&#xff0c;还是简单的页面布局调整&#xff0c;都可能用到拖拽功能。在 Vue.js 中&#xff0c;我们可以通过自定义指令的方式来实现拖拽功能…

Maven的基础知识和应用

一、Maven基础知识 1.项目对象模型&#xff08;POM&#xff09; POM&#xff08;Project Object Model&#xff09;是Maven项目的核心配置文件&#xff0c;通常是pom.xml文件。该文件使用XML格式&#xff0c;包含了项目的所有配置信息&#xff0c;例如项目的基本信息&#xf…