RT_Thread 启动流程(系统初始化)
RT_Thread 操纵系统的启动和很大部分启动很类似。系统启动后,会进入汇编代码开始运行,然后跳转到C代码,进行RT_Thread 系统功能初始化,最后进入用户程序入口,即main() 。
系统初始化
系统初始化是在进入 main() 之前。一般情况下,可以先调用 $ Sub $$ main 作为在 main() 的补充的功能函数,在调用 $ Sub $ $main 转到 main() 函数执行,这样可以不用去管 main() 之前的系统初始化操作。
下面介绍在 components . c 中定义的这段代码
/* $ Sub$$main 函数 */
int $Sub $ $main (void){
rtthread_startup();
return 0;
}
RT_Thread程序内存分布
在 keil 工程编译完成之后,会有相应的程序所占用的空间提示信息;
(1) code : 代码段,存放程序的代码部分。
(2)RO_data: 只读数据段,存放程序中定义的常量;
(3)RW_data: 读写数据段,存放初始化为非0值的全局变量;
(4)ZI_data:0数据段,存放未初始化的全局变量及初始化为0的变量;
编译完工程后生成一个 .map 文件,会说明各个函数占用的尺寸和地址。
RT_Thread 内核对象模型
对象分为静态和动态对象,而且采用内核对象管理系统来访问,管理所有对象内核对象。
RT_Thread 内核对象包括线程,信号量,互斥量,事件,邮箱,消息队列,定时器,内存池,设备驱动,模块,未知,静态对象等。
对象模块初始化结构如下:
struct rt_object
{
char name [ RT_NAME_MAX ] /* 内核对象的名称 /
rt_uint8_t type / 内核对象的类型*/
rt_uint8_t flag /* 内核对象的参数*/
rt_uint8_t list /* 内核对象管理链表*/
}
内核对象管理方式
内核对象容器的数据结构如下:
struct rt_object_information
{
enum rt_object_class_type type /* 对象类型 /
rt_list_t object_list / 对象类型 /
rt_size_t object_size / 对象类型 */
}
管理方式包括:
- 初始化对象: (object , type , name)
- 脱离对象: 接口:void rt_object_detach ( rt_object_t object )
- 分配对象:接口: rt_object_allocate (enum rt_object_class_type type
const char* name) - 删除对象: 接口:void rt_object_delete (rt_object_t object )
- 辨识对象: 接口:rt_errt_t rt_object_is_systemobject(rt_object_t object );
待续…