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

目录

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要找到RT-Thread的内核实现手册,可以直接访问RT-Thread官方网站。在网站首页的顶部菜单,可以看到一个名为"文档"的选项,点击进入。在文档页面,可以找到各类文档资源,包括内核实现手册。 在文档页面,我们可以看到手册分成了多个部分,其包括了"内核"这一部分。点击"内核",可以进入RT-Thread内核相关的文档资源。在内核文档页面,可以找到关于RT-Thread内核的详细介绍、源代码分析、内核配置、内核对象等方面的内容。 在这个页面上,我们可以找到RT-Thread内核实现手册的具体文件。可以点击相应的链接进行下载或在线浏览。RT-Thread内核实现手册是RT-Thread官方提供的详尽文档,其包含了内核的具体实现原理、核心数据结构和功能模块等内容。通过阅读这个手册,我们可以更好地了解和深入理解RT-Thread内核的工作原理和特性,为使用和开发RT-Thread提供指导和参考。 总结来说,要找到RT-Thread内核实现手册,只需要在RT-Thread官方网站上点击顶部菜单的"文档"选项,然后选择"内核"部分,即可找到相应的手册并进行查看和下载。 ### 回答2: rt-thread的官方网站是www.rt-thread.org。在该网站上,您可以找到关于rt-thread内核实现的详细手册。这个手册提供了rt-thread内核的各个方面的详细说明和指导,包括内核的设计思想、各个模块的功能和使用方法,以及如何进行移植和配置等等。在手册,您可以找到与rt-thread相关的文档、示例代码和实用工具等资源,帮助您更好地理解和使用rt-thread内核。 通过rt-thread的官网,您可以轻松找到内核实现手册并下载阅读。在官网的导航栏,点击“文档”或“Documentation”选项,即可进入文档页面。在该页面,您可以找到各个版本的rt-thread内核手册,选择最适合您的版本进行下载。手册以PDF格式提供,您可以保存到本地设备,方便随时翻阅和参考。同时,官网还提供了在线阅读的选项,您可以直接在网页上浏览和搜索手册内容。 通过rt-thread内核实现手册,您可以深入了解rt-thread的设计和原理,学习如何使用和定制rt-thread内核,以及如何优化和调试嵌入式系统。这将为您在嵌入式开发使用rt-thread提供强大的支持和参考。 ### 回答3: RT-Thread的官网上有一个非常详细的内核实现手册。在官网的导航栏,找到"文档"或者"Documentation"选项,点击进入。在文档页面,你可以看到各种与RT-Thread相关的文档资源,包括内核实现手册。 RT-Thread内核实现手册是一本非常详细的指南,可以帮助开发者深入了解RT-Thread的内部实现原理和使用方法。它覆盖了RT-Thread内核的各个方面,包括线程调度、任务管理、内存管理、设备驱动、断处理等内容。 在内核实现手册,你可以找到对于每个功能的详细说明和示例代码。无论你是初学者还是有经验的开发者,这本手册都能够让你更好地理解和使用RT-Thread。同时,手册还提供了一些常见问题的解答,帮助开发者快速解决遇到的问题。 RT-Thread的内核实现手册是一个非常重要的资源,对于想要深入学习和应用RT-Thread的开发者来说,是不可或缺的参考文献。无论是在官网上下载PDF版本的手册,还是在线阅读手册的网页版本,你都可以轻松地获取到这个宝贵的资源。希望你可以利用这个手册,更好地掌握和应用RT-Thread

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值