当前位置: 首页 > article >正文

FreeRtos实时系统: 四.中断

FreeRtos实时系统: 四.中断

  • 一.FreeRtos的中断管理介绍
    • 1.什么是中断?
    • 2.中断优先级分组设置
    • 3.中断相关寄存器
    • 4.FreeRTOS如何配置PendSV和Systick中断优先级?
  • 二.FreeRtos的中断管理实验

一.FreeRtos的中断管理介绍

1.什么是中断?

让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断。
在这里插入图片描述

2.中断优先级分组设置

ARM Cortex-M使用了8位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器但STM32,只用了中断优先级配置寄存器的高4位[7:4],所以STM32提供了最大16级的中断优先等级。
在这里插入图片描述
STM32的中断优先级分为抢占优先级和子优先级:
抢占优先级:抢占优先级高的中断可以打断正在执行但抢占优先级低的中断。
子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行。
举例:当两个任务抢占优先级都为2,第一个任务子优先级为1,第二个任务子优先级为0,第一个任务在运行时不会被第二个任务打断,因为抢占优先级相同不会抢占,会等待第一个任务执行完再执行第二个任务。
注意:中断优先级数值越小越优先。
一共有5种分配方式,对应中断优先级分组的5个组:
在这里插入图片描述
FreeRtos为了方便管理,采用NVIC_PriorityGroup_4分组,将所有优先级设置为抢占优先级。
通过调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PriorityGroup_4)可以完成配置,在HAL_Init()中可以设置。
特点:
1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级(5)的中断里才允许调用FreeRTOS的API函数(5~15)。
2、建议将所有优先级指定为抢占式优先级为,方便FreeRTOS管理。(调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4))
3、中断优先级数值越小越优先,任务优先级数值越大越优先。
在这里插入图片描述

3.中断相关寄存器

三个系统中断优先级配置寄存器,分别为SHPR1、SHPR2、SHPR3
SHPR1寄存器地址:0xE000ED18
SHPR2寄存器地址:0xE000ED1C
SHPR3寄存器地址:0xE000ED20
在这里插入图片描述
三个中断屏蔽寄存器,分别为PRIMASK、FAULTMASK、BASEPRI。
在这里插入图片描述
PRIMASK:置1关中断,置0开中断。
FAULTMASK:置1关中断,置0开中断。(比PRIMASK彻底)
BASEPRI:优先级号大于或等于设置值中断都关,0不关闭任何中断。
比如:BASEPRI设置为0x50,代表中断优先级在5~15内的都被屏蔽,0到4正常执行。
FreeRTOS所使用的中断管理利用了BASEPRI这个寄存器。
关中断程序示例:
在这里插入图片描述
在这里插入图片描述
在中断优先级函数中调度FreeRTOS的API函数需注意:
1、中断服务函数的优先级需在FreeRTOS所管理的范围内。
2、在中断服务函数里边需调用FreeRTOS的API函数,需使用带“FromISR”后缀的函数。

开中断程序示例:
在这里插入图片描述
FreeRTOS中断管理就是利用BASEPRI寄存器实现的。

4.FreeRTOS如何配置PendSV和Systick中断优先级?

在这里插入图片描述
PendSV表示任务切换优先级,SysTick表示时钟优先级,设置优先级为最低可以使中断能打断任务,而任务不会阻塞系统其他中断响应。

二.FreeRtos的中断管理实验

本实验会使用两个定时器,一个优先级为4,一个优先级为6,注意∶系统所管理的优先级范围:5~15,现象:两个定时器每1s,打印一段字符串,当关中断时,停止打印,开中断时持续打印。
在这里插入图片描述
btim.c设置两个定时器优先级:
在这里插入图片描述
回调函数:
在这里插入图片描述
实现功能:
注意此处不能使用vTaskDelay,因为这个函涉及到操作BASEPRI寄存器,会使得关闭的中断开启,故使用delay_ms延时。
在这里插入图片描述
main.c函数:
第一个值为arr: 自动重装值,第二个值为psc: 时钟预分频数。因为STM32F1系列芯片主频为72M,先7200分频为1M,之后设置自动重装值为10000,使得定时器一秒中断一次。
在这里插入图片描述
串口接收结果:
在这里插入图片描述


http://www.kler.cn/a/446771.html

相关文章:

  • Android Compose list 下拉刷新、上拉加载更多
  • 【学习总结|DAY021】Java 多线程
  • 部署 Apache Samza 和 Apache Kafka
  • Springboot应用开发:工具类整理
  • SSM 框架结合 Vue 实现电脑测评系统:助力用户明智选择
  • HTTP协议和接口测试详解
  • 如何写申请essay
  • [Pro Git#4] 标签 | 理解 | 创建 | push
  • 前端滚动锚点(点击后页面滚动到指定位置)
  • Anthropic:Agents 2024年度总结!
  • 数据结构day5:单向循环链表 代码作业
  • 随记:springboot的xml中sql数据库表名动态写法
  • linux-----常用指令
  • HarmonyOS ArkTS中视频播放Video组件实现竖屏到横屏切换
  • Centos7安装k8s集群
  • kafka常用命令(持续更新)
  • Vivado安装System Generator不支持新版Matlab解决方法
  • 国标GB28181协议平台Liveweb:搭建建筑工地无线视频联网监控系统方案
  • 命令行音乐库管理工具Beets
  • HTML语法规范
  • 自动生成发票数据并存入Excel
  • 【大语言模型】ACL2024论文-28 TTM-RE: 增强记忆的文档级关系抽取
  • 你了解TCP/IP参考模型吗
  • 8086汇编(16位汇编)学习笔记00.DEBUG命令使用解析及范例大全
  • Qt开发经验 --- 避坑指南(2)
  • Ajax简单理解