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!这两个函数是成对使用的。

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

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

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

相关文章

土壤湿度传感器:助力农业现代化

随着科技的飞速发展,越来越多的先进技术被应用到农业生产中。其中,土壤湿度传感器作为现代农业的重要工具,正逐渐改变着传统农业的生产方式,成为农业现代化的秘密武器。 精确监测:土壤湿度传感器能够实时、精确地监测土…

WIN7用上最新版Chrome

1.下载WIN10最新版Chrome的离线安装包 谷歌浏览器 Chrome 最新版离线安装包下载地址 v123.0.6312.123 - 每日自动更新 | 异次元软件 文件名称:123.0.6312.123_chrome_installer.exe。 123.0.6312.123_chrome_installer.exe 文件右键解压缩得到 chrome.7z&#x…

树莓派3B长时间不操作屏幕息屏无信号处理

树莓派外接显示器,需长时间展示某个网页,经过一段时间,显示器屏幕会黑掉显示无信号。 需修改 /etc/lightdm/lightdm.conf 配置文件中新增如下两行并重启。 xserver-commandX -s 0 dpms sleep-inactive-timeout0

软考 - 系统架构设计师 - Web 应用真题(2)

问题 1: 淘汰策略:遗留系统技术含量低,业务价值也低,所以需要全面重新开发一个系统来替代遗留系;(一般是企业的业务发生了根本变化,遗留系统已经基本不再适应企业运作的需要;或者是遗…

【Python基础】19.eval函数的使用

eval函数 eval()将字符串转变为有效的表达式来求值并返回对应的结果 基础数据计算 In [1]: eval("1 1") Out[1]: 2字符串重复 In [2]: eval (" * * 10") Out[2]: **********字符串转为列表 In [3]: type(eval("[1,2,3,4,5]")) Out[3]: lis…

docker 简单使用

docker 简单使用 一、 docker 安装二、docker 使用1. docker pull 拉取镜像2. docker run 后台运行3. docker ps 查看容器运行状态4. docker exec 进入容器5. exit 退出容器6. docker restar 重启容器7. docker stop 停止运行容器8. docker stop 启动容器9. docker stop 删除容…

nextjs渲染篇

1 服务器组件 默认情况下,Next.js 使用服务器组件。 1.1 服务器组件是如何呈现的? 在服务器上,Next.js 使用 React 的 API 来编排渲染。渲染工作被拆分为多个块:按单个路段和Suspense 每个区块分两个步骤呈现: Re…

Python一键修改目录下所有文件的编码格式

前言 在开发中总会遇到这样的问题,别人的代码采用的编码格式是GBK,而自己的项目的编码格式是UTF-8,如果直接复制过来,就会出现中文乱码的问题,一个个该编码格式又非常麻烦。所以我写了这样一小段简短的代码&#xff0…

Python 中的高阶函数

Python 中的高阶函数是指可以接受函数作为参数,或者返回函数作为结果的函数。这种特性让编程变得更加灵活和功能强大,常见的高阶函数有 map()、filter()、reduce() 和 sorted() 等。 map() 函数: map() 函数接受一个函数和一个可迭代对象&a…

select * from .... for update 使用 防止重复提交/操作

详情点下方链接 for-update笔记链接 注:当选中某一个行的时候,如果是通过主键id选中的。那么这个时候是行级锁。 其他的行还是可以直接insert 或者update的。如果是通过其他的方式选中行,或者选中的条件不明确包含主键。这个时候会锁表。其他的事务对该表的任意一行…

SQLite的PRAGMA 声明(二十三)

返回:SQLite—系列文章目录 上一篇:SQLite从出生到现在(发布历史记录)(二十二) 下一篇:用于 SQLite 的异步 I/O 模块(二十四) PRAGMA 语句是特定于 SQLite 的 SQL 扩…

Valorant 瓦罗兰特更新后进不去游戏?3个解决方法完美解决

Valorant 瓦罗兰特更新后进不去游戏?3个解决方法完美解决 《无畏契约(VALORANT)》是一款由知名游戏开发商(Riot Games)开发并且免费的多人射击游戏。游戏背景设定在一个幻想世界中,玩家将探索瓦罗兰大陆上…

面对深度合成技术备案,企业应该如何做好准备?

在这个数字化高速发展的时代,互联网信息服务已经深入我们生活的方方面面。特别是那些应用深度合成技术的互联网信息服务,比如通过算法实现的图像、语音和视频的合成等,现在都需要进行严格的备案。由于备案周期较长,建议涉及这些技…

基于python的二手房数据分析建模及可视化研究,爬取链家二手房数据,可视化分析,房价预测模型

介绍 主要涉及通过爬取济南市链家二手房数据,然后对数据进行处理,包括缺省值处理,高德地图获取二手房地址所属市区,经纬度等数据处理。然后通过python的flask框架编写后端接口,把数据响应给前端。然后前端通过AJAX请求…

Excel:如何对数据列进行码值转换

这里有两种函数可以直接解决: 在需要转码的数据列旁边新建一列,使用如下函数即可 1、函数一 VLOOKUP(H10,B3:C45,2,FALSE) VLOOKUP(需要转码的单元格,key和value所在数据范围,需要转成范围内第几列数据,是否模糊匹配) 这个函数中,key和valu…

Oracal数据库使用

Oracal官网:https://www.oracle.com/database/technologies/instant-client/downloads.html 官网搜索需登陆:https://edelivery.oracle.com/osdc/faces/SearchSoftware 软猫下载:Oracle 19.3 0、linux下安装 Linux系统(X64&…

lsof命令——查看进程信息

lsof是一个用于显示系统中打开的文件和进程的命令。它可以列出当前系统中打开文件的相关信息,如进程ID、文件描述符、文件类型、文件大小、文件所属用户、文件的读写状态等等。lsof命令可以帮助用户识别哪些进程正在使用某个文件或目录,以及查看系统中打…

谈谈微前端

相关问题 为什么要用微前端微前端的优缺点 回答关键点 独立开发 独立运行 独立部署 自治 微前端是一种架构理念,它将较大的前端应用拆分为若干个可以独立交付的前端应用。这样的好处是每个应用大小及复杂度相对可控。在合理拆分应用的前提下,微前端能…

基于监控视频的车辆检测

目前常用的基于监控视频的车辆检测方法分为两类:基于运动信息的车辆检测方法和基于特征信息的车辆检测方法。基于运动信息的车辆检测方法主要包括光流法、帧差法和背景法等。基于特征的车辆检测,是以统计机器学习理论为基础的车辆检测方法,通…

Java面试题:描述Java 14中的模式匹配及其使用场景

Java 14是继Java 12和Java 13之后,继续引入了模式匹配作为预览特性的版本。模式匹配是一种新的语法结构,用于简化对象的比较和类型检查,它可以在instanceof表达式和switch语句中使用。模式匹配的目的是提高代码的可读性和简化复杂的条件语句。…