FREERTOS中断配置和临界段

2024-03-18 11:36
文章标签 配置 中断 freertos 临界

本文主要是介绍FREERTOS中断配置和临界段,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文基础内容参考的是正点原子的FREERTOS课程。

这是基于HAL库的

正点原子手把手教你学FreeRTOS实时系统

这是基于标准库的

正点原子FreeRTOS手把手教学-基于STM32

回顾STM32的中断

什么是中断?

中断优先级分组设置

Freertos中断分组

Freertos就是用的最后一种,所以,我们需要重设中断优先级分组

有三个主要特点:

1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数;

2、建议将所有优先级位指定为抢占优先级位,方便FreeRTOS管理;

3、中断优先级数值越小越优先,任务优先级数值越大越优先;

配置PendSV和Systick中断优先级

freertos如何配置PendSV和Systick中断优先级?

得先熟悉下STM32中断相关寄存器

其中,跟PendSV和SysTick优先级相关的就是SHPR3这个寄存器,地址为0xE000ED20,理论上,我们只要把对应优先级数值赋值到上表的最后两个地址处的寄存器,就能实现配置PendSV和Systick的中断优先级。

具体Freertos是怎么做的呢?

其实就是通过写这两个寄存器来实现的

PendSV SysTick 优先级是在哪里设置的呢?在函数 xPortStartScheduler()中设置,此函数在文件 port.c 中。

往下看,有这么两行

看看调用关系

通过上述过程,就可以将15这个freertos管理的最低优先级赋值给pendsv和systick这两个中断的优先级。其中,左移4位是因为中断寄存器只有高4位有效,低4位不使用。

详细过程可自行看源码分析,此处不赘述。

只要知道,freertos中,将pendsv和systick的中断都设置成了最低优先级,注意,是中断的最低优先级,不管再怎么低,都比任务要高;这样,就能保证系统任务切换不会阻塞系统其他中断的响应,因为任务切换其实就是在pendsv中断中进行的,它最低,其他中断也能及时抢占它。

freertos开中断和关中断

先熟悉下另外几个中断相关寄存器

freertos实现关中断和开中断,其实就是往寄存器BASEPRI写阈值,然后优先级小于等于阈值中断都会被屏蔽,此时,如果往该寄存器写入freertos管理的最高优先级,那么所有的优先级都小于等于最高优先级,因此所有优先级中断都会被屏蔽。

FreeRTOS 开关中断函数为portENABLE_INTERRUPTS ()和portDISABLE_INTERRUPTS(), 这两个函数其实是宏定义,在 portmacro.h 中有定义,如下:

可以看出开关中断实际上是通过函数 vPortSetBASEPRI(0)vPortRaiseBASEPRI()来实现 的。

比如关中断调用portDISABLE_INTERRUPTS()

freertos管理的优先级能被freertos屏蔽,也能调用它的API函数;不能管理的中断没法屏蔽,也就是说管不了,管不了你,也不让你调用我的API。

开中断调用portENABLE_INTERRUPTS()

其实就是往该寄存器里写0,此时不屏蔽任何中断。

临界段代码

临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设

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

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

 

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

注意,任务调度靠的是PendSV中断,所以关中断,也就关闭了任务调度。

进入临界区函数的内部其实就是调用了关中断函数,一直跳转可以看到,如下所示:

退出临界区函数里面就对应调用了开中断函数:

只不过,临界区相对于开关中断增加了嵌套功能,即通过变量自增和自减来实现,调用了n次进入临界区,就要调用n次退出临界区才能开中断。

这篇关于FREERTOS中断配置和临界段的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、