RT_thread 学习笔记1——内核对象

来源:互联网 发布:音乐消除人声软件 编辑:程序博客网 时间:2024/05/03 22:31
RT-Thread的内核映像文件在编译时会形成如下图所示的结构(以AT91SAM7S64为例):其中主 
要包括了这么几段: 

  Segment      Description 
 .text         代码正文段 
 .data         数据段,用于放置带初始值的全局变量 
 .rodata       只读数据段,用于放置只读的全局变量(常量) 

 .bss          bss段,用于放置未初始化的全局变量 .

在RT-Thread内核对象中分为两类:静态内核对象和动态内核对象。静态内核对象通常放 在.data或.bss段中,在系统启动后在程序中初始化;动态内核对象则是从堆中创建的,而后手 工做初始化。 


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

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

下图显示了RT-Thread中各类内核对象的派生和继承关系。对于每一种具体内核对象和对象控制 块,除了基本结构外,还有自己的扩展属性(私有属性),例如,对于线程控制块,在基类对象基 础上进行扩展,增加了线程状态、优先级等属性。这些属性在基类对象的操作中不会用到,只有 在与具体线程相关的操作中才会使用。因此从面向对象的观点,可以认为每一种具体对象是抽象 对象的派生,继承了基本对象的属性并在此基础上扩展了与自己相关的属性。 


内核对象接口 


初始化系统对象 


在初始化各种内核对象之前,首先需对对象管理系统进行初始化。在系统中,每类内核对象都有 一个静态对象容器,一个静态对象容器放置一类内核对象,初始化对象管理系统的任务就是初始 化这些对象容器,使之能够容纳各种内核对象,初始化系统对象使用以下接口: 
void  rt system object init(void) 
以下是对象容器的数据结构: 
struct  rt object information 

    enum  rt object class type  type;  /*  对象类型 */ 
    rt list t  object list;        /*  对象链表 */ 
    rt size t  object size;        /*  对象大小 */ 
}; 

一种类型的对象容器维护了一个对象链表object list,所有对于内核对象的分配,释放操作均在该 链表上进行。 
初始化对象 
使用对象前须先对其进行初始化。初始化对象使用以下接口: 
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 object t  rt object allocate(enum  rt object class type  type, const  char*  name) 
使用以上接口,首先根据对象类型来获取对象信息,然后从内存堆中分配对象所需内存空间,然 
后对该对象进行必要的初始化,最后将其插入到它所在的对象容器链表中。 

删除对象 
不再使用的对象应该立即被删除,以释放有限的系统资源。删除对象使用以下接口: 
void  rt object delete(rt object t  object) 
使用以上接口时,首先从对象容器中脱离对象,然后释放对象所占用的内存。 

查找对象 
通过指定的对象类型和对象名查找对象,查找对象使用以下接口: 
rt object t  rt object find(enum  rt object class type  type, const  char*  name) 
使用以上接口时,在对象类型所对应的对象容器中遍历寻找指定对象,然后返回该对象,如果没 
有找到这样的对象,则返回空。 

辨别对象 
判断指定对象是否是系统对象(静态内核对象)。辨别对象使用以下接口: 
rt err t  rt object is systemobject(rt object t  object) 
通常采用rt object init方式挂接到内核对象管理器中的对象是系统对象。 

原创粉丝点击