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

FreeRTOS: ISR(中断服务例程)和 TCB(任务控制块)

在讨论 ISR(中断服务例程)和 TCB(任务控制块,Task Control Block)时,我们实际上是在探讨 FreeRTOS 中两个不同但又相互关联的概念:一个是用于处理硬件或软件触发的中断事件,另一个是操作系统用来管理任务的核心数据结构。下面我将详细解释这两个概念及其关系。

1. ISR (Interrupt Service Routine)

定义
  • ISR 是一段专门编写的小型程序代码,用来处理特定类型的中断请求。当中断发生时,CPU 暂停当前执行的任务,转而执行相应的 ISR 来响应这个中断。ISR 必须快速完成其工作,以确保其他更高优先级的中断能够及时得到响应。
特点
  • 高优先级:ISR 比普通任务具有更高的优先级。
  • 非抢占性:在一个 ISR 执行期间,不会被另一个 ISR 或者普通任务所抢占,除非新来的中断源设置了更高的优先级。
  • 简短高效:ISR 应尽可能快地完成,因为长时间运行的 ISR 可能会影响系统的实时性能和响应速度。
  • 不能阻塞:ISR 内部不允许调用任何可能导致阻塞的操作(如 vTaskDelay()),因为这会导致整个系统陷入死锁状态。
在 FreeRTOS 中使用 ISR
  • 发送消息给队列:可以使用 xQueueSendFromISR() 函数将数据发送到队列,但要注意避免阻塞。
  • 唤醒任务:可以通过 xSemaphoreGiveFromISR() 或 xTaskResumeFromISR() 唤醒等待的任务,同样要避免阻塞。
  • 检查是否需要上下文切换:某些 ISR 函数有一个参数指向一个布尔变量,如果该变量被设为 pdTRUE,则表明有更高优先级的任务被唤醒,可能需要进行上下文切换。这时应该调用 portYIELD_FROM_ISR() 来实现这一点。

2. TCB (Task Control Block)

定义
  • TCB 是 FreeRTOS 内核用于管理每个任务的数据结构。它包含了任务的所有信息,包括但不限于:
    • 任务状态:如就绪、运行、阻塞等。
    • 任务堆栈指针:保存任务的寄存器状态和局部变量。
    • 任务优先级:定义了任务相对于其他任务的执行顺序。
    • 任务句柄:唯一标识符,用于从应用程序中引用任务。
    • 任务延时计数器:用于定时阻塞任务。
    • 消息队列:如果任务使用了队列,则包含相关队列的信息。
功能
  • 任务调度:FreeRTOS 使用 TCB 中的状态信息来决定哪个任务应该获得 CPU 时间片。
  • 内存管理每个 TCB 都有自己的堆栈空间,用于存储任务执行期间的临时数据。
  • 同步与通信:通过 TCB,任务可以访问和操作共享资源,如信号量、队列等,从而实现任务间的同步和通信。

ISR 和 TCB 的关系

尽管 ISR 和 TCB 分别代表了不同的概念,但在实际应用中它们之间存在一定的交互:

  • 从中断上下文唤醒任务:当 ISR 处理完中断后,它可能会改变某个任务的状态(例如通过信号量或队列)。此时,ISR 可以通知 FreeRTOS 内核有关任务状态的变化,并可能触发一次上下文切换,让被唤醒的任务立即开始执行。这种情况下,ISR 会更新相关的 TCB,特别是那些涉及任务状态转换的部分。

  • 任务创建与删除:虽然 ISR 不直接参与任务的创建或删除过程,但它可以在运行时影响哪些任务处于活动状态。例如,ISR 可能会向队列发送数据,导致原本处于阻塞状态的任务变得可运行,进而改变了这些任务对应的 TCB 状态。

  • 上下文切换:当 ISR 结束时,如果检测到有更高优先级的任务被唤醒,则会触发一次上下文切换。这意味着当前正在执行的任务会被挂起,而新的最高优先级任务将接管 CPU。这一过程中,FreeRTOS 内核会根据各个任务的 TCB 来确定下一个要执行的任务,并相应地调整 CPU 上下文。

相关文章:

FreeRTOS: ISR(中断服务例程)和 TCB(任务控制块)

在讨论 ISR(中断服务例程)和 TCB(任务控制块,Task Control Block)时,我们实际上是在探讨 FreeRTOS 中两个不同但又相互关联的概念:一个是用于处理硬件或软件触发的中断事件,另一个是…...

【Spring】Spring DI(依赖注入)详解—自动装配—byType实现原理

一、引言 依赖注入(Dependency Injection, DI)是Spring框架的核心特性之一,它通过控制反转(Inversion of Control, IoC)来管理对象的生命周期和依赖关系。在实际应用中,DI不仅提高了代码的可维护性和可测试…...

015-spring-动态原理、AOP的xml和注解方式

强制使用cglib动态代理 spring-AOP的使用...

linux更换yum源

1.备份系统源文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2.下载国内的yum源到/etc/yum.repos.d/CentOS-Base.repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo如无法使用wget命令也可以…...

跨年战揭开本地生活新赛季:美团、抖音和快手争夺冰雪经济

元旦将至,冬季文旅消费渐至高潮。 2024年的文旅消费市场延续了去年冰雪游的热度,不断创下年内话题和热度新高。美团旅行数据显示,12月以来,雪场夜滑搜索热度同比增长65%,TOP5搜索城市分别是北京、乌鲁木齐、张家口、吉…...

文件传输工具FTransferor<优化篇>

在上一篇文章中,我们详细探讨了FTransferor文件传输工具的设计与实现,并展示了它在局域网文件传输方面的高效性。然而,随着互联网应用场景的不断丰富,传统的基于 TCP/UDP 的传输方式已经无法满足部分开发者的需求。特别是在跨平台…...

【最新】17个一站式数据集成平台案例PPT下载(Apache SeaTunnel )

17个Apache SeaTunnel案例下载见附件! 开发篇 1.Apache SeaTunnel——OLAP 引擎的数据动脉 1.1项目定位——EtLT 时代的新一代数据集成平台 1.2Apache SeaTunnel 核心功能 1.3Apache SeaTunnel 在 OLAP 场景下的应用 1.4WhaleTunnel 产品特性 2.教你从头到尾开发一…...

【每日学点鸿蒙知识】子窗口方向、RichEdit不居中、本地资源缓存给web、Json转对象丢失方法、监听状态变量数组中内容改变

1、HarmonyOS 应用新建子窗口设置显示方向未生效? 子窗口getPreferredOrientation获取到的是横向 设置没问题,但是ui显示还是纵向的 直接设置主窗口的方向即可。参考demo: import window from ohos.window;Entry Component struct Index {…...

【AI绘画】Midjourney前置指令/imagine与单图指令详解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 💯Midjourney前置指令/imagine什么是前置指令?/imaginepromptUpscale(图像分离)Variations(变化)🔄&a…...

【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识

前言 在iOS开发中Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才…...

学习笔记 --C#基础其他知识点(数据结构)

C#中的数据结构《二》–视频学习笔记 在数据结构的分类: 1.集合 2.线性 3.树形 4.图状结构 数据结构是数据在程序中的存储结构,和基本的数据操作 算法:解决问题的解决思路,基于数据结构 本课程包括:线性表&#xff…...

AI与药学 | ChatGPT 在临床药学中的有效性以及人工智能在药物治疗管理中的作用

《Effectiveness of ChatGPT in clinical pharmacy and the role of artificial intelligence in medication therapy management》这篇文献研究了ChatGPT在临床药学,特别是在药物治疗管理(MTM)中的有效性。 一、研究背景 (Background) MTM …...

Streamlining QA with Automated Testing for 3D Models

Quality assurance testing in 3D modeling is like walking a tightrope. Balancing the need for detailed accuracy and the time it takes to achieve it is no small feat. But what if we could make the tightrope wider, the task less daunting? And it’s where aut…...

产品原型设计

🤣🤣目录🤣🤣 一、Axure原型设计(Axure RP 9 )1.1 软件下载安装1.2 产品原型展示1.3 产品原型下载1.4 视频课程推荐 二、磨刀原型设计2.1 软件下载安装2.2 产品原型展示2.3 产品原型下载2.4 视频课程推荐 什…...

【Linux命令】su、sudo、sudo su、sudo -i、sudo -l的用法和区别

su 命令 su (Switch User 切换用户),允许用户切换到另一个用户的身份,默认情况下是切换到 root 用户。 默认行为:如果只运行 su,则系统会要求输入 root 用户的密码来切换到 root 用户,获取管理员权限。 切换到其他用…...

【广州计算机学会、广州互联网协会联合主办 | ACM独立出版 | 高录用】第四届大数据、信息与计算机网络国际学术会议(BDICN 2025)

第四届大数据、信息与计算机网络国际学术会议(BDICN 2025)定于2025年01月10-12日在中国广州举行。会议旨在为从事“大数据”、“计算机网络”与“信息”研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术,了解学术发…...

HTML5 开关(Toggle Switch)详细讲解

HTML5 开关(Toggle Switch)详细讲解 1. 任务概述 开关(Toggle Switch)是一种用于表示二元状态(如开/关)的用户界面控件。用户可以通过点击开关来切换状态,常见于设置选项、开关功能等场景。 2…...

win32汇编环境下,双击窗口程序内生成的listview列表控件的某行,并提取其内容的示例程序

;运行效果 ;双击后 ;上源码,仔细研究里面的几条备注就理解原理了 ;提取窗口程序内生成的listview列表控件的内容示例程序 ;抄下面源码,可以在radasm里面直接编译运行。主要的部分加了备注。 ;>>>>>>>>>>>>>>…...

mysql主从断开后问题排查及修复

服务器mysql主从同步断开后,进行主从恢复 问题:mysql的主从断开了,在从服务器上通过以下命令查看状态,发现Slave_SQL_Running为No SHOW SLAVE STATUS\G;Slave_IO_Running:表示从服务器读取主服务器日志的线程 Slave_…...

[2025] 如何在 Windows 计算机上轻松越狱 IOS 设备

笔记 1. 首次启动越狱工具时,会提示您安装驱动程序。单击“是”确认安装,然后再次运行越狱工具。 2. 对于Apple 6s-7P和iPad系列(iOS14.4及以上),您应该点击“Optinos”并勾选“允许未经测试的iOS/iPadOS/tvOS版本”&…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...