RT-Thread 内核对象管理框架

内核对象管理框架

RT-Thread采用内核对象管理系统来访问/管理所有内核对象,内核对象包含了内核中绝大部分设施,这些内核对象可以是静态分配的静态对象,也可以是从系统内存堆中分配的动态对象。

RT-Thread内核对象包括:线程,信号量,互斥量,事件等。
对象容器中包含了每类内核对象的信息,包括对象类型,大小等。
对象容器给每类内核对象分配了一个链表,所有的内核对象都被链接到该链表上。
在这里插入图片描述
在这里插入图片描述
RT-Thread中各类内核对象的派生和继承关系。
对于每一种具体内核对象和对象控制块,除了基本结构外,还有自己的扩展属性(私有属性)。
例如,对于线程控制块,在基类对象基础上进行扩展,增加了线程状态、优先级等属性。
这些属性在基类对象的操作中不会用到,只有在与具体线程相关的操作中才会使用。

因此,从面向对象的观点,可以认为每一种具体对象是抽象对象的派生,继承了基本对象的属性并在此基础上扩展了自己相关的属性。

在对象管理模块中,定义了通用的数据结构,用来保存各种对象的共同属性,各种具体对象只需要在此基础上加上自己的某些特别的属性,就可以清楚的表示自己的特征。

这种设计方法的优点有:

  1. 提高了系统的可重用性和扩展性,增加新的对象类别很容易,只需要继承通用对象的属性再加少量扩展即可。
  2. 提供统一的对象操作方式,简化了各种具体对象的操作,提高了系统的可靠性。

上图中由对象控制块 rt_object 派生出来的有:线程对象、内存池对象、定时器对象、设备对象和 IPC 对象(IPC:Inter-Process Communication,进程间通信。在 RT-Thread 实时操作系统中,IPC 对象的作用是进行线程间同步与通信);由 IPC 对象派生出信号量、互斥量、事件、邮箱与消息队列、信号等对象。

对象控制块

内核对象控制块的数据结构:

struct rt_object
{char name[RT_NAME_MAX];rt_uint8_t type;rt_uint8_t flag;rt_list_t list;
};

目前内核对象支持的类型如下:

enum rt_object_class_type
{RT_Object_Class_Thread = 0,             /* 对象为线程类型      */
#ifdef RT_USING_SEMAPHORERT_Object_Class_Semaphore,              /* 对象为信号量类型    */
#endif
#ifdef RT_USING_MUTEXRT_Object_Class_Mutex,                  /* 对象为互斥量类型    */
#endif
#ifdef RT_USING_EVENTRT_Object_Class_Event,                  /* 对象为事件类型      */
#endif
#ifdef RT_USING_MAILBOXRT_Object_Class_MailBox,                /* 对象为邮箱类型      */
#endif
#ifdef RT_USING_MESSAGEQUEUERT_Object_Class_MessageQueue,           /* 对象为消息队列类型   */
#endif
#ifdef RT_USING_MEMPOOLRT_Object_Class_MemPool,                /* 对象为内存池类型     */
#endif
#ifdef RT_USING_DEVICERT_Object_Class_Device,                 /* 对象为设备类型       */
#endifRT_Object_Class_Timer,                  /* 对象为定时器类型     */
#ifdef RT_USING_MODULERT_Object_Class_Module,                 /* 对象为模块          */
#endifRT_Object_Class_Unknown,                /* 对象类型未知        */RT_Object_Class_Static = 0x80           /* 对象为静态对象      */
};

那么对象类型的最高位将是 1(是 RT_Object_Class_Static 与其他对象类型的与操作),否则就是动态对象,系统最多能够容纳的对象类别数目是 127 个。

内核对象管理方式

内核对象容器的数据结构:

struct rt_object_information
{enum rt_object_class_type type;rt_list_t object_list;rt_size_t object_size;
}

一类对象由一个rt_object_information结构体来管理,每一个这类对象的具体实例都通过链表的形式挂接在object_list上。
而这一类对象的内存块尺寸由object_size标识出来(每一类对象的具体实例,它们占有的内存块大小是相同的)。

初始化对象

在使用一个未初始化的静态对象前必须先对其进行初始化。
初始化对象使用以下接口:

void rt_object_init(struct rt_object* object,enum rt_object_class_type type, const char* name)

当调用这个函数进行对象初始化时,系统会把这个对象放置到对象容器中进行管理,即初始化对象的一些参数,然后把这个对象节点插入到对象容器的对象链表中。
在这里插入图片描述

脱离对象

从内核对象管理器中脱离一个对象。

void rt_object_detach(rt_object_t object);

调用该接口,可使得一个静态内核对象从内核对象容器中脱离出来,即从内核对象容器链表上删除相应的对象节点。
对象脱离后,对象占用的内存并不会释放。

RT-Thread内核配置示例

RT-Thread的一个重要特性是高度可裁剪性,支持对内核进行精细调整,对组件进行灵活拆卸。

配置主要是通过修改工程目录下的rtconfig.h文件来进行,用户可以通过打开/关闭该文件中的宏定义来对代码进行条件编译,最终达到系统配置和裁剪的目的,如下:

/* 表示内核对象的名称的最大长度,若代码中对象名称的最大长度大于宏定义的长度,* 多余的部分将被截掉。*/
#define RT_NAME_MAX 8/* 字节对齐时设定对齐的字节个数。常使用 ALIGN(RT_ALIGN_SIZE) 进行字节对齐。*/
#define RT_ALIGN_SIZE 4/* 定义系统线程优先级数;通常用 RT_THREAD_PRIORITY_MAX-1 定义空闲线程的优先级 */
#define RT_THREAD_PRIORITY_MAX 32/* 定义时钟节拍,为 100 时表示 100 个 tick 每秒,一个 tick 为 10ms */
#define RT_TICK_PER_SECOND 100/* 检查栈是否溢出,未定义则关闭 */
#define RT_USING_OVERFLOW_CHECK/* 定义该宏开启 debug 模式,未定义则关闭 */
#define RT_DEBUG
/* 开启 debug 模式时:该宏定义为 0 时表示关闭打印组件初始化信息,定义为 1 时表示启用 */
#define RT_DEBUG_INIT 0
/* 开启 debug 模式时:该宏定义为 0 时表示关闭打印线程切换信息,定义为 1 时表示启用 */
#define RT_DEBUG_THREAD 0/* 定义该宏表示开启钩子函数的使用,未定义则关闭 */
#define RT_USING_HOOK/* 定义了空闲线程的栈大小 */
#define IDLE_THREAD_STACK_SIZE 256

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/296552.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择合适的数据库?

数据库常常是应用系统中最大的性能瓶颈。一旦部署到生产环境中,就很难迁移,因此为应用系统选择合适的数据库至关重要。​ 做出正确决定的一个重要部分是知道面临哪些选择。数据库领域在过去几年迅速发生了变化,本文将试图探讨以下几个主题&am…

线段树/区间树(java实现版详解附leetcode例题)

目录 什么是线段树 线段树基础表示 创建线段树(Java版详解) 线段树的区间查询 leetcode上的线段树相关问题 leetcode303题.区域和检索-数组不可变 使用线段树解题 不使用线段树解题 leetcode307题.区域和检索-数组可修改 不使用线段树解题 线…

算法模板之队列图文详解

🌈个人主页:聆风吟 🔥系列专栏:算法模板、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️模拟队列1.1 🔔用数组模拟实现队列1.1.1 👻队列的定…

1859_续流二极管是什么以及其作用

Grey 全部学习内容汇总: GitHub - GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! 1859_续流二极管是什么以及其…

python 解决手机拍的书籍图片发灰的问题

老师给发的作业经常是手机拍的,而不是扫描,背景发灰,如果二次打印就没有看了,象这样: 如果使用photoshop 处理,有些地方还是扣不干净,不如python 做的好,处理后如下: 具体…

css 设备背景图片 宽高总是不能平铺

宽高总是宽大了 高就挤出去了;高设置了 宽度就变小了;疯掉的节奏。。。。。。 .center-bottom{background: url(/img/newpic/leftbg.png);background-repeat: no-repeat;width: 98%;height: 60%;background-position: center center;background-size: 1…

关于网络犯罪份子租用WikiLoader通过银行木马攻击意大利组织的动态情报

一、基本内容 近期Proofpoint研究人员发现了一种新的恶意软件,被称为WikiLoader。这个恶意软件在2022年12月首次被发现,并且由攻击者组织TA544传播,他们通常使用Ursnif恶意软件来攻击意大利组织。Proofpoint观察到了多个与此相关的活动&…

设计模式(4)--类行为(3)--解释器

1. 意图 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语 言中的句子。 2. 四种角色 抽象表达式(AbstractExpression)、终结表达式(TerminalExpression)、非终结表达式(NonterminalExpression)、上下文…

LTE之帧结构

一、基本时间单位 在LTE里,时间的基本单位都是采样周期Ts,值固定等于: Ts 1 / (15000 * 2048) 32.55ns 其中,15000表示子载波的间隔是15kHz,2048表示采样点个数。除了15kHz的子载波间隔之外,3GPP还定义…

【高数定积分求解旋转体体积】 —— (上)高等数学|定积分|柱壳法|学习技巧

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 Shell method Setting up the Integral 例题 Example 1: Example 2: Example 3: Computing…

安工程校园导游系统课程设计报告

第一章 概述 1.1 问题描述 根据题目内容,需要用无向网表示所在学校的景点平面图,即校内每个景点 为无向网中的各个结点,景点的编号、名称、简介等信息存储在结点中,图中的 边表示景点间的道路,存放景点之间的路径长度等信息。需要回答有关景点介绍、 游览路径等问题。具…

【LearnOpenGL基础入门——5】着色器

目录 一.简介 二.GLSL 三.数据类型 四.输入与输出 五.Uniform 六.更多属性 一.简介 着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立…