0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread内部机制大揭秘,带你深入操作系统内核

朱老师物联网大讲堂 2024-08-01 08:11 次阅读

一、RT-Thread概述

8877d086-4f9a-11ef-817b-92fbcf53809c.png

RT-Thread 是一款具有显著优势的开源嵌入式实时操作系统。它不仅具备轻量级、实时性强的特点,还拥有广泛的开源社区支持和丰富的应用场景。

在轻量级方面,RT-Thread 能够适应资源受限的嵌入式环境,通过高效的内核设计和资源管理,为设备节省宝贵的系统资源。其小巧的内核可以在极小的存储空间中运行,为小型设备提供了可靠的操作系统选择。

实时性是 RT-Thread 的核心优势之一。它具备快速的任务响应能力和精确的时间控制,能够满足对时间敏感的应用需求,如工业控制、航空航天等领域。

RT-Thread 的开源特性促进了其快速发展和广泛应用。众多开发者能够参与到其代码贡献和改进中,不断丰富其功能和优化性能。

嵌入式系统领域,RT-Thread 得到了广泛的应用。从智能家居中的智能家电控制,到工业自动化中的生产流程监控,再到汽车电子中的车载系统,都能看到它的身影。其强大的功能和良好的适应性,使得各类嵌入式设备能够稳定、高效地运行。

总之,RT-Thread 以其开源、轻量级和实时性等特点,在嵌入式系统领域发挥着重要作用,为开发者提供了可靠、高效的操作系统解决方案。

二、RT-Thread启动流程

系统上电后,首先从启动文件开始运行。启动文件通常会完成一些基础的硬件设置,如初始化时钟、配置中断向量表以及初始化堆栈等。

接着,程序跳转至 RT-Thread 的入口函数 rtthread_startup 。在这个函数中,一系列重要的初始化工作依次展开。

首先是硬件初始化,包括设置系统时钟、初始化相关外设等,为后续的系统运行提供硬件基础。

然后是系统内核对象的创建,如定时器、调度器等。这些内核对象的创建为系统的任务调度和时间管理提供了支持。

接下来创建 main 线程,同时会对线程栈进行初始化。main 线程通常承担着用户应用程序的主要逻辑。

在 rtthread_startup 函数中,还会进行定时器和调度器的初始化。定时器初始化确保系统能够进行精确的定时操作,调度器初始化则为任务的合理分配和切换奠定基础。

在完成这些初始化工作后,系统准备就绪,等待调度器启动,从而开启系统的正常运行和任务调度。

总的来说,RT-Thread 的启动流程严谨有序,通过逐步完成各项初始化工作,为系统的稳定运行和高效任务处理提供了有力保障。

三、程序内存分布

Code(代码段):Code 段存放程序的代码部分。在编译时确定其大小,运行时其内容不发生改变。在程序编译时,代码段占用一定的 Flash 空间,运行时 CPU 从 Flash 中读取执行代码。

RO-data(只读数据段):RO-data 段用于存放程序中定义的常量,如字符串常量等。这些数据在编译时确定,且在运行时不可更改,位于 Flash 中。RO-data 段在编译时占用 Flash 空间。

RW-data(读写数据段):RW-data 段存放初始化为非 0 值的全局变量。在编译时,其占用一定的 Flash 空间;在运行时,由于其中的数据需要读写操作,所以 RW-data 中的数据会被从 Flash 搬运到 RAM 中。

ZI-data(0 数据段):ZI-data 段存放未初始化或初始化为 0 的全局变量。ZI-data 段在编译时不占用 Flash 空间,在运行时根据编译器给出的 ZI 地址和大小在 RAM 中分配空间,并将其清零。

总的来说,在编译时,RO Size 包括 Code 及 RO-data,表示程序占用 Flash 空间的大小;RW Size 包括 RW-data 及 ZI-data,表示运行时占用的 RAM 大小;ROM Size 包括 Code、RO Data 以及 RW Data,表示烧写程序所占用的 Flash 空间大小。程序运行时,CPU 从 Flash 读取 Code 段和 RO-data 段的内容,从 RAM 读写 RW-data 段和 ZI-data 段的数据。

四、自动初始化机制

RT-Thread 的自动初始化机制通过巧妙的宏定义方式实现。在函数定义处使用特定的宏声明初始化函数,这些函数会在系统启动过程中自动被执行,无需手动调用。

INIT_BOARD_EXPORT 主要用于非常早期的初始化,例如芯片相关硬件的初始化,此时调度器还未启动。它适用于那些在系统启动极早期就必须完成的关键硬件初始化操作。

INIT_PREV_EXPORT 用于纯软件的初始化,通常是没有太多依赖的函数。比如一些简单的软件配置或早期的软件模块初始化。

INIT_DEVICE_EXPORT 针对外设驱动的初始化,如网卡设备等。在需要对外设进行初始化以便后续系统正常使用时使用。

INIT_COMPONENT_EXPORT 主要用于组件的初始化,像文件系统或者 LWIP 等组件的初始化就可通过此宏。

INIT_ENV_EXPORT 用于系统环境的初始化,比如挂载文件系统等操作。

INIT_APP_EXPORT 则用于应用的初始化,比如 GUI 应用等。

通过这些不同类型的自动初始化接口,开发者能够根据具体的初始化需求,将函数放置在合适的初始化阶段,确保系统在启动过程中有序、高效地完成各项初始化工作,提高了开发效率和系统的稳定性。

五、内核对象模型

RT-Thread 的内核对象丰富多样,包括线程、信号量、邮箱、消息队列、内存池等。

线程:是 RT-Thread 中最基本的调度单位,描述了任务执行的上下文关系和优先等级。线程控制块存储了线程的关键信息,如优先级、状态、栈地址等。

信号量:用于解决线程间的同步和互斥问题。通过信号量的计数值来控制资源的访问,当计数值为 0 时,申请资源的线程会被阻塞。

邮箱:实现线程间的消息传递,能够存储一定量的消息数据。

消息队列:可以存储多个消息,支持不同线程之间的异步通信

内存池:用于高效地管理内存分配和释放,提高内存使用效率。

内核对象管理框架通过链表来管理各类对象。每个内核对象类型都有对应的链表,对象通过链表节点进行连接。例如,线程对象通过线程链表进行管理。

对象的派生和继承关系带来了显著的优势。一方面,提高了系统的可重用性和扩展性。新的对象类别可以在继承通用属性的基础上进行少量扩展即可创建,降低了开发难度。另一方面,提供了统一的对象操作方式,简化了具体对象的操作流程,提高了系统的可靠性和稳定性。例如,线程控制块在继承通用对象结构的基础上,增加了线程特有的属性,使得线程管理更加精准和高效。

六、线程管理

6.1 多线程的基本概念与 RT-Thread 中的实现

在操作系统中,多线程是将一个大型任务分解为多个可独立执行的小任务,从而提高系统的并发处理能力。在 RT-Thread 中,通过线程控制块来管理线程,每个线程都有自己的执行环境和优先级。线程之间可以通过共享资源和通信机制进行协作。

6.2 线程的相关属性

线程栈:RT-Thread 中线程具有独立的栈,用于存储线程运行时的局部变量和上下文信息。线程切换时,上下文会保存到栈中,恢复运行时再从栈中读取。

线程状态:线程存在初始、就绪、运行、挂起和关闭这五种状态。初始状态表示线程刚创建未运行;就绪状态意味着线程准备好等待被调度执行;运行状态表示线程正在占用 CPU 执行;挂起状态通常是由于资源不可用或主动延时导致线程暂时不参与调度;关闭状态则表示线程已结束。

线程优先级:RT-Thread 支持最多 256 个优先级,数值越小优先级越高,0 为最高优先级。可根据实际需求为不同线程设置优先级,以决定线程被调度的先后顺序。

时间片:时间片仅对相同优先级的就绪态线程有效。它决定了同一优先级线程每次被调度执行的时长,影响系统的响应性和任务切换频率。

6.3 系统线程

空闲线程:空闲线程是系统中优先级最低的线程,其状态永远为就绪态。当系统中无其他就绪线程时,调度器会调度空闲线程。它通常是一个死循环,用于执行一些后台任务,如资源回收、功耗管理等。

主线程:在系统启动时创建,入口函数为 main_thread_entry 。用户的应用入口函数 main 从这里开始,用户可在 main 函数中添加应用程序的初始化代码。

6.4 线程调度的相关API

启动:通过 rt_thread_startup 函数将创建或初始化后的线程调入相应优先级的就绪队列,等待被调度执行。

获取当前:使用 rt_thread_self 函数可以获取当前正在执行的线程句柄。

让出资源:rt_thread_yield 函数使当前线程让出 CPU 资源,相同优先级的其他线程将被执行。

睡眠:rt_thread_sleep 、 rt_thread_delay 和 rt_thread_mdelay 等函数可使当前线程挂起指定时间,时间结束后线程重新进入就绪状态。

挂起和恢复:rt_thread_suspend 函数挂起线程, rt_thread_resume 函数恢复被挂起的线程。

控制:rt_thread_control 函数可用于动态更改线程的优先级等属性。

七、时钟管理

7.1 时钟节拍的概念和作用

时钟节拍(OS Tick)是 RT-Thread 操作系统的最小时间单位,它就如同系统的心跳,为系统处理各种与时间相关的事件提供了基准。在 RT-Thread 中,时钟节拍被广泛应用于线程延时、时间片轮转以及定时器超时等方面。

在线程延时方面,通过时钟节拍来精确控制线程暂停的时间,确保线程按照预定的时间间隔执行。

对于时间片轮转调度,时钟节拍用于确定每个线程占用 CPU 的时间片长度,实现线程之间的公平轮转执行,提高系统的并发处理能力。

而在定时器超时方面,时钟节拍的作用至关重要。当定时器设定的时间达到对应的时钟节拍数时,就会触发超时操作,执行相应的回调函数。

7.2 时钟节拍的实现原理

RT-Thread 中时钟节拍的实现依赖于硬件定时器的触发。通常,系统会配置一个硬件定时器为中断触发模式,比如对于 Cortex-M 芯片来说,常用的是滴答定时器 Systick。

当中断产生时,会调用一系列函数进行计数和处理。在中断服务函数中,会执行关键的操作。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5042

    文章

    18795

    浏览量

    298255
  • 内核
    +关注

    关注

    3

    文章

    1336

    浏览量

    40075
  • 操作系统
    +关注

    关注

    37

    文章

    6542

    浏览量

    122716
  • RT-Thread
    +关注

    关注

    31

    文章

    1237

    浏览量

    39403
收藏 人收藏

    评论

    相关推荐

    如何对RT-Thread内核有基本的了解?

    RT-Thread 的时钟管理以时钟节拍为基础,时钟节拍是 RT-Thread 操作系统中最小的时钟单位。
    的头像 发表于 07-19 10:12 7025次阅读
     如何对<b class='flag-5'>RT-Thread</b><b class='flag-5'>内核</b>有基本的了解?

    一文读懂RT-Thread操作系统的邮箱机制

    RT-Thread操作系统的邮箱有何作用?RT-Thread操作系统的邮箱机制管理数据结构是怎样的?
    发表于 02-28 08:10

    基于RT-Thread操作系统衍生rt-smart实时操作系统简介

    ,例如 ARM Cortex-A 系列芯片,MIPS 芯片,带 MMU 的 RISC-V 芯片等。rt-smart 在 RT-Thread 操作系统的基础上启用独立、完整的进程方式,同时以混合微
    发表于 06-22 17:56

    RT-Thread操作系统有哪些优势?

    RT-thread是一个轻量级的操作系统,很小,但是也是一个操作系统。主要优势有这些: 跨芯片平台:支持所有主流微控制器,解决设备碎片化问题。 实时操作系统
    发表于 06-28 08:16

    RT-Thread编程指南

    RT-Thread编程指南——RT-Thread开发组(2015-03-31)。RT-Thread做为国内有较大影响力的开源实时操作系统,本文是RT
    发表于 11-26 16:06 0次下载

    RT-Thread Smart微内核操作系统发布!

    9月1日,由上海睿赛德电子科技有限公司举办的RT-Thread Smart微内核操作系统发布会于北京圆满落幕,发布会以见微为主题,邀请到中国工程院院士、产业专家、高校教授及行业从业人员100余位莅临
    的头像 发表于 09-09 10:49 2583次阅读

    国民技术携手RT-Thread共同推进MCU与RT-Thread操作系统广泛适配

    日前,国民技术股份有限公司与知名物联网操作系统厂商睿赛德科技(RT-Thread)签署会员合作协议,正式成为RT-Thread高级会员。国民技术将基于通用MCU和RT-Thread物联
    的头像 发表于 12-16 09:56 2259次阅读

    RT-Thread 内核学习笔记 - 内核对象链表结构深入理解

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记 -
    发表于 01-25 18:23 6次下载
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>内核</b>学习笔记 - <b class='flag-5'>内核</b>对象链表结构<b class='flag-5'>深入</b>理解

    RT-Thread 内核学习笔记 - 内核对象操作API

    RT-Thread 内核学习笔记 - 内核对象rt_objectRT-Thread 内核学习笔记 -
    发表于 01-25 18:26 7次下载
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>内核</b>学习笔记 - <b class='flag-5'>内核</b>对象<b class='flag-5'>操作</b>API

    RT-Thread实时操作系统安装向导

    RT-Thread 是一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体的技术平台,由熊谱翔先生带领并集合开源社区力量开发而成,RT-Thread 也是一个组件完整丰富、
    发表于 04-02 09:43 7次下载

    大佬带你理解RT-Thread内核并上手实践

    内核操作系统最重要的部分,学习RT-Thread也是从最基本的内核开始。   RT-Thread内核
    发表于 06-30 17:10 1151次阅读

    RT-Thread操作系统的FreeRTOS兼容层

    的兼容项目中。 1 概述 这是一个针对RT-Thread国产操作系统的FreeRTOS操作系统兼容层,可以让原有基于FreeRTOS操作系统的项目快速、无感地迁移到
    的头像 发表于 01-14 00:55 1455次阅读

    如何深入理解RT-Thread内核并上手实践,看完这篇有答案了!

    内核操作系统最重要的部分,学习RT-Thread也是从最基本的内核开始。RT-Thread内核
    的头像 发表于 06-27 09:36 2127次阅读
    如何<b class='flag-5'>深入</b>理解<b class='flag-5'>RT-Thread</b><b class='flag-5'>内核</b>并上手实践,看完这篇有答案了!

    新书发布——《实时操作系统应用技术:RT-Thread与ARM编程实践》

    ——王宜怀的教授继《嵌入式实时操作系统——基于RT-Thread的EAI&IoT系统开发》之后的又一力作,不仅内容丰富实用,而且讲解方式深入浅出,适合不同层次的学习
    的头像 发表于 05-11 08:35 512次阅读
    新书发布——《实时<b class='flag-5'>操作系统</b>应用技术:<b class='flag-5'>RT-Thread</b>与ARM编程实践》

    新书发布——《RT-Thread嵌入式实时操作系统内核、驱动和应用开发技术》

    我们非常高兴地宣布,由郑苗秀、沈鸿飞和廖建尚编著的《RT-Thread嵌入式实时操作系统内核、驱动和应用开发技术》一书正式发布。本书的编写团队由多位在嵌入式和实时操作系统领域有着丰富经
    的头像 发表于 09-03 08:06 151次阅读
    新书发布——《<b class='flag-5'>RT-Thread</b>嵌入式实时<b class='flag-5'>操作系统</b><b class='flag-5'>内核</b>、驱动和应用开发技术》