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

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

3天内不再提示

RT-Thread内核对象管理器设计思路

璟琰乀 来源:嵌入式资讯精选 作者:嵌入式资讯精选 2020-11-04 18:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

[导读] 前面写了些文章分享C语言面向对象设计的一些个人体会,个人认为RT-Thread内核对于面向对象实现思想是一个非常好的设计。向这些在基础软件上深耕的国人大牛们致敬。本文基于学习RT-Thread内核设计的初衷,来分享一下个人对于其内核对象子系统设计的理解与体会。在此,也给各位RT-Thread原创大牛们打call,分享本文也期望有更多的盆友去学习并使用RT_Thread。

RT-Tread内核架构RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。其内核架构如下图所示:

RT-Thread 内核及底层结构

对于各部分的功能,这里不做展开描述。RT-Tread内核吸引我的方面:

代码优雅、可读性非常高

体积小巧、代码类Linux风格,可裁剪

社区活跃,国人自主开发,用户越来越多

优秀的设计,对于面向对象设计思想可以说是非常优秀的实践

主要定位于物联网应用,各种组件丰富,融合的也很好

所以如果是RTOS应用或者开发从业者,面对这么优秀且比较容易深入学习的内核,如果不去好好读读,实在有点可惜。要去体会RT-Thread对象设计思想,从其对内核对象object的管理入手,不失为一个非常好的切入点。

什么是RT-Thread内核对象管理?RT-Thread 采用内核对象管理系统来访问 / 管理所有内核对象,内核对象包含了内核中绝大部分设施,这些内核对象既可以是静态分配的静态对象,也可以是从系统内存堆中分配的动态对象。通过这种内核对象的设计方式,RT-Thread 做到了不依赖于具体的内存分配方式,系统的灵活性得到极大的提高。

RT-Thread 内核对象包括:线程,信号量,互斥量,事件,邮箱,消息队列和定时器,内存池,设备驱动等。对象容器中包含了每类内核对象的信息,包括对象类型,大小等。对象容器给每类内核对象分配了一个链表,所有的内核对象都被链接到该链表上,如图 RT-Thread 的内核对象容器及链表如下图所示:

RT-Thread 的内核对象容器及链表

这个集中管理的内核对象容器在内存的开销方面代价很小,但却具有高度的灵活性,从设计的角度看其代码也非常利于扩展,增加新的内核对象类别,以及对于相应的内核对象功能的裁剪适配。

内核对象主要干什么?RT-Thread内核对象子系统其主体实现代码为object.c,本文尝试从整体到局部来尝试解读其设计思想。object.c这个子系统从外部以黑盒的角度看,就个人理解主要实现了这样些用例需求:

所以个人理解内核对象管理器,主要是为其他内核功能模块提供数据管理支撑,属于内核底层支持功能组件,并从设计上兼顾了可扩展、可裁剪的需求。

怎么实现的呢?RT-Thread内核对象子系统其主要核心数据结构如下:

其中rt_object_class_type枚举定义内核对象类别:

enum rt_object_class_type{ RT_Object_Class_Null = 0, /* 未使用 */ RT_Object_Class_Thread, /* thread对象 */ RT_Object_Class_Semaphore, /* semaphore对象 */ RT_Object_Class_Mutex, /* mutex对象 */ RT_Object_Class_Event, /* event对象 */ RT_Object_Class_MailBox, /* mail box对象 */ RT_Object_Class_MessageQueue, /* message queue */ RT_Object_Class_MemHeap, /* memory heap */ RT_Object_Class_MemPool, /* memory pool */ RT_Object_Class_Device, /* device对象 */ RT_Object_Class_Timer, /* timer对象 */ RT_Object_Class_Module, /* module */ RT_Object_Class_Unknown, /* unknown */ RT_Object_Class_Static = 0x80 /*8位类型变量高位置1表示静态对象 */};

而rt_object_information则抽象了对象类型,加入了一个双向链表指针数据域rt_list_node,从而将同类别的内核对象利用该双链指针链接起来,这些同类别的内核对象具有如下可能的特点:

可能在软件运行时生成,也可能在os初始化创建。

其存储类型可能为静态类型,也可能为动态类型(所谓动态类型这里是确指在内核堆上动态申请的内存区域用于存储相应的内核对象)。

在内存空间中,其位置并不连续。

如此以来,将这些内核对象在空间上不连续的变量,利用链表形成了可统一管理、可增可删、可检索的逻辑结构。

而rt_object_container内核容器,其本质是一个内核对象索引表,主要集中管理了下面的信息:

enum rt_object_class_type type:内核对象类别,每项表记录条目的类别

rt_list_t object_list:每类对象链表的头结点的链表指针数据域

rt_size_t object_size:该类个体的大小

利用宏将相应的链表进行选编译,在内核关键数据进行了裁剪管理。而对于内核本身的扩展性而言,如果需要增加新的内核功能,可以方便的增加新的内核对象类,并能方便的加入到这个内核对象容器中,利用公共的对外接口,实现统一管理,而不必对数据管理层进行额外的接口设计。

实现了哪些对外接口呢?有了这样一个优雅的数据结构设计,那么基于这样一个数据结构设计,相应就很容易实现其内核对象集中管理的对外服务接口,那么其主要的服务接口有哪些呢?

其中一部分主要接口实现对象的增加删除检索等,这里以rt_object_init接口为例,来简要分析一下其实现:

void rt_object_init(struct rt_object *object, enum rt_object_class_type type, const char *name){ register rt_base_t temp; struct rt_list_node *node = RT_NULL; struct rt_object_information *information;#ifdef RT_USING_MODULE struct rt_dlmodule *module = dlmodule_self();#endif /*1. 在容器中找到这是什么对象类*/ information = rt_object_get_information(type); RT_ASSERT(information != RT_NULL); /* check object type to avoid re-initialization */ /* 进入临界区保护 */ rt_enter_critical(); /* try to find object */ for (node = information-》object_list.next; node != &(information-》object_list); node = node-》next) { struct rt_object *obj; obj = rt_list_entry(node, struct rt_object, list); if (obj) /* skip warning when disable debug */ { RT_ASSERT(obj != object); } } /* 离开临界区 */ rt_exit_critical(); /* 初始化对象参数,并置为静态标记 */ object-》type = type | RT_Object_Class_Static; rt_strncpy(object-》name, name, RT_NAME_MAX); RT_OBJECT_HOOK_CALL(rt_object_attach_hook, (object)); /* 禁止硬件中断 */ temp = rt_hw_interrupt_disable();#ifdef RT_USING_MODULE if (module) { rt_list_insert_after(&(module-》object_list), &(object-》list)); object-》module_id = (void *)module; } else#endif { /* 对象插入容器中相应对象分支链连 */ rt_list_insert_after(&(information-》object_list), &(object-》list)); } /* 开硬件中断 */ rt_hw_interrupt_enable(temp);}

对于内核对象增加删除其主要就是利用内核容器首先检索到链表头结点,然后再进一步做双向链表的基本操作,这里对于具体如何操作链表就不做展开赘述了。

对于内核对象相关数据域的检索、查询有了明确的数据结构,以及能检索到结点链表指针,由于结点链表指针与相应内核对象各数据域具有确定的相对位置关系,所以检索而言是非常易于实现的。

而对于动态内核对象而言,其差异在于内核对象本身是动态申请的,这里需要注意的是向内核堆申请的,而不是C堆申请的,至于什么是内核堆,以及为什么要设计内核堆,之前有写过一篇文章分享,有兴趣可以去看看。

内核对象有什么相互继承关系?RT-Thread管网上给出了这样一个相互关系图:

RT-Thread 内核对象继承关系

如果不去具体看相应数据结构,或许不易理解为啥有这样一张图。这里以上图中其中几个内核对象来***其相互关系:

或许有盆友会问,为啥rt_thread对象中明明没有直接包含rt_object,那为啥说rt_thread也是继承自rt_object呢?如果你细看看上图rt_thread中红框框出来的数据域就恍然大悟了,即便没有直接包含,但在内存中框里的内容就是rt_object的数据内容,所以利用指针转换就可以方便访问了,至于为什么是这样?我想可能是历史原因吧?所以rt_thread结构体前面几个数据域的位置是不可以修改的。这里还有盆友可能会问为什么ipc线程通信相关内核对象需要单独拎出来一个父结构体呢?我想应该是此类具有相同的一些共性,具有一些类似的特点。这也是对象设计提取共性进而抽象封装的一个体现。

总结一下本文大致学习总结了一下RT-Thread内核对象子系统的设计思路的理解,从这里个人总结了一些启示:

软件是数据结构+算法,而良好的数据结构设计是优雅算法的基础,所以在工程开发中,如何设计好的数据结构抽象是一个可以深入挖掘的话题

RT-Thread的内核对象设计个人认为非常易于理解,也是一个最佳实践。如有兴趣可以细细体会,多多揣摩。

责任编辑:haq

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

    关注

    4

    文章

    1436

    浏览量

    42495
  • 管理器
    +关注

    关注

    0

    文章

    264

    浏览量

    19443
  • RT-Thread
    +关注

    关注

    32

    文章

    1541

    浏览量

    44293
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RT-Thread Studio V2.3.0 版本正式发布!

    支持针对rt-thread版本号大于5.1.0时使用Env2.0.0高版本2新增支持卸载studio时选择是否保留已下载的SDK资源包文件3修复SDK管理器选择了版
    的头像 发表于 11-29 09:29 726次阅读
    <b class='flag-5'>RT-Thread</b> Studio V2.3.0 版本正式发布!

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 500次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    【CPKCOR-RA8D1】5、运行RT-THREAD的适应性调整

    CPKCOR-RA8D1B开发板不能直接使用,必须进行适应性调整。 一、安装env-windows RT-Thread Env 工具包括配置和包管理器,用来对内核和组件的功能进行配置
    发表于 10-27 14:49

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1144次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式启动!

    rt-thread studio v2.2.7 SDK管理器无法下载怎么解决?

    使用rt-thread studio v2.2.7中sdk管理器下载包时,资源下载源已切换到gitee,但是下载时仍使用github源。 rt-thread 包还不支持导入功能,哎!!!!!
    发表于 09-16 08:08

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以为修改index_all.json,发现联网的时候,会自动覆盖 另lastet版本
    发表于 09-16 06:06

    Windows上使用ENV工具开发基于先楫MCU的RT-Thread应用

    前言Env是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的menuconfig提供了简单易用的配置剪裁
    的头像 发表于 08-29 12:22 957次阅读
    Windows上使用ENV工具开发基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用

    在Ubuntu上开发基于先楫MCU的RT-Thread应用指南

    1、前言RT-ThreadEnv是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的menu
    的头像 发表于 08-29 12:22 1239次阅读
    在Ubuntu上开发基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用指南

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统的RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微控制的核心
    的头像 发表于 08-24 10:05 693次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    老师的推荐,很快我们就被其极高的安全特性,强大的包管理系统和编译以及丰富的社区支持所折服。然后我们在调研时注意到了RT-Thread。它有着经典的操作系统架构,
    的头像 发表于 08-02 11:03 3210次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全<b class='flag-5'>内核</b> RusT-<b class='flag-5'>Thread</b> 的诞生

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2433次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    RT-Thread BSP全面支持玄铁全系列RISC-V 处理 | 技术集结

    RT-Thread标准版已全面适配玄铁E、R、C系列内核,并在C906内核上支持RT-Smart微内核操作系统。本文将以E906运行
    的头像 发表于 07-03 18:03 2651次阅读
    <b class='flag-5'>RT-Thread</b> BSP全面支持玄铁全系列RISC-V 处理<b class='flag-5'>器</b> | 技术集结

    揭秘RT-Thread上的AUTOSAR CP系统

    本文探讨了RT-Thread与AUTOSARCP的融合,解决车载ECU开发中实时性、安全性与灵活性的平衡问题。通过分层安全内核rt-safetyos/autoos)和工具链整合,兼容AUTOSAR
    的头像 发表于 06-23 20:22 2950次阅读
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系统

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1068次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2440次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上