FreeRTOS深入教程(中断管理)

news2024/11/27 14:30:44

文章目录

  • 前言
  • 一、为什么要为中断设计一套API
  • 二、两套函数区别对比
  • 三、两类中断
  • 四、FreeRTOS中SYSTICK和PendSV中断的作用
  • 总结


前言

本篇文章来分析FreeRTOS中的中断,中断在FreeRTOS中也是非常重要的,那么这篇文章将带大家来学习一下FreeRTOS中的中断处理以及涉及到的API等。

一、为什么要为中断设计一套API

1.实时性要求: 中断服务程序通常用于响应实时事件,例如硬件中断、定时器中断等。为了满足实时性要求,中断服务程序必须迅速执行,不能因等待某些资源而阻塞。中断处理必须在规定的时间内完成以确保系统的及时响应。

2.代码清晰度: 将任务和中断的操作分开可以提高代码的清晰度和可读性。任务上下文的操作通常涉及到任务切换、阻塞等,而中断上下文的操作需要考虑中断的实时性和不能阻塞的要求。通过使用两套函数,可以在代码中清晰地区分任务上下文和中断上下文的操作,使代码更易于理解。

3.可维护性: 分离任务和中断的操作使得系统更易于维护和修改。如果所有的操作都混合在一起,代码会变得复杂且难以理解。通过采用清晰的接口,可以更容易地理解和修改任务和中断的行为,降低引入错误的风险。

二、两套函数区别对比

这里使用xQueueSendToBack和xQueueSendToBackFromISR进行比较说明:

xQueueSendToBack:

调用上下文: 该函数用于在任务上下文中发送数据到队列。任务上下文是正常的程序执行上下文,不是中断上下文。
任务切换: 如果向队列发送数据导致接收方任务变得可运行(即有任务等待接收数据),则该函数可能会导致任务切换。这是因为向队列发送数据可能导致等待接收数据的任务变为就绪态,而当前任务可能因此让出 CPU。

xQueueSendToBackFromISR:

调用上下文: 该函数用于在中断服务程序(ISR)或软中断上下文中发送数据到队列。中断上下文是由硬件中断或软中断触发的执行上下文。
任务切换: 该函数不会导致任务切换。因为中断上下文具有实时性的要求,任务切换可能引入不确定性和延迟,所以在中断上下文中,通常不允许发生任务切换。

下面是两个函数的使用示例:

// 任务上下文中发送数据到队列
xQueueSendToBack(xQueue, &data, portMAX_DELAY);

// 中断上下文中发送数据到队列
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendToBackFromISR(xQueue, &data, &xHigherPriorityTaskWoken);

if(xHigherPriorityTaskWoken == pdTRUE)
{
	/*任务切换*/
	portYIELD_FROM_ISR();
}	

需要注意的是,在中断上下文中使用 xQueueSendToBackFromISR 时,通常会检查 xHigherPriorityTaskWoken 的值。如果它在调用之后被设置为 pdTRUE,则意味着有一个任务等待接收数据并且其优先级高于当前运行的任务,可能需要进行任务切换。在这种情况下,通常会调用适当的任务切换函数,如 portYIELD_FROM_ISR,以确保在适当的时机进行任务切换。

三、两类中断

前面我们在分析信号量,互斥量,队列等源码时都会涉及到需要关闭中断的操作,那么这里的关闭中断是直接关闭全部的中断吗?其实是不是的,这里关闭中断只是关闭了特定的中断,并没有将全部的中断关闭。

FreeRTOS会将中断分为两类,第一类更高优先级的中断中无法使用FreeRTOS中提供的函数,而更低优先级的一类可以使用到FreeRTOS中提供的函数。
在这里插入图片描述
实际关闭中断会调用到portDISABLE_INTERRUPTS函数,这个函数只是关闭更低优先级的中断,不会关闭其他高优先级的中断,SYStick中断也属于低优先级的中断。

void vPortEnterCritical( void )
{
    portDISABLE_INTERRUPTS();
    uxCriticalNesting++;

    /* This is not the interrupt safe version of the enter critical function so
     * assert() if it is being called from an interrupt context.  Only API
     * functions that end in "FromISR" can be used in an interrupt.  Only assert if
     * the critical nesting count is 1 to protect against recursive calls if the
     * assert function also uses a critical section. */
    if( uxCriticalNesting == 1 )
    {
        configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
    }
}

四、FreeRTOS中SYSTICK和PendSV中断的作用

在FreeRTOS中,SYSTICK和PendSV中断是两个关键的系统中断,它们在任务调度和协作方面发挥着重要的作用。

SYSTICK中断:

作用: SYSTICK中断是由系统定时器触发的中断。在FreeRTOS中,它用于实现任务调度的时基。任务调度器通过SYSTICK中断定期触发,根据任务的优先级和调度策略来决定是否切换当前运行的任务。

配置: SYSTICK中断的配置在FreeRTOS中是由configTICK_RATE_HZ参数控制的,该参数定义了系统定时器的时基。SYSTICK中断的频率通常设置为1kHz,但可以根据具体的应用需求进行调整。

示例: 当SYSTICK中断发生时,FreeRTOS的任务调度器会检查任务的状态,决定是否进行任务切换。这是实现抢占式多任务的基础。

PendSV中断:

作用: PendSV(Pending Supervisor Call)中断是一种特殊的中断,用于在任务切换时执行一些必要的操作。通常,当任务调度器决定切换到另一个任务时,它会生成一个PendSV中断请求,将切换的工作推迟到稍后在PendSV中断服务函数中执行。

配置: PendSV中断的优先级设置为最低,以确保它能够在其他中断完成后执行。PendSV中断不会被任务调度器直接触发,而是通过软件触发。
示例: 当SYSTICK中断触发任务切换时,实际的任务切换操作会被延迟到PendSV中断服务函数中执行。这样的设计有助于减小任务切换的上下文开销,并提高系统的响应速度。

总体而言,SYSTICK中断提供了任务调度的时基,而PendSV中断用于执行实际的任务切换操作。这两者共同协作,实现了FreeRTOS的多任务调度机制。

总结

本篇文章主要讲解了FreeRTOS中的中断管理,这一个部分还是比较重要的,那么希望大家可以深入的理解一下这部分的知识,有任何疑问都可以留言。

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

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

相关文章

文件搜索工具HoudahSpot mac中文版特点

HoudahSpot mac是一款文件搜索工具,它可以帮助用户快速准确地找到文件和文件夹,支持高级搜索和过滤,同时提供了多种视图和操作选项,方便用户进行文件管理和整理。 HoudahSpot mac软件特点 高级搜索和过滤功能:软件支持…

[pyqt5]pyqt5设置窗口背景图片后上面所有图片都会变成和背景图片一样

pyqt5的控件所有都是集成widget,窗体设置背景图片后控件背景也会跟着改变,此时有2个办法。第一个办法显然我们可以换成其他方式设置窗口背景图片,而不是使用styleSheet样式表,网上有很多其他方法。还有个办法就是仍然用styleSheet…

vsVode C++开发远程虚拟机工程配置

在使用VS Code进行C/C的开发过程中,有三个至关重要的配置文件,分别是 tasks.json, launch.json 和 c_cpp_properties.json 1. tasks.json tasks.json 是在 vscode 中辅助程序编译的模块,可以代你执行类似于在命令行输入 “gcc hello.c -o h…

在mysql存储过程中间部分,使用游标遍历动态结果集(游标动态传参使用)

mysql游标动态传参实现(动态游标) 1.问题2.需求描述3.实现3.1.使用3.2.代码(直接看这都可以) 1.问题 众所周知,mysql存储过程功能是没有oracle的包功能强大的,但是在去O的趋势下,mysql存储过程的…

17. Python 数据库操作之MySQL和SQLite实例

目录 1. 简介2. 使用PyMySQL2. 使用SQLite 1. 简介 数据库种类繁多,每种数据库的对外接口实现各不相同,为了方便对数据库进行统一的操作,大部分编程语言都提供了标准化的数据库接口,用户不需要了解每种数据的接口实现细节&#x…

2018年5月23日 Go生态洞察:更新Go行为准则

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

智能优化算法应用:基于蚁狮算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蚁狮算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蚁狮算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蚁狮算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

ElasticSearch学习笔记(狂神说)

ElasticSearch学习笔记(狂神说) 视频地址:https://www.bilibili.com/video/BV17a4y1x7zq 在学习ElasticSearch之前,先简单了解一下Lucene: Doug Cutting开发是apache软件基金会 jakarta项目组的一个子项目是一个开放…

乘波前行的问题

1.问题: 考虑两个信号叠加在一起,比如,一个是工频信号50Hz,一个是叠加的高频信号比如有3KHz,简单起见,两个信号都是幅值固定的标准的正弦波,现在我们期望得到那个高频信号,相对工频…

Seurat Tutorial 1:标准分析流程,基于 PBMC 3K 数据集

目录 1 设置 Seurat 对象2 标准预处理工作流程 2.1 QC 和选择细胞进行进一步分析3 数据归一化4 识别高变特征(特征选择)5 标准化数据6 执行线性降维7 确定数据集的维度8 细胞聚类9 运行非线性降维 (UMAP/tSNE)10 寻找差异表达特征(cluster b…

数据结构(超详细讲解!!)第二十五节 线索二叉树

1.线索二叉树的定义和结构 问题的提出: 通过遍历二叉树可得到结点的一个线性序列,在线性序列中,很容易求得某个结点的直接前驱和后继。但是在二叉树上只能找到结点的左孩子、右孩子,结点的前驱和后继只有在遍历过程中才能得到…

计算机视觉面试题-02

图像处理和计算机视觉基础 什么是图像滤波?有哪些常见的图像滤波器? 图像滤波是一种通过在图像上应用滤波器(卷积核)来改变图像外观或提取图像特征的图像处理技术。滤波器通常是一个小的矩阵,通过在图像上进行卷积…

【Linux】第二十站:模拟实现shell

文章目录 一、shell的实现细节1.shell的一些细节2.用户名、主机名、工作目录2.输入命令3.改为循环4.切割字符串5.普通命令的执行6.内建命令的处理7.子进程的退出码8.总结 二、模式实现shell完整代码 一、shell的实现细节 1.shell的一些细节 shell操作系统的一个外壳程序。 s…

【JavaEE初阶】浅谈进程

✏️✏️✏️今天正式进入JavaEE初阶的学习,给大家分享一下关于进程的一些基础知识。了解这部分内容,只是为后续多线程编程打好基础,因此进程部分的知识,不需要了解更加细节的内容。 清风的CSDN博客 😛😛&a…

Unsupervised Skill Discovery via Recurrent Skill Training论文笔记

Zheyuan Jiang, Jingyue Gao, Jianyu Chen (2022). Unsupervised Skill Discovery via Recurrent Skill Training. In Conference on Neural Information Processing Systems (NeurIPS), 2022. 通过循环技能训练发现无监督技能 1、Motivation 以往的无监督技能发现方法主要使…

Spring面向切面编程(AOP);Spring控制反转(IOC);解释一下Spring AOP里面的几个名词;Spring 的 IoC支持哪些功能

文章目录 Spring面向切面编程(AOP)什么是AOPSpring AOP and AspectJ AOP 的区别?Spring AOP中的动态代理如何理解 Spring 中的代理?解释一下Spring AOP里面的几个名词Spring在运行时通知对象Spring切面可以应用5种类型的通知:什么是切面 Aspe…

【开源】基于Vue+SpringBoot的食品生产管理系统

项目编号: S 044 ,文末获取源码。 \color{red}{项目编号:S044,文末获取源码。} 项目编号:S044,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3…

Typescript基础面试题 | 05.精选 ts 面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

代码随想录算法训练营第四十九天|123. 买卖股票的最佳时机III 、188. 买卖股票的最佳时机 IV

LeetCode 123. 买卖股票的最佳时机 III 题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 这个道题和121. 买卖股票的最佳时机 I、122. 买卖股票的最佳时机 II很像,是两题的结合。 我们就定义两个数组来实现。 代码&…

【Apache Doris】Manager极致丝滑地运维管理

【Apache Doris】Manager极致丝滑地运维管理 1.标准VS可视化运维管理2. 环境信息2.1.硬件信息2.2.软件信息 3.前置准备3.1.安装包准备3.2.文档手册准备 4.集群初始化4.1.系统参数预设4.2.Manager部署4.3.新集群部署4.4 监控告警4.4.1 监控4.4.2 告警 5. 集群升级5.1 新包准备5.…