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

RT-Thread 深入系列 Part 2:RT-Thread 内核核心机制深度剖析

摘要
本文从线程管理、调度器原理、中断处理与上下文切换、IPC 同步机制、内存管理五大核心模块出发,深入剖析 RT-Thread 内核实现细节,并辅以源码解读、流程图、时序图与性能数据。


目录

  1. 线程管理与调度器原理
    1.1 线程控制块(TCB)结构
    1.2 就绪队列与优先级调度
    1.3 时间片与抢占策略

  2. 中断管理与上下文切换
    2.1 中断入口与中断服务例程
    2.2 PendSV 与 SVC 的协作
    2.3 上下文切换时序图

  3. IPC 与同步机制
    3.1 信号量(Semaphore)
    3.2 消息队列(Message Queue)
    3.3 邮件箱(Mailbox)与事件集(Event Flags)

  4. 内存管理
    4.1 内存池(Memory Pool)
    4.2 堆管理与动态分配
    4.3 内存对齐与最小碎片化

  5. 性能与资源开销实测

  6. 小结与下一步


1. 线程管理与调度器原理

RT-Thread 的线程由 struct rt_thread 描述,调度由内核定期或抢占式触发。

1.1 线程控制块(TCB)结构

struct rt_thread
{char       name[RT_NAME_MAX];rt_list_t  tlist;            /* 就绪/挂起挂钩子 */rt_list_t  elist;            /* 超时队列挂钩子 */rt_uint8_t current_priority; /* 当前优先级 */rt_uint8_t init_priority;    /* 初始优先级 */rt_tick_t  remaining_tick;   /* 时间片剩余片数 */void      *stack_addr;       /* 线程栈基址 */rt_uint32_t stack_size;      /* 线程栈大小 */rt_uint32_t sp;              /* 运行时栈指针(寄存器) */void     (*entry)(void *parameter); /* 入口函数 */void      *parameter;        /* 入口函数参数 *//* … 其他成员 … */
};
  • 优先级字段:分为 init_prioritycurrent_priority,后者在持有互斥量或发生优先级继承时会临时提升。

  • 就绪与超时链表:通过双向链表将线程挂载到就绪队列或定时器超时队列。

  • 栈指针(SP):上下文切换时存储 CPU 寄存器内容。

1.2 就绪队列与优先级调度

就绪队列按优先级分为多个链表,一共有 RT_THREAD_PRIORITY_MAX 个优先级。内核维护一个位掩码(bitmap)记录非空就绪队列:

/* 在 rt_thread_control.c 中 */
rt_uint32_t rt_thread_ready_priority_group;
rt_list_t   rt_thread_ready_table[RT_THREAD_PRIORITY_MAX];
  • 就绪置位:当线程从阻塞态变为就绪态时,设置对应位:

    rt_thread_ready_priority_group |= (1U << priority);
    
  • 寻找最高优先就绪:使用 __CLZ(Count Leading Zeros)指令快速定位最高优先级:

    highest = 31 - __CLZ(rt_thread_ready_priority_group);
    

1.3 时间片与抢占策略

  • 轮询时间片:对于同一优先级多线程,内核采用时间片轮询(Round-Robin)。

  • 抢占触发:每当中断退出或线程进入阻塞,都会调用 rt_schedule()。若发现有更高优先级线程,就立即切换。

void rt_schedule(void)
{/* 关闭中断 */rt_hw_interrupt_disable();/* … 更新就绪表 … *//* 若需要切换,调用 rt_hw_context_switch */rt_hw_context_switch();rt_hw_interrupt_enable();
}

2. 中断管理与上下文切换

2.1 中断入口与中断服务例程

RT-Thread 在中断入口保存少量状态,仅记录中断号与中断嵌套层数。中断处理完成后,根据是否从中断中打断线程,决定是否触发调度。

2.2 PendSV 与 SVC 的协作

对于 ARM Cortex-M,RT-Thread 借助 SVC(Supervisor Call)与 PendSV(Pendable Service Call)实现上下文切换:

  • SVC:在用户代码或系统调用需要切换时触发。

  • PendSV:在中断退出后统一执行上下文切换,避免直接在中断中切换导致栈混乱。

2.3 上下文切换时序图


3. IPC 与同步机制

3.1 信号量(Semaphore)

/* 初始化 */
rt_sem_init(&sem, "mysem", 1, RT_IPC_FLAG_FIFO);
/* 获取 */
rt_sem_take(&sem, RT_WAITING_FOREVER);
/* 释放 */
rt_sem_release(&sem);
  • 支持二值信号量和计数信号量。

  • 可选 FIFO 或优先级等待队列。

3.2 消息队列(Message Queue)

rt_mq_init(&mq, "mqueue", pool_start, msg_size, pool_size, RT_IPC_FLAG_FIFO);
rt_mq_send(&mq, &msg, sizeof(msg));
rt_mq_recv(&mq, &recv_buf, sizeof(recv_buf), RT_WAITING_FOREVER);
  • 内存池:消息放入内核维护的内存池。

  • 超时:可在接收时设置超时时间。

3.3 邮件箱(Mailbox)与事件集(Event Flags)

  • Mailbox:存放单个指针,适合快速消息传递。

  • Event Flags:按位保存事件标志,线程可按模式等待。


4. 内存管理

4.1 内存池(Memory Pool)

rt_mp_init(&mp, "mempool", pool_start, block_size, block_count);
void *blk = rt_mp_alloc(&mp, RT_WAITING_FOREVER);
rt_mp_free(&mp, blk);
  • 固定块大小,分配速度快,无碎片。

  • 可用作 IPC 缓冲区或临时数据存储。

4.2 堆管理与动态分配

RT-Thread 提供多种堆实现 (dlmallcsmallfrymemheap),可选择不同算法平衡速度与内存利用率。

rt_system_heap_init(heap_start, heap_end);
void *p = rt_malloc(64);
rt_free(p);

4.3 内存对齐与最小碎片化

  • 默认 8 字节对齐,可通过 RT_ALIGN_SIZE 宏调整。

  • 堆实现会将小块合并以降低碎片率。


5. 性能与资源开销实测

测试项目数值环境
单次上下文切换耗时~1.5 µsCortex-M4 @ 168MHz
信号量(无竞争)获得+释放~0.8 µs同上
消息队列(16B 消息)发送~2.2 µs同上
内存池分配+释放~0.5 µs同上

测试工具:使用 Segger SystemView 和 DWT 计数器精确测量。


6. 小结与下一步

本文深入剖析了 RT-Thread 内核的线程管理、调度、中断切换、IPC 及内存管理等核心机制,并通过源码片段与时序图加深理解。下一篇将进入 设备驱动与 BSP 实战,带你从裸机到 RT-Thread 驱动框架实战演练。欢迎持续关注!

相关文章:

RT-Thread 深入系列 Part 2:RT-Thread 内核核心机制深度剖析

摘要&#xff1a; 本文从线程管理、调度器原理、中断处理与上下文切换、IPC 同步机制、内存管理五大核心模块出发&#xff0c;深入剖析 RT-Thread 内核实现细节&#xff0c;并辅以源码解读、流程图、时序图与性能数据。 目录 线程管理与调度器原理 1.1 线程控制块&#xff08;T…...

在线caj转换word

CAJ格式是中国知网特有的一种文献格式&#xff0c;在学术研究等领域广泛使用&#xff0c;但有时我们需要将其转换为Word格式&#xff0c;方便编辑、引用文献。本文分享如何轻松将CAJ转换为word的转换工具&#xff0c;提高阅读和办公效率。 如何将CAJ转换WORD? 1、使用CAJ转换…...

25:三大分类器原理

1.分类的逻辑&#xff1b; 2.统计学与数据分析。 ************************ Mlp 多层感知系统 GMM 高斯混合模型-极大似然估计法 SVM 支持向量机建立一个超平面作为决策曲面&#xff0c;使得正例和反例的隔离边界最大化 Knn 1.MLP整个模型就是这样子的&#xff0c;上面…...

数据库插入数据时自动生成创建时间和修改时间

工具 import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component;import java.time.LocalDateTime; Component public class MetaObjectHandlerConfig implements…...

Go语言中 源文件开头的 // +build 注释的用法

// build注释主要用于实现条件编译。借助设置不同的构建标签&#xff08;build tags&#xff09;&#xff0c;我们能够指定在特定的操作系统、架构或者其他自定义条件下才编译某个文件 1、基本规则 格式要求&#xff1a; 这种注释必须出现在文件的开头部分。注释与包声明之间至…...

【从零开始学习微服务 | 第一篇】单体项目到微服务拆分实践

目录 引言 一、选择聚合结构进行拆分的优势 二、微服务模块创建步骤 &#xff08;一&#xff09;引入 pom 文件与修改 &#xff08;二&#xff09;创建 Spring Boot 启动类 &#xff08;三&#xff09;搭建基本包结构 三、配置文件的引入与调整 四、业务代码的引入与注意…...

【高并发】Celery + Redis异步任务队列方案提高OCR任务时的并发

线程池处理OCR仍然会阻塞请求的原因主要有以下几点&#xff0c;以及为什么CeleryRedis是更好的解决方案&#xff1a; 1. 线程池的阻塞本质 请求-响应周期未分离&#xff1a;即使使用线程池&#xff0c;HTTP请求仍需要等待线程池任务完成才能返回响应。当所有线程都繁忙时&#…...

2025数维杯数学建模竞赛B题完整参考论文(共38页)(含模型、代码、数据)

2025数维杯数学建模竞赛B题完整参考论文 目录 摘要 一、问题重述 二、问题分析 三、模型假设 四、定义与符号说明 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.2问题2…...

C#黑魔法:鸭子类型(Duck Typing)

C#黑魔法&#xff1a;鸭子类型(Duck Typing) 如果它走起路来像鸭子&#xff0c;叫起来像鸭子&#xff0c;那么它就是鸭子。 鸭子类型&#xff0c;主要应用于动态语言类型&#xff0c;比如JS、Python等&#xff0c;核心理念为&#xff1a;关注对象的行为&#xff08;方法或属性…...

AI数据分析中的伪需求场景:现状、挑战与突破路径

在当今企业数字化转型浪潮中&#xff0c;AI数据分析产品如雨后春笋般涌现&#xff0c;但其中存在大量"伪需求场景"——看似创新实则难以落地的功能设计。本文将从技术限制、用户体验和商业价值三个维度&#xff0c;系统分析AI数据分析产品中常见的伪场景现象&#xf…...

大尺寸PCB如何重塑通信与新能源产业格局

在5G通信基站与新能源电站的机房内&#xff0c;一块块面积超过600mm600mm的PCB板正悄然推动着技术革命。作为电子设备的核心载体&#xff0c;大尺寸PCB凭借其高密度集成与复杂工艺&#xff0c;成为通信、能源等领域的“隐形功臣”。以猎板PCB为代表的厂商&#xff0c;凭借宽幅曝…...

base64与图片的转换和预览(高阶玩法)

1.完整的功能描述 功能概述 这是一个网页工具&#xff0c;支持用户输入不同格式的图片数据或上传本地图片文件&#xff0c;对图片进行预览、转换为多种格式&#xff0c;并支持导出不同格式的图片数据。 输入方式 1. 文本输入 &#xff1a;用户可以输入 Data URL、公网图片 UR…...

AI客服问答自动生成文章(基于deepseek实现)

小编一直在用AI做网站平台文章的润色或者二创。一直有一个想法&#xff0c;在自己网站加一个AI智能客服&#xff0c;通过文心或者deepseek来智能回答网友提出的问题&#xff0c;这样就能减少很多人工回复的麻烦&#xff0c;提高互动效率。 开发背景 其实很多网友提出的问题非…...

Langchain、RAG、Agent相关

ChatBot-销售型机器人 优化点&#xff1a;把相似度低于10条的请求Query打印出来。 RAG 类型&#xff1a;RAG、Latent RAG&#xff08;产生一个回答&#xff0c;再用回答进行召回&#xff09;、Logit RAG、Speculative RAG 个人感觉RAG召回可以分成3种&#xff1a;一种是que…...

Spring Web MVC基础理论和使用

目录 什么是MVC 什么是SpringMVC SpringMVC基础使用 建立连接 RequestMapping介绍 请求 传递参数 传递对象 参数重命名 传递数组 传递JSON数据 获取URL中参数 上传文件 获取Cookie/Session 获取Header 响应 返回静态页面 RestController和Controller的区别 返…...

课程审核流程揭秘:确保内容合规与用户体验

业务流程 为什么课程审核通过才可以发布呢&#xff1f; 这样做为了防止课程信息有违规情况&#xff0c;课程信息不完善对网站用户体验也不好&#xff0c;课程审核不仅起到监督作用&#xff0c;也是 帮助教学机构规范使用平台的手段。 如果流程复杂用工作流 说明如下&#xff…...

Mac电脑,idea突然文件都展示成了文本格式,导致ts,tsx文件都不能正常加载或提示异常,解决方案详细说明如下

有一天使用clean my mac软件清理电脑 突然发现idea出现了文件都以文本格式展示&#xff0c;如图所示 然后就卸载&#xff0c;计划重新安装&#xff0c;安装了好几个版本&#xff0c;并且setting->file types怎么设置都展示不对&#xff0c;考虑是否idea没卸载干净&#xff…...

HarmonyOS开发-组件市场

1. HarmonyOS开发-组件市场 HarmonyOS NEXT开源组件市场是一个独立的插件&#xff0c;需通过DevEco Studio进行安装&#xff0c;可以点击下载&#xff0c;无需解压&#xff0c;直接通过zip进行安装&#xff0c;具体安装和使用方法可参考HarmonyOsNEXT组件市场使用说明。Harmony…...

【Python 列表(List)】

Python 中的列表&#xff08;List&#xff09;是最常用、最灵活的有序数据集合&#xff0c;支持动态增删改查操作。以下是列表的核心知识点&#xff1a; 一、基础特性 有序性&#xff1a;元素按插入顺序存储可变性&#xff1a;支持增删改操作允许重复&#xff1a;可存储重复元…...

vison transformer vit 论文阅读

An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词&#xff1a;用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…...

图像移动图像归类代码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 图像移动图像归类代码 import os import shutilvalue_dir rJ:\IDM_data\cls_chinese_medicine\cls_chinese_medicine\traintrain_dir rJ:\IDM_data\cls_chinese_medicine\c…...

Day 15 训练

Day 15 对鸢尾花数据集进行处理&#xff0c;特征可视化&#xff0c;贝叶斯优化随机森林&#xff0c;Shap解释1. 导入必要的库2. 设置中文字体3. 加载数据集4. 查看数据5. 数据准备6. 贝叶斯优化随机森林7. 评估结果8. 绘制箱形图9. 绘制特征相关性热力图10. SHAP模型解释总结 对…...

Vue Router 3 使用详解:从零构建嵌套路由页面

Vue Router 是 Vue.js 官方的路由管理器&#xff0c;常用于构建单页面应用&#xff08;SPA&#xff09;。本文将手把手带你完成 vue-router3.6.5 的基本配置&#xff0c;并实现一个带有嵌套路由的页面结构。本文适用于 Vue 2.x 项目 一、安装 vue-router3.6.5 npm install vue…...

物理服务器紧急救援:CentOS系统密码重置全流程实战指南

前言 在企业IT运维实践中&#xff0c;物理服务器密码丢失是典型的"低概率高风险"事件。某金融科技公司曾因核心服务器密码遗失导致业务中断36小时&#xff0c;直接损失超过800万元。这起真实案例揭示了系统密码管理的关键性——当承载重要业务的物理服务器遭遇密码丢…...

第J7周:对于ResNeXt-50算法的思考

目录 思考 一、代码功能分析 1. 构建 shortcut 分支&#xff08;残差连接的旁路&#xff09; 2. 主路径的第一层卷积&#xff08;11&#xff09; 4. 主路径的第三层卷积&#xff08;11&#xff09; 5. 残差连接 激活函数 二、问题分析总结&#xff1a;残差结构中通道数不一致的…...

华为云短信接入实现示例

1&#xff09;构建Springboot项目 2) 添加依赖 <dependency><groupId>com.huawei.apigateway</groupId><artifactId>java-sdk-core</artifactId><version>3.2.4</version> </dependency> 3) 配置文件 huaweiyun:sms:url:…...

Linux系统下使用Kafka和Zookeeper

Apache Kafka 是一个分布式流处理平台,最初由 LinkedIn 开发,后来成为 Apache 软件基金会的顶级项目。它具有高吞吐量、可扩展性、持久性、容错性等特点,主要用于处理实时数据流。 Linux系统下使用Kafka 1.安装 Java Kafka 和 Zookeeper 都是基于 Java 开发的,所以需要先…...

Unity按钮事件冒泡

今天unity写程序时&#xff0c;我做了一个透明按钮&#xff0c;没图片&#xff0c;只绑了点击事件&#xff0c;把子对象文字组件也删了&#xff0c;空留一个透明按钮&#xff0c;此时运行时点击按钮是没有反应的&#xff0c;网上的教程说必须指定target graphic&#xff08;目标…...

指令图像编辑模型:ICEdit-MoE-LoRA

ICEdit-MoE-LoRA 一、研究背景与目标 In-Context Edit 是一种新颖的基于指令的图像编辑方法&#xff0c;旨在实现与现有最佳方法相当甚至更优的编辑效果。传统图像编辑技术在处理复杂指令时存在一定局限性&#xff0c;尤其是在多轮编辑任务中&#xff0c;结果的准确性和连贯性…...

第十六届蓝桥杯 2025 C/C++B组第一轮省赛 全部题解(未完结)

目录 前言&#xff1a; 试题A&#xff1a;移动距离 试题C&#xff1a;可分解的正整数 试题D&#xff1a;产值调整 试题E&#xff1a;画展布置 前言&#xff1a; 我参加的是第一轮省赛&#xff0c;说实话第一次参加还是比较紧张的&#xff0c;真到考场上看啥都想打暴力&…...