要包括了这么几段:
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方式挂接到内核对象管理器中的对象是系统对象。