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

FreeRTOS操作系统学习——中断管理

中断管理介绍

嵌入式实时系统需要对整个系统环境产生的事件作出反应。这些事件对处理时间和响应时间都有不同的要求。事件通常采用中断方式检测,中断服务例程(ISR)中的处理量应当越短越好。ISR是在内核中被调用的, ISR执行过程中,用户的任务无法执行。 ISR要尽量快,否则:其他低优先级的中断无法被处理:实时性无法保证。
如果这个硬件中断的处理,就是非常耗费时间呢?对于这类中断的处理就要分为2部分:

  • ISR:尽快做些清理、记录工作,然后触发某个任务
  • 任务:更复杂的事情放在任务中处理
  • 所以:需要 ISR 和任务之间进行通信

注意:只有以”FromISR”或”FROM_ISR”结束的 API 函数或宏才可以在中断服务例程中。

俩套API函数

在任务函数中,我们可以调用各类 API 函数,比如队列操作函数: xQueueSendToBack。但是在 ISR 中使用这个函数会导致问题,应该使用另一个函数: xQueueSendToBackFromISR,它的函数名含有后缀"FromISR",表示"从 ISR 中给队列发送数据"。FreeRTOS中很多API函数都有两套:一套在任务中使用,另一套在ISR中使用。后者的函数名含有"FromISR"后缀。

为什么要引入两套API函数?
很多 API 函数会导致任务计入阻塞状态;运行这个函数的任务进入阻塞状态;比如写队列时,如果队列已满,可以进入阻塞状态等待一会,ISR 调用 API函数时, ISR 不是"任务", ISR 不能进入阻塞状态。所以,在任务中、在 ISR 中,这些函数的功能是有差别的。

xHigherPriorityTaskWoken 参数
xHigherPriorityTaskWoken 的含义是:是否有更高优先级的任务被唤醒了。如果为pdTRUE,则意味着后面要进行任务切换。
在这里插入图片描述
可以看到,在任务中调用 API 函数可能导致任务阻塞、任务切换,这叫做"context switch",上下文切换。这个函数可能很长时间才返回,在函数的内部实现了任务切换。
xQueueSendToBackFromISR()函数也可能导致任务切换,但是不会在函数内部进行切换,而是返回一个参数:表示是否需要切换,函数原型与用法如下:

/*
* 往队列尾部写入数据,此函数可以在中断函数中使用,不可阻塞
*/
BaseType_t xQueueSendToBackFromISR(
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
/* 用法示例 */
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendToBackFromISR(xQueue, pvItemToQueue, &xHigherPriorityTaskWoken);
if (xHigherPriorityTaskWoken == pdTRUE)
{
/* 任务切换 */
}

在这里插入图片描述
使用"FromISR"函数时,如果不想使用xHigherPriorityTaskWoken参数,可以设置为NULL。

ISR中任务切换
portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); //使用汇编实现
//或者使用以下函数
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );//使用 C 语言实现
void XXX_ISR()
{
int i;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
for (i = 0; i < N; i++)
{
xQueueSendToBackFromISR(..., &xHigherPriorityTaskWoken); /* 被多次调用 */
}
/* 最后再决定是否进行任务切换
* xHigherPriorityTaskWoken 为 pdTRUE 时才切换
*/
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
中断延迟处理

如果在中断中需要处理的函数十分耗时,那么就要考虑分为以下俩个步骤进行处理

  • ISR:尽快做些清理、记录工作,然后触发某个任务
  • 任务:更复杂的事情放在任务中处理
    在这里插入图片描述

俩套函数API

在这里插入图片描述

http://www.lryc.cn/news/317719.html

相关文章:

  • DHCP中继实验(思科)
  • 基于SpringBoot的“心灵治愈交流平台”的设计与实现(源码+数据库+文档+PPT)
  • 【SpringBoot】自定义工具类实现Excel数据新建表存入MySQL数据库
  • Retelling|Facebook1
  • 【2024-03-12】设计模式之模板模式的理解
  • Transformer模型引领NLP革新之路
  • 【Kotlin】运算符函数、解构函数、中缀函数
  • springboot268码头船只货柜管理系统
  • Java面试题11MySQL之执行计划到事务及慢查询
  • 算法时空复杂度分析:大O表示法
  • threejs简单创建一个几何体(一)
  • msfconsole数据库连接不了的问题【已解决】
  • 7. Linux进程环境
  • [linux] 静态图和动态图
  • 1.Spring核心功能梳理
  • 活动预告:如何培养高质量应用型医学人才?
  • 蓝桥杯算法错题记录-基础篇
  • Java知识点之单例模式
  • Flutter第三弹:常用的Widget
  • Dynamic Wallpaper v17.4 mac版 动态视频壁纸 兼容 M1/M2
  • Windows / Mac应用程序在Linux系统中的兼容性问题 解决方案
  • Net Core 使用Mongodb操作文件(上传,下载)
  • 适用于系统版本:CentOS 6/7/8的基线安全检测脚本
  • Seata源码流程图
  • 英飞凌电源管理PMIC的安全应用
  • 快速在Linux系统安装MySQL
  • 数据库相关理论知识(有目录便于直接锁定相关知识点+期末复习)
  • NCC环境配置
  • 用python实现Dubins曲线生成
  • 智能技术上的“是”并不代表具体领域的“应该”