RT-Thread分析-对象容器实现与作用

2023-10-31

目录

1 前言

2 相关数据结构

2.1 对象

1)类型

2)数据结构

2.3 容器

1)数据结构

2)容器定义 _object_container[]

2.3 对象容器链接图

3 获取对象容器 rt_object_get_information()

4 对象初始化 rt_object_init()

5 对象删除 rt_object_delete()

6 查找对象rt_object_find()

7 总结


1 前言

        在内核中,所有数据结构都视作一个对象,包括:线程、信号量、互斥量、事件、邮箱、消息队列、内存堆、内存池、设备和定时器。为了方便管理,当用户或者内核创建一个对象时,就会将该对象放到容器中。容器在内核中是一个全局数组,记录着所有对象的信息。

2 相关数据结构

2.1 对象

1)类型

enum rt_object_class_type
{
    RT_Object_Class_Null          = 0x00,      /**< The object is not used. */
    RT_Object_Class_Thread        = 0x01,      /**< The object is a thread. */
    RT_Object_Class_Semaphore     = 0x02,      /**< The object is a semaphore. */
    RT_Object_Class_Mutex         = 0x03,      /**< The object is a mutex. */
    RT_Object_Class_Event         = 0x04,      /**< The object is a event. */
    RT_Object_Class_MailBox       = 0x05,      /**< The object is a mail box. */
    RT_Object_Class_MessageQueue  = 0x06,      /**< The object is a message queue. */
    RT_Object_Class_MemHeap       = 0x07,      /**< The object is a memory heap. */
    RT_Object_Class_MemPool       = 0x08,      /**< The object is a memory pool. */
    RT_Object_Class_Device        = 0x09,      /**< The object is a device. */
    RT_Object_Class_Timer         = 0x0a,      /**< The object is a timer. */
    RT_Object_Class_Module        = 0x0b,      /**< The object is a module. */
    RT_Object_Class_Unknown       = 0x0c,      /**< The object is unknown. */
    RT_Object_Class_Static        = 0x80       /**< The object is a static object. */
};

2)数据结构

struct rt_object
{
    //对象名称,使用字符串表示,长度由RT_NAME_MAX决定
    char       name[RT_NAME_MAX];  
    //对象类型                                                            
    rt_uint8_t type;
    //对象状态                                    
    rt_uint8_t flag; 
    //侵入式链表,将该对象链接至容器中                                   
    rt_list_t  list;                                    
};
typedef struct rt_object *rt_object_t; 

2.3 容器

        内核中就是使用全局结构体数组(rt_object_information _object_container[])来定义容器。每一个容器都存放同一类型的对象,保存其信息,使用链表将所有对象链接起来方便管理。

1)数据结构

struct rt_object_information
{
    //容器下的对象类型
    enum rt_object_class_type type;
    //链接容器下的所有对象                    
    rt_list_t                 object_list;  
    //其对象大小            
    rt_size_t                 object_size;             
};

2)容器定义 _object_container[]

//2.1) 容器是使用数组表示,下面是定义不同对象在数组中的序号
enum rt_object_info_type
{
    RT_Object_Info_Thread = 0,                         /**< The object is a thread. */
#ifdef RT_USING_SEMAPHORE
    RT_Object_Info_Semaphore,                          /**< The object is a semaphore. */
#endif
#ifdef RT_USING_MUTEX
    RT_Object_Info_Mutex,                              /**< The object is a mutex. */
#endif
#ifdef RT_USING_EVENT
    RT_Object_Info_Event,                              /**< The object is a event. */
#endif
#ifdef RT_USING_MAILBOX
    RT_Object_Info_MailBox,                            /**< The object is a mail box. */
#endif
#ifdef RT_USING_MESSAGEQUEUE
    RT_Object_Info_MessageQueue,                       /**< The object is a message queue. */
#endif
#ifdef RT_USING_MEMHEAP
    RT_Object_Info_MemHeap,                            /**< The object is a memory heap */
#endif
#ifdef RT_USING_MEMPOOL
    RT_Object_Info_MemPool,                            /**< The object is a memory pool. */
#endif
#ifdef RT_USING_DEVICE
    RT_Object_Info_Device,                             /**< The object is a device */
#endif
    RT_Object_Info_Timer,                              /**< The object is a timer. */
#ifdef RT_USING_MODULE
    RT_Object_Info_Module,                             /**< The object is a module. */
#endif
    RT_Object_Info_Unknown,                            /**< The object is unknown. */
};

//2.2) 每一个容器都存放同一类型的对象,比如_object_container[0]都是存放对象RT_Object_Class_Thread,再使用链表object_list将所有对象链接起来
#define _OBJ_CONTAINER_LIST_INIT(c)     \
    {&(_object_container[c].object_list), &(_object_container[c].object_list)}
static struct rt_object_information _object_container[RT_Object_Info_Unknown] =
{
    /* initialize object container - thread */
    {RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Thread), sizeof(struct rt_thread)},
#ifdef RT_USING_SEMAPHORE
    /* initialize object container - semaphore */
    {RT_Object_Class_Semaphore, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Semaphore), sizeof(struct rt_semaphore)},
#endif
#ifdef RT_USING_MUTEX
    /* initialize object container - mutex */
    {RT_Object_Class_Mutex, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Mutex), sizeof(struct rt_mutex)},
#endif
#ifdef RT_USING_EVENT
    /* initialize object container - event */
    {RT_Object_Class_Event, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Event), sizeof(struct rt_event)},
#endif
#ifdef RT_USING_MAILBOX
    /* initialize object container - mailbox */
    {RT_Object_Class_MailBox, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MailBox), sizeof(struct rt_mailbox)},
#endif
#ifdef RT_USING_MESSAGEQUEUE
    /* initialize object container - message queue */
    {RT_Object_Class_MessageQueue, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MessageQueue), sizeof(struct rt_messagequeue)},
#endif
#ifdef RT_USING_MEMHEAP
    /* initialize object container - memory heap */
    {RT_Object_Class_MemHeap, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MemHeap), sizeof(struct rt_memheap)},
#endif
#ifdef RT_USING_MEMPOOL
    /* initialize object container - memory pool */
    {RT_Object_Class_MemPool, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MemPool), sizeof(struct rt_mempool)},
#endif
#ifdef RT_USING_DEVICE
    /* initialize object container - device */
    {RT_Object_Class_Device, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Device), sizeof(struct rt_device)},
#endif
    /* initialize object container - timer */
    {RT_Object_Class_Timer, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Timer), sizeof(struct rt_timer)},
#ifdef RT_USING_MODULE
    /* initialize object container - module */
    {RT_Object_Class_Module, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Module), sizeof(struct rt_dlmodule)},
#endif
};

2.3 对象容器链接图

3 获取对象容器 rt_object_get_information()

struct rt_object_information* rt_object_get_information(enum rt_object_class_type type)
{
    int index;
    
    //遍历容器数组_object_container[],通过类型找到对象容器
    for (index = 0; index < RT_Object_Info_Unknown; index ++)
        if (_object_container[index].type == type) 
            return &_object_container[index];

    return RT_NULL;
}

4 对象初始化 rt_object_init()

void rt_object_init(struct rt_object         *object,
                    enum rt_object_class_type type,
                    const char               *name)
{
    //1 通过对象类型,找到容器
    information = rt_object_get_information(type);
    
    //2 遍历容器下的所有对象,如果和需初始化的对象一致,则进入断言
    //PS:这个错误检查的作用???
    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);
        }
    }
    
    //3 设置静态标记
    object->type = type | RT_Object_Class_Static;
    
    //4 设置对象名称
    rt_strncpy(object->name, name, RT_NAME_MAX);
    
    //5 将对象插入至容器链表末端
    rt_list_insert_after(&(information->object_list), &(object->list));
}

5 对象删除 rt_object_delete()

void rt_object_delete(rt_object_t object)
{
    //1 复位对象类型
    object->type = RT_Object_Class_Null;
    
    //2 将对象从容器链表中剔除
    rt_list_remove(&(object->list));
    
    //3 释放对象内存
    RT_KERNEL_FREE(object);
}

6 查找对象rt_object_find()

rt_object_t rt_object_find(const char *name, rt_uint8_t type)
{
    //1 通过类型找到对应容器
    information = rt_object_get_information((enum rt_object_class_type)type);
    
    //2 上下文检测,该函数不允许在中断中调用
    RT_DEBUG_NOT_IN_INTERRUPT;
}

7 总结

  • 内核中每一个数据结构都抽象为对象rt_object,包括:线程、信号量、互斥量、事件、邮箱、消息队列、内存堆、内存池、设备和定时器。
  • 在实际使用过程中,对象属性是可以继承的
  • 内核使用全局结构体数组维护容器,数组中每一个成员管理着所有相同类型的对象,方便对外随时查询各个对象信息

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RT-Thread分析-对象容器实现与作用 的相关文章

随机推荐

  • Vue实现TabBar底部导航栏灵活组件保姆级超详细

    Vue实现TabBar底部导航栏组件 标题项目介绍 需求 要求tabbar中的文字可动态更改 文字对应的图片动态更改动态增加 文字颜色对应更改 TabBarItem的图片动态更改和增加 整个项目灵活化 利用插槽 路由 父子组件的值传递 利用
  • Ts中泛型的使用

    泛型 指在定义函数 接口或类的时候 不预先指定具体的类型 而在使用的时候再指定具体类型的一种特性 引入 下面创建一个函数 实现功能 根据指定的数量 count 和数据 value 创建一个包含 count 个 value 的数组 不使用泛型
  • 嵌入汇编

    本文介绍内核C语言程序中接触到的嵌入式汇编 内联汇编 语句 具有输入和输出参数的嵌入式汇编语句的基本格式为 asm 汇编语句 输出寄存器 输入寄存器 会被修改的寄存器 除第一行外 后面带冒号的行若不使用就都可以省略 其实asm是内联汇编语句
  • 五十二:JDK动态代理和CGLIB动态代理

    JDK动态代理是利用反射机制生成一个实现代理接口的匿名类 在调用具体方法前调用InvokeHandler来处理 而cglib动态代理是利用asm开源包 对代理对象类的class文件加载进来 通过修改其字节码生成子类来处理 1 如果目标对象实
  • Redis-持久化策略,你确定你懂?又需要注意哪些知识点

    redis是一个内存数据库 一旦服务器宕机 内存中的数据将全部丢失 所以 对 Redis 来说 实现数据的持久化 避免从后端数据库中进行恢复 是至关重要的 目前 Redis 的持久化主要有两大机制 即 AOF Append Only Fil
  • SpringBoot+Redis-Cluster集群搭建及调优

    转载请注明出处 SpringBoot Redis Cluster集群搭建及调优 集群配置 服务器配置 具体搭建步骤 安装所必须的一些工具包 安装redis 集群搭建 安装其他redis节点 修改14上面的redis conf配置文件 复制修
  • Linux中安装配置hadoop集群

    原文 http www cnblogs com lijingchn p 5574476 html 一 简介 参考了网上许多教程 最终把hadoop在ubuntu14 04中安装配置成功 下面就把详细的安装步骤叙述一下 我所使用的环境 两台u
  • Qt 中 UI界面文件与类的关系

    通过UI界面设计器设计的UI界面 在编译时会生成一个ui XXXXX 的头文件 然后 可新建一个类与之相关联 这样就建立了一个类与UI界面的关联 转载于 https www cnblogs com ProtocolYue p 1143711
  • ffmpeg通过GPU实现视频转码命令

    使用CUVID和NVENC实现全硬件转码 ffmpeg hwaccel cuvid c v h264 cuvid i input mp4 c v h264 nvenc preset slow output mkv ffmpeg hwacce
  • 区块链实现记账流程

    重点看图
  • [Python]Cityscapes目标检测标注转YOLO格式

    文件目录 数据集下载 https www cityscapes dataset com downloads 下载 leftImg8bit trainvaltest zip 和 gtFine trainvaltest zip 解压后放成如下的
  • Linux 下Redis的安装、测试

    Linux 下单机Redis的安装 测试 验证gcc c 环境 redis使用c语言开发 所以要运行在linux上 需要gcc c 的环境 1 检查是否有gcc c 环境 rpm qa grep gcc c 2 如果没有进行安装 yum i
  • Strassen矩阵乘法

    Strassen矩阵乘法 矩阵乘法是线性代数中最常见的运算之一 它在数值计算中有广泛的应用 若A和B是2个n n的矩阵 则它们的乘积C AB同样是一个n n的矩阵 A和B的乘积矩阵C中的元素C i j 定义为 若依此定义来计算A和B的乘积矩
  • hadoop01:8020 failed on connection exception: java.net.ConnectException: 拒绝接

    实验中使用hdfs报错 怎么也能连接hadoop 重启还是报错 仔细排查下 root hadoop01 hadoop fs ls ls Call From hadoop01 172 16 18 133 to hadoop01 8020 fa
  • windows mysql initialize

    Downloads https dev mysql com downloads mysql 配置相关 安装 MySQL 服务 mysqld install 启动 net start MySQL 停止 net stop MySQL 卸载 sc
  • 左对齐%-md和水平制表符\t的合作使用

    问题发现 在用C语言编译通讯录的过程中 有个目的是打印一串左对齐的printf语句 图1 图2 但是在这个语句中printf中 表示左对齐的 md的和水平制表符 t是合在一起使用 这不禁让我产生疑问 这里的水平制表符的作用是什么 图1 图2
  • 谈谈DOM0,DOM1,DOM2,DOM3

    DOM Document Object Model 文档对象模型 关于JS事件 JS程序使用的是事件驱动的设计模式 为一个元素添加事件监听函数 当这个元素的对应事件被触发 那么添加的事件监听函数就会被调用 事件是JS和HTML交互的基础 任
  • linux平台编译cuda版本opencv

    参考链接 https www pyimagesearch com 2016 07 11 compiling opencv with cuda support https docs opencv org 3 4 0 d7 d9f tutori
  • 从RESP的角度理解事务和管道

    1 RESP 是什么 16 进制 0d 0a 就是 r n RESP 就是 Redis 服务端和客户端之间进行通信的协议 它是建立在 TCP 之上的一种简单的应用层协议 你可以把它理解成 HTTP 协议 不过它更加的简单 它支持很多数据类型
  • RT-Thread分析-对象容器实现与作用

    目录 1 前言 2 相关数据结构 2 1 对象 1 类型 2 数据结构 2 3 容器 1 数据结构 2 容器定义 object container 2 3 对象容器链接图 3 获取对象容器 rt object get information