FreeRTOS学习笔记-基于stm32(3)中断管理
一、什么是中断
通俗点讲就是让CPU停止当前在做的事,转而去做更紧急的事。
二、中断优先级分组
这个紧急的事也有一个等级之分,优先级越高越先执行。stm32使用中断优先配置寄存器的高4位,共16级的中断优先等级。
stm32的中断优先等级可以分为抢占优先级和子优先级。抢占优先级高的中断可以打断正在执行的抢占优先级低的中断;当抢占优先级相同时,子优先级高的优先执行。
eg:抢占优先级2,子优先级1的中断可以打断抢占优先级3,子优先级0的中断;但抢占优先级2,子优先级1的中断不能打断抢占优先级2,子优先级2的中断;虽然前者子优先级高于后者,但子优先级不能打断其他中断。

三、特征
1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY(一般默认设置为5)优先级的中断才允许调用FreeRTOS的API函数(带有“FromISR后缀的函数”);
2、将所有优先级位指定为抢占优先级位,方便管理;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
3、中断优先级越小越优先,任务优先级越大越优先;
四、FreeRTOS中断相关寄存器
FreeRTOS 中,通过 SHPR3 寄存器,将 PendSV 和 Systick 中断优先级被设置为最低,因为要保证系统任务的切换不会阻塞系统其他中断的响应。
1、FreeRTOS关闭中断:
FreeRTOS 中,通过 BASEPRI 寄存器,屏蔽优先级低于某一阈值的中断。
eg:BASEPRI 寄存器设置为0x50,表示中断优先级在5~15内的均被屏蔽,0~4的正常执行。(因为中断寄存器使用的是8位寄存器的高4位)也就是关闭FreeRTOS的中断 。
portDISABLE_INTERRUPTS(); //关闭中断
经过此函数的一层层回调,会发现最终此函数还是对寄存器 basepri 写入0x50来关闭中断;
#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI()#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //中断最低优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 //系统可管理的最高中断优先级
#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
//此处对5进行左移4位,正是因为控制中断的寄存器高4位有效static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;__asm{/* Set BASEPRI to the max syscall priority to effect a criticalsection. */msr basepri, ulNewBASEPRI //将0x50写入寄存器basepridsbisb}
}
2、FreeRTOS开启中断:
将 BASEPRI 寄存器值设置为0时,则不关闭任何中断。
portENABLE_INTERRUPTS(); //开启中断
此处就比较简单了,与关闭中断函数类似,直接对中断寄存器 basepri 写0。
#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 )static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{__asm{/* Barrier instructions are not used as this function is only used tolower the BASEPRI value. */msr basepri, ulBASEPRI}
}
五、中断管理例程
创建函数与上一章说的类似,此处只展示 task1 代码:
注意:此处延时函数使用的是 delay_xms(); 而不是delay_ms(); 或 vTaskDelay(); 因为FreeRTOS提供的 vTaskDelay() 内部会调用到 vPortSetBASEPRI( 0 ) ,就是上面开启中断所调用的内部函数。也就是说 vTaskDelay() 会调用到开中断函数,而 delay_ms() 内部则是调用的 vTaskDelay() 函数。所以如果调用 vTaskDelay() 函数会提前开启中断,从而得不到正确的实验现象。
void task1( void * pvParameters )
{uint8_t task1_num=0;while(1){if(++task1_num==5){printf("关中断!!!\r\n");portDISABLE_INTERRUPTS(); //关闭中断delay_xms(5000);printf("开中断!!!!!!\r\n");portENABLE_INTERRUPTS(); //开启中断}vTaskDelay(1000);}
}
定时器部分,为了验证FreeRTOS的中断管理函数仅对5~15的优先级有效,所以 TIM3 的优先级为4,TIM5 的优先级为6;
void TIM3_Int_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能//定时器TIM3初始化TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断//中断优先级NVIC设置NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4; //先占优先级4级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器TIM_Cmd(TIM3, ENABLE); //使能TIMx
}//通用定时器5中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器5!
void TIM5_Int_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //时钟使能//定时器TIM3初始化TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE ); //使能指定的TIM5中断,允许更新中断//中断优先级NVIC设置NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM5中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6; //先占优先级6级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器TIM_Cmd(TIM5, ENABLE); //使能TIM5
}
中断服务函数
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断{printf("TIM3输出!!!\r\n");}TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}//定时器5中断服务函数
void TIM5_IRQHandler(void)
{if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) //溢出中断{printf("TIM5输出!!!!!!\r\n");}TIM_ClearITPendingBit(TIM5,TIM_IT_Update); //清除中断标志位
}
由于FreeRTOS的中断管理函数仅对5~15的优先级有效,所以关闭中断后,TIM3会正常工作。
实验现象:
至于关中断时候输出的乱码,我个人觉得可能是抢占同一个串口导致的。

相关文章:
FreeRTOS学习笔记-基于stm32(3)中断管理
一、什么是中断 通俗点讲就是让CPU停止当前在做的事,转而去做更紧急的事。 二、中断优先级分组 这个紧急的事也有一个等级之分,优先级越高越先执行。stm32使用中断优先配置寄存器的高4位,共16级的中断优先等级。 stm32的中断优先等级可以分为…...
android pdf框架-6,文本生成pdf
前文介绍如何使用图片生成pdf,这里介绍如何使用文本生成pdf 使用mupdf生成 mupdf生成的pdf略大,字体可以自定义. 生成的代码不复杂,也有好几种,以story的方式生成为例 fun createPdfFromText(sourcePath: String, destPath: String): Boolean {val text EncodingDetect.rea…...
关于springboot一个接口请求后,主动取消后,后端是否还在跑
1、最近在思考一个问题,如果一个springboot的请求的接口比较耗时,中途中断该请求后,则后端服务是否会终止该线程的处理,于是写了一个demo RequestMapping(value "/test", method RequestMethod.GET)public BasicResul…...
理解自相关图AC和偏自相关图PAC Plots
when we talk about the time-series data, many factors affect the time series, but the only thing that affects the lagged version of the variable is the time series data itself. by Yugesh Verma 时序数据按照时间点的先后顺序进行排列,变化是在邻近的时间段之间发…...
.NetCore6.0实现ActionFilter过滤器记录接口请求日志
文章目录 目的实现案例:一.首先我们新建一个WebApi项目二.配置 appsettings.json 文件,配置日志存放路径三.创建 Model 文件夹,创建AppConfig类和ErrorLog类1.在AppConfig类中编写一个GetConfigInfo方法获取配置文件中的值2.在ErrorLog类中&a…...
代码详解:2024美团春招实习笔试第一场0309,是难还是简单?
前言: 1.第一题(模拟) 2.第二题(模拟) 3.第三题(二维前缀和) 4.第四题的思维(双指针) 5.第五题难度比较大(并查集删边离散化) 一.小美的MT MT 是美团的…...
平衡二叉树
前言 在关键字排列随机的情况下,二叉排序树的平均查找长度和 l o g n log n logn是等数量级的。在某些情况下,尚需在构成二叉排序树的过程中进行“平衡化”处理,使其成为平衡二叉树。 如果任何初始化序列构成的二叉排序树都是平衡二叉树&…...
脚本自动化 设置快捷方式并设置为管理员运行
自动化创建快捷方式并设置为始终以管理员权限运行,可以通过编写批处理脚本来实现。以下是一个创建.bat批处理文件快捷方式并设置为管理员运行的示例脚本: batch echo off set SCRIPT_PATH"C:\Scripts\myScript.bat" set SHORTCUT_PATH"%…...
TypeScript学习笔记(上):TypeScript的介绍、安装及常用类型
我对TypeScript的理解就是,TypeScript是增加了类型校验的JavaScript,能够把运行期错误提升至编译期 目录 TypeScript是什么? 安装编译 TS 的工具包 运行 TS 的步骤 TypeScript 常用类型 JS 已有类型 TS 新增类型 简单数据类型 数组类…...
Vue3学习记录(六)--- 组合式API之依赖注入和异步组件
一、依赖注入 1、简介 在前面的笔记中,我们学习过父组件向子组件传递数据时,需要借助props来实现。但如果父组件想要向孙子组件传递数据,那就要连续使用两层props逐级向下传递,如果要接收数据的是更深层的后代组件࿰…...
JZ76 删除链表中重复的结点
/*public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} } */import java.util.*; public class Solution {public ListNode deleteDuplication(ListNode pHead) {//初步想想法: 弄一个hashmap 然后进行key存储起来。然后 如果存…...
20.2 nginx
20.2 nginx 1. 学习目标2. 介绍2.1 正向代理2.2 反向代理2.3 动态静态资源分离2.4 nginx优缺点3. 安装3.1 Linux安装****************************************************************************************************************************************************…...
MySQL学习Day26——事务基础知识
一、数据库事务概述: 事务是数据库区别于文件系统的重要特性之一,事务会让数据始终保持一致性,能通过事务机制恢复到某个时间点,可以保证提交到数据库的修改不会因为系统崩溃而丢失 1.查看引擎支持事务的情况:只有InnoDB存储引擎支持事务 SHOW ENGINES; 2.基本概念: 事…...
three.js 射线Ray,三维空间中绘制线框
效果: 代码: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div> <div>{{ res1 }}</div> <div>{{ res2 }}</div><…...
【Demo】游戏小地图
简介 该Demo基于2D关卡随机生成项目进行实现,旨在初步探索游戏小地图的制作。 演示 MiniMapDemo 资源下载 百度网盘(提取码:1314) 如果这篇文章对你有帮助,请给作者点个赞吧!...
代码随想录算法训练营Day39 || leetCode 762.不同路径 || 63. 不同路径 II
62.不同路径 每一位的结果等于上方与左侧结果和 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector(n,0));for (int i 0; i < m; i) dp[i][0] 1;for (int j 0; j < n; j) dp[0][j] 1;for (int i 1; i < m; …...
Qt中parent()函数的使用
情景(需求)抽象: A类对象是B类对象的成员变量。 B类对象是A类对象的父亲。 A类对象中包含按钮,点击按钮,调用B类的成员函数。 示例: A类: #pragma once#include <QWidget> #include "ui_QtWidgetsCla…...
Python基础学习(5)流程控制
文章目录 一. 程序三大执行流程二. 分支结构1.单分支结构(if)2.双分支结构(if..else)3.多分支结构(if..elif..else) 二,缩进(tab键)三,循环结构1.while循环2.for循环①遍历字典 五.break,continue和pass语句1.break,continue2.pass Python基础学习(1)基本…...
代码随想录刷题笔记 DAY 42 | 最后一块石头的重量 II No.1049 | 目标和 No.494 | 一和零 No.474
文章目录 Day 4301. 最后一块石头的重量 II(No. 1049)<1> 题目<2> 笔记<3> 代码 02. 目标和(No. 494)<1> 题目<2> 笔记<3> 代码 03. 一和零(No. 474)<1> 题目&l…...
793.高精度乘法(acwing)
文章目录 793.高精度乘法题目描述高精度乘法 793.高精度乘法 题目描述 给定两个正整数A和B,请你计算A * B的值。 输入格式 共两行,第一行包含整数A,第二行包含整数B。 输出格式 共一行,包含A * B的值。 数据范围 1≤A的长度≤…...
2026奇点大会AIAgent控制框架深度拆解(ROS 3.0+LLM-Os融合架构首次公开,仅限首批参会者获取的SDK已泄露)
第一章:2026奇点智能技术大会:AIAgent机器人控制 2026奇点智能技术大会(https://ml-summit.org) 实时多模态指令解析架构 大会现场演示的AIAgent控制系统采用分层语义解耦设计,将自然语言指令(如“绕过障碍物,拾取红…...
打造你的专属漫画阅读体验:Venera跨平台漫画阅读器完整指南
打造你的专属漫画阅读体验:Venera跨平台漫画阅读器完整指南 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 你是否曾经为漫画资源分散在不同设备和平台而感到困扰?电脑里存着PDF格式的漫画,…...
别再为建筑高度数据发愁了!手把手教你用QGIS加载2024版全国SHP建筑轮廓(含高度字段)
2024版全国建筑轮廓数据实战:QGIS三维可视化全流程解析 城市规划师拿到最新建筑轮廓数据后,最迫切的需求往往不是数据本身,而是如何快速将其转化为可分析的视觉成果。本文将彻底解决从SHP文件加载到三维渲染的完整工作流问题,特别…...
【CVE-2026-25253】--漏洞复现、漏洞原理以及修复建议
前言 OpenClaw 是一款 开源、本地优先的 AI 智能体框架,核心目标是让 AI 从“只会聊天”升级为“能动手执行真实任务”,被社区亲切地称为“龙虾 AI”或“小龙虾” 一、漏洞概述 1、详情 CVE-2026-25253是OpenClaw控制界面(Control UI)中存在的跨站We…...
SEGGER Embedded Studio高效开发GD32的5个隐藏技巧(含UTF-8乱码解决方案)
SEGGER Embedded Studio高效开发GD32的5个隐藏技巧(含UTF-8乱码解决方案) 在嵌入式开发领域,GD32系列MCU凭借其出色的性价比和丰富的资源赢得了众多开发者的青睐。而SEGGER Embedded Studio(简称SES)作为一款专业的集成…...
中文文本查重不求人:StructBERT相似度计算WebUI快速上手指南
中文文本查重不求人:StructBERT相似度计算WebUI快速上手指南 你是不是经常遇到这样的烦恼?面对一堆用户评论,不知道哪些是重复的;客服系统里,用户问的问题千奇百怪,但知识库里的标准答案就那么几个&#x…...
终极指南:5分钟掌握H5P互动视频制作技巧 [特殊字符]
终极指南:5分钟掌握H5P互动视频制作技巧 🎬 【免费下载链接】h5p-interactive-video 项目地址: https://gitcode.com/gh_mirrors/h5/h5p-interactive-video 想要让枯燥的教学视频变得生动有趣吗?H5P互动视频项目正是您需要的解决方案…...
Midscene.js:零代码跨平台UI自动化的终极指南 - 让AI成为你的智能操作员
Midscene.js:零代码跨平台UI自动化的终极指南 - 让AI成为你的智能操作员 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 你是否厌倦了每天重复点击、…...
AI艺术新体验:丹青识画系统开箱即用,为照片注入东方美学
AI艺术新体验:丹青识画系统开箱即用,为照片注入东方美学 1. 引言:科技与美学的完美邂逅 在数字时代,我们每天都会拍摄和分享大量照片,但你是否曾想过,这些影像可以拥有更深层次的文化内涵?「丹…...
5大方法实现Alienware灯光、风扇与电源的深度个性化控制
5大方法实现Alienware灯光、风扇与电源的深度个性化控制 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools Alienware设备用户常面临原厂软件功能受限、个…...
