初始化系统
2026/4/26大约 2 分钟基础知识初始化系统启动
初始化系统
一、初始化级别宏
| 宏名 | 值 | 说明 | 执行时机 |
|---|---|---|---|
| OS_INIT_LEVEL_PRE_KERNEL_1 | 1 | 内核启动前第一阶段 | 调度器启动前,板级硬件初始化 |
| OS_INIT_LEVEL_PRE_KERNEL_2 | 2 | 内核启动前第二阶段 | 调度器启动前,更多硬件初始化 |
| OS_INIT_LEVEL_POST_KERNEL | 3 | 内核启动后第一阶段 | 调度器已启动,内核组件初始化 |
| OS_INIT_LEVEL_PRE_DEVICE | 4 | 设备预初始化 | 设备框架准备 |
| OS_INIT_LEVEL_DEVICE | 5 | 设备初始化 | 硬件设备驱动初始化 |
| OS_INIT_LEVEL_COMPONENT | 6 | 组件初始化 | 文件系统、网络等组件 |
| OS_INIT_LEVEL_APPLICATION | 7 | 应用初始化 | 应用层初始化 |
| OS_INIT_LEVEL_SMP | 8 | SMP 初始化 | 仅 SMP 系统,多核初始化 |
子级别
| 宏名 | 值 | 说明 |
|---|---|---|
| OS_INIT_SUBLEVEL_HIGH | 1 | 高级别(先执行) |
| OS_INIT_SUBLEVEL_MIDDLE | 2 | 中级别 |
| OS_INIT_SUBLEVEL_LOW | 3 | 低级别(后执行) |
二、OS_INIT_CALL 宏
#define OS_INIT_CALL(fn, level, sublevel)将初始化函数注册到指定的初始化级别。
使用示例:
static int os_hw_board_init(void)
{
/* 板级硬件初始化 */
return OS_SUCCESS;
}
OS_INIT_CALL(os_hw_board_init, OS_INIT_LEVEL_PRE_KERNEL_1, OS_INIT_SUBLEVEL_HIGH);三、通用宏
| 宏 | 说明 |
|---|---|
| OS_TRUE | 真(1) |
| OS_FALSE | 假(0) |
| OS_NULL | 空指针 |
| OS_ALIGN_UP(size, align) | 向上对齐 |
| OS_ALIGN_DOWN(size, align) | 向下对齐 |
| OS_BIT_SET(value, bit) | 设置位 |
| OS_BIT_CLR(value, bit) | 清除位 |
| OS_BIT_GET(value, bit) | 获取位 |
| os_container_of(ptr, type, member) | 从成员获取结构体指针 |
| os_offsetof(type, member) | 获取成员偏移 |
| OS_WAIT_FOREVER | 永久等待 |
| OS_NO_WAIT | 不等待 |
| OS_ARRAY_SIZE(x) | 获取数组元素个数 |
| OS_UNREFERENCE(x) | 避免未使用变量警告 |
四、结构体
init_call_entry
struct _init_call_entry
{
const char *name; /* 函数名称(仅调试模式) */
init_call_fn_t func; /* 初始化函数指针 */
};
typedef struct _init_call_entry init_call_entry_t;
typedef os_err_t (*init_call_fn_t)(void);初始化函数表
volatile const init_call_entry_t *gs_init_call_table[] = {
os_initcall0_start, /* PRE_KERNEL_1 */
os_initcall1_start, /* PRE_KERNEL_2 */
os_initcall2_start, /* POST_KERNEL */
os_initcall3_start, /* PRE_DEVICE */
os_initcall4_start, /* DEVICE */
os_initcall5_start, /* COMPONENT */
os_initcall6_start, /* APPLICATION */
os_initcall7_start, /* SMP */
os_initcall8_start /* 结束 */
};