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

UCOSIII 中断管理接口剖析

引言

在实时操作系统中,中断处理是一个非常重要的环节。理解和掌握中断处理流程对提高系统实时性和稳定性至关重要。本文将详细解析uCOS-III内核中的中断管理接口,包括 OSIntEnter()OSIntExit() 函数的流程,并结合流程图对各个步骤进行说明。

中断服务接口处理流程
void IRQHandler(void) {CPU_SR_ALLOC();CPU_CRITICAL_ENTER();OSIntEnter(); /* Tell uC/OS-III that we are starting an ISR           */CPU_CRITICAL_EXIT();//todoOSIntExit();
}

OSIntEnter()函数简介

OSIntEnter() 是uCOS-III内核中处理中断入口的关键函数。当中断发生时,需要调用该函数以便内核进行必要的中断嵌套计数和调度处理。该函数主要完成以下任务:

  1. 增加中断嵌套计数器。
  2. 确保在多级中断时正确处理。
  3. 追踪最大中断嵌套深度。
OSIntEnter()流程图

OSIntExit()函数简介

OSIntExit() 是uCOS-III内核中处理中断退出的关键函数。当中断服务程序(ISR)完成处理后,需要调用该函数以便内核进行必要的上下文切换和任务调度。该函数主要完成以下任务:

  • 检查操作系统运行状态
  • 更新中断嵌套计数器
  • 检查调度器是否被锁定
  • 获取最高优先级任务
  • 执行上下文切换
OSIntExit()流程图

0844e772ecf046e8bdd0efbe0fad2763.png

详细步骤解析
1. 操作系统运行状态检查

OSIntExit() 函数中,首先会检查操作系统是否正在运行。如果操作系统未启动,则直接返回。这一步的目的是确保在操作系统初始化过程中不会进行不必要的操作。

if (OSRunning != OS_STATE_OS_RUNNING) {OS_TRACE_ISR_EXIT();return;
}
2. 禁用中断

在对内核数据操作之前,需要禁用中断,以防止在更新数据时被其他中断打断,导致数据不一致。

CPU_INT_DIS();
3. 中断嵌套计数器检查

检查 OSIntNestingCtr 变量,判断当前是否在处理中断。如果嵌套计数器为零,说明没有中断正在处理,可以直接返回;否则,减少嵌套计数器的值。

if (OSIntNestingCtr == 0u) {OS_TRACE_ISR_EXIT();CPU_INT_EN();return;
} else {OSIntNestingCtr--;if (OSIntNestingCtr > 0u) {OS_TRACE_ISR_EXIT();CPU_INT_EN();return;}
}
4. 调度器锁定检查

检查调度器是否被锁定,如果是,则直接返回,不进行任务切换。

if (OSSchedLockNestingCtr > 0u) {OS_TRACE_ISR_EXIT();CPU_INT_EN();return;
}
5. 获取最高优先级任务

获取最高优先级的任务,并进行任务切换。如果当前任务就是最高优先级任务,则直接返回。

OSPrioHighRdy = OS_PrioGetHighest();
OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;
if (OSTCBHighRdyPtr == OSTCBCurPtr) {OS_TRACE_ISR_EXIT();CPU_INT_EN();OS_TRACE_TASK_SWITCHED_IN(OSTCBHighRdyPtr);return;
}
6. 执行上下文切换

增加上下文切换计数器的值,调用 OSIntCtxSw() 进行中断级别的上下文切换,最后使能中断。

OSTCBHighRdyPtr->CtxSwCtr++;
OSTaskCtxSwCtr++;
OSIntCtxSw();
CPU_INT_EN();
注意事项:

1.  必须成对调用 OSIntEnterOSIntExit

2. 必须在中断已禁用的情况下调用:OSIntEnter

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

相关文章:

  • windows 11 PC查询连接过的wlan密码
  • npm install 出现canvas错误
  • Python爬虫入门篇学习记录
  • 怎样对 PostgreSQL 中的慢查询进行分析和优化?
  • Springboot项目远程部署gitee仓库(docker+Jenkins+maven+git)
  • Chromium CI/CD 之Jenkins实用指南2024- Windows节点开启SSH服务(七)
  • 阿里大数据面试题集锦及参考答案(3万字长文:持续更新)
  • springboot 配置 spring data redis
  • Numpy基础用法
  • 设计模式--享元模式
  • 可视化剪辑,账号矩阵,视频分发,聚合私信一体化营销工具 源----代码开发部署方案
  • CCF-CSP认证考试 202406-2 矩阵重塑(其二) 100分题解
  • 初阶数据结构的实现1 顺序表和链表
  • 破解反爬虫策略 /_guard/auto.js(一) 原理
  • 40.简易频率计(基于等精度测量法)(3)
  • 关于Centos停更yum无法使用的解决方案
  • 插画感言:成都亚恒丰创教育科技有限公司
  • 【算法】数组中的第K个最大元素
  • Perl 语言的特点
  • NLP教程:1 词袋模型和TFIDF模型
  • 【开源 Mac 工具推荐之 2】洛雪音乐(lx-music-desktop):免费良心的音乐平台
  • AMEYA360:思瑞浦推出汽车级理想二极管ORing控制器TPS65R01Q
  • 简约的悬浮动态特效404单页源HTML码
  • Golang 创建 Excel 文件
  • 探索GitHub上的两个革命性开源项目
  • SpringBoot框架学习笔记(三):Lombok 和 Spring Initailizr
  • 【ASP.NET网站传值问题】“object”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“object”类型的变量等
  • Stateflow中的状态转换表
  • 结合Redis解决接口幂等性问题
  • 2024算力基础设施安全架构设计与思考(免费下载)