《嵌入式实时操作系统:RT-Thread设计与实现》 —3.5.4 内核对象管理方式

举报
华章计算机 发表于 2019/11/24 11:24:54 2019/11/24
【摘要】 本节书摘来自华章计算机《嵌入式实时操作系统:RT-Thread设计与实现》一书中第3章,第3.5.4节,作者是邱祎 熊谱翔 朱天龙 。

3.5.4 内核对象管理方式

内核对象容器的数据结构如下。

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标识(每一类对象的具体实例所占有的内存块大小都是相同的)。

1.初始化对象

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

void rt_object_init(struct  rt_object*  object ,

                    enum rt_object_class_type  type ,

                    const char* name)

当调用该函数进行对象初始化时,系统会把这个对象放置到对象容器中进行管理,即初始化对象的一些参数,然后把这个对象节点插入到对象容器的对象链表中,对该函数的输入参数的描述如表3-2所示。

表3-2 rt_object_init()的输入参数

image.png

 

2.脱离对象

可从内核对象管理器中脱离一个对象。脱离对象使用以下接口:

void rt_object_detach(rt_object_t object);

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

3.分配对象

上述描述的都是对象初始化、脱离的接口,都是在面向对象内存块已经有的情况下,而动态对象则可以在需要时申请,不需要时释放内存空间给其他应用使用。申请分配新的对象可以使用以下接口:

rt_object_t rt_object_allocate(enum  rt_object_class_type type ,

                               const  char*  name)

在调用以上接口时,系统首先需要根据对象类型来获取对象信息(特别是对象类型的大小信息,以便系统能够分配正确大小的内存数据块),而后从内存堆中分配对象所对应大小的内存空间,然后再对该对象进行必要的初始化,最后将其插入到它所在的对象容器链表中。对该函数的输入参数的描述如表3-3所示。

表3-3 rt_object_allocate()的输入参数和返回值

image.png

 

4.删除对象

当不再使用一个动态对象时,可以调用如下接口删除该对象,并释放相应的系统资源:

void rt_object_delete(rt_object_t object)

当调用以上接口时,首先从对象容器链表中脱离对象,然后释放对象所占用的内存。对该函数的输入参数的描述如表3-4所示。

image.png

5.辨别对象

判断指定对象是否是系统对象(静态内核对象)。辨别对象使用以下接口:

rt_err_t rt_object_is_systemobject(rt_object_t object);

调用rt_object_is_systemobject接口可判断一个对象是否是系统对象,在RT-Thread操作系统中,一个系统对象就是一个静态对象,对象类型标识上RT_Object_Class_Static位置位。通常,使用rt_object_init()方式初始化的对象都是系统对象。对该函数的输入参数的描述如表3-5所示。

表3-5 rt_object_is_systemobject()的输入参数

image.png


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。