FreeRTOS学习 -- 中断配置

一、什么是中断

中断时微控制器一个很常见的特性,中断是由硬件产生,当中断产生以后CPU就会中断当前的流程而去处理中断服务,Cortex-M内核的MCU提供了一个用于中断管理的嵌套向量中断控制器(NVIC)。

二、中断优先级分组定义

当多个中断来临的时候处理器应该响应哪一个中断是由中断的优先级来决定的,高优先级的中断(优先级编号小)肯定是首先得到响应的,而且高优先的中断可以抢占低优先级的中断,这个就是中断嵌套。
Cortex-M处理器的有些中断是具有固定的优先级的,比如复位、NMI、HardFault,这些中断的优先级都是负数,优先级也是最高的。
STM32,只用了中断优先级配置寄存器的高4位 [7 : 4],所以STM32提供了最大16级的中断优先等级,MSB 对齐。
在这里插入图片描述

STM32优先级分组:
在这里插入图片描述
ST 官方默认的是组 4,4 位优先级就都全是抢占优先级了,没有亚优先级,那么就有 0~15 共 16 个优先级。
在这里插入图片描述

三、用于中断屏蔽的特殊寄存器

PRIMASK 寄存器

PRIMASK 用于禁止除 NMI 和 HardFalut 外的所有异常和中断。
只有 1 个位的寄存器,当它置 1 时,就关掉所有可屏蔽的异常,只剩NMI和HardFalut 可以响应。当它置 0 时,表示没有关中断。

FAULTMASK 寄存器

PRIMASK 用于禁止除 NMI 外的所有异常和中断。它可以连 HardFault 都屏蔽掉。
只有 1 个位的寄存器,当它置 1 时,就关掉所有可屏蔽的异常,只剩NMI可以响应。当它置 0 时,表示没有关中断。

BASEPRI 寄存器

这个寄存器最多有 9 位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。但若被设置为 0,则不关闭任何中断。默认值是 0.

四、中断配置宏

在这里插入图片描述

1、configPRIO_BITS

此宏用来设置 MCU 使用几位优先级,STM32 使用的是 4 位,因此此宏为 4

2、configKERNEL_INTERRUPT_PRIORITY

此宏是用来设置最低优先级。STM32 优先级使用了 4 位,而且 STM32 配置的使用组 4,也就是 4 位都是抢占优先级。优先级数就是 16 个,最低优先级那就是 15。所以此宏就是 15

3、configKERNEL_INTERRUPT_PRIORITY

此宏用来设置内核中断优先级。

4、configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

此宏用来设置 FreeRTOS 系统可管理的最大优先级。这里设置为了 5。也就是高于 5 的优先级(优先级数小于 5)不归 FreeRTOS 管理!

5、configMAX_SYSCALL_INTERRUPT_PRIORITY

此宏是 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 左移 4 位而来的,原因和宏 configKERNEL_INTERRUPT_PRIORITY 一样。此宏设置好以后,低于此优先级的中断可以安全的调用 FreeRTOS 的 API 函数,高于此优先级的中断 FreeRTOS 是不能禁止的,中断服务函数也不能调用 FreeRTOS 的 API 函数!

五、开关中断

FreeRTOS 开关中断函数为 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS()
在这里插入图片描述
可以看出开关中断实际上是通过函数 vPortSetBASEPRI(0)和 vPortRaiseBASEPRI()来实现的。
在这里插入图片描述

六、临界段代码

临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。FreeRTOS 系统本身就有很多的临界段代码,这些代码都加了临界段代码保护,我们在写自己的用户程序的时候有些地方也需要添加临界段代码保护。

FreeRTOS 与临界段代码保护有关的函数有 4 个:

  • taskENTER_CRITICAL()
  • taskEXIT_CRITICAL()
  • taskENTER_CRITICAL_FROM_ISR()
  • taskEXIT_CRITICAL_FROM_ISR()
    在这里插入图片描述

这四个函数其实是宏定义,在 task.h 文件中有定义。这四个函数的区别是前两个是任务级的临界段代码保护,后两个是中断级的临界段代码保护。

taskENTER_CRITICAL()和 taskEXIT_CRITICAL()是任务级的临界代码保护,一个是进入临界段,一个是退出临界段,这两个函数是成对使用的。

任务级别使用方法如下:
在这里插入图片描述
函数 taskENTER_CRITICAL_FROM_ISR()和 taskEXIT_CRITICAL_FROM_ISR()中断级别临界段代码保护,是用在中断服务程序中的,而且这个中断的优先级一定要低于 configMAX_SYSCALL_INTERRUPT_PRIORITY!这两个函数是成对使用的。

中断级临界代码保护使用方法如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

区块链安全应用----压力测试

通过Caliper进行压力测试程序 1.环境配置 第一步. 配置基本环境 部署Caliper的计算机需要有外网权限;操作系统版本需要满足以下要求:Ubuntu > 16.04、CentOS > 7或MacOS > 10.14;部署Caliper的计算机需要安装有以下软件&#xff…

作业4.17

1.总结串口的发送和接收功能使用到的函数 发送: HAL_StatusTypeDef HAL_UART_Transmit( UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout ) 接受: HAL_StatusTypeDef HAL_UART_Receive_IT( UART_HandleTypeDef *…

刀具表面上的微结构

刀具表面微结构通常指在刀具表面对特定功能设计的微观纹理,这些纹理可以是沟槽、凹坑、凸起或任何其他形式的微观图案。这些微结构的设计和应用是为了改善刀具的切削性能,减少切削力和切削温度,提高切削效率和精度,同时降低切削液…

Sa-Token使用经验

官方文档;Sa-Token Sa-Token 介绍 Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分…

第十六篇:springboot案例

文章目录 一、准备工作1.1 需求说明1.2 环境搭建1.3 开发规范1.4 思路 二、部门管理2.1 查询部门2.2 删除部门2.3 新增部门2.4 修改部门2.5 RequestMapping 三、员工管理3.1 分页查询3.2 删除员工3.3 新增员工3.3.1 新增员工3.3.2 文件上传 3.4 修改员工3.4.1 页面回显3.4.2 修…

C++ stl容器list的底层模拟实现

目录 前言: 1.创建节点 2.普通迭代器的封装 3.反向迭代器的封装 为什么要对正向迭代器进行封装? 4.const迭代器 5.构造函数 6.拷贝构造 7.赋值重载 8.insert 9.erase 10.析构 11.头插头删,尾插尾删 12.完整代码简单测试 总结&…

刀具刃口钝化

​刀具刃口钝化是指在刀具制作过程中,通过一系列的加工步骤使刀具刃口表面变得光滑、平整,去除因磨削加工造成的微观缺口,以提高刀具的切削性能和寿命。这一过程对于保障刀具的稳定性和精度至关重要,尤其是在高速切削和高精度加工…

Leetcode刷题之合并两个有序数组

Leetcode刷题之合并两个有序数组 一、题目描述二、题目解析 一、题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数…

一夜爆红的4款国产软件,却一度被大众误以为是外国人开发

在现今高度信息化的时代,计算机已经深深地渗透到了我们生活的每一个角落。 从日常的办公学习到娱乐休闲,几乎都离不开计算机技术的支持。而在这背后,软件作为计算机的灵魂,其发展历史可谓波澜壮阔。 中国软件产业经过多年的积累和…

【UE 材质】一些使用外部数据的节点的简单介绍

目录 一、ActorPosition 二、绝对世界位置 三、“CameraVector”与“ReflectionVector” 四、PixelDepth 一、ActorPosition 介绍 用于获取Actor在世界场景中的位置信息 应用举例 我们可以通过“ActorPosition”“Mask(B)”来获取Actor在Z轴上的位…

Vue项目管理器创建项目

黑马程序员JavaWeb开发教程 文章目录 1、创建新项目2、详情3、预设4、功能5、配置6、是否保存为预设模板7、正在创建项目8、创建完成 1、创建新项目 2、详情 3、预设 选择手动,点击下一步 4、功能 只需要额外选择一项–Router 即可,其余的保持默认&a…

Android Studio修改项目包名

1.第一步,项目结构是这样的,3个包名合在了一起,我们需要把每个包名单独展示出来 2.我们点击这个 取消选中后的包名结构是这样的,可以看到,包名的每个文件夹已经展示分开了,现在我们可以单独对每个包名文件夹…

【重磅】2024大模型应用研究与案例报告合集(共18份)

文末领取福利,扫描进群获取!!! 2024工业大模型应用报告.pdf 2024大语言模型能力测评报告.pdf 2024大模型落地应用案例集.pdf 2023中文大模型基准测评年度报告.pdf 2023人工智能大模型体验报告3.0.pdf 2023人工智能大模型体验报告…

Python文件操作大全

1 文件操作 1.1 文件打开与关闭 1.1.1 打开文件 在Python中,你可以使用 open() 函数来打开文件。以下是一个简单的例子: # 打开文件(默认为只读模式) file_path example.txt with open(file_path, r) as file:# 执行文件操作…

网络编程(现在不重要)

目录 网络编程三要素与InetAddress类的使用 软件架构 面临的主要问题 网络编程三要素(对应三个问题) InetAddress的使用 TCP与UDP协议剖析与TCP编程案例(了解) TCP协议 UDP协议 例子 UDP、URL网络编程 URL:&…

机器学习引领金融革命:重塑金融服务领域新格局,开启智能化新篇章

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

抖店选品技巧!如何在直播间找到“爆品”?新手必看

哈喽~我是电商月月 说到选品,除了看商品排行榜榜单,还可以去直播间看别人卖的好的商品,我们就跟着上架 但现实就是,如果真的这么简单,就不会有那么多人的店铺因为不怎么出单而放弃开店 其实这个方法确实是对的 但这…

when语法学习及判断主机别名实例

目录 1、概念 2、实例配置 2.1 编写剧本体验when的用法 2.2 执行剧本文件 2.3 使用ansible临时命令进行测试 1、概念 when是用于判断的语法,将其用在每个动作的下方进行判断,使得只有在满足条件才会执行。 2、实例配置-判断主机别名 在每个客户端中…

c语言中声明的问题【求个关注!】

文章目录 1 变量的声明与定义(1)定义与声明的区别:(2)为什么要区分定义与声明?(3)extern是什么 ?(4)举例: 2 函数的声明:函数声明的格…

SpringCloud集成Skywalking链路追踪和日志收集

1. 下载Agents https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz 2. 上传到服务器解压 在Spring Cloud项目中,每部署一个服务时,就拷贝一份skywalking的agent文件到该服务器上并解压。不管是部署…