init_call_entry_t 结构体
2026/4/26大约 3 分钟结构体初始化数据结构
init_call_entry_t 结构体
📚 本节导读
用途: 存储初始化函数信息的数据结构
来源: kernel/include/os_stddef.h
一、概述
1.1 概念定义
init_call_entry_t 是 OneOS 多级初始化机制中用于存储初始化函数信息的结构体。
1.2 作用
- 保存初始化函数指针
- 调试模式下保存函数名
- 通过段机制按级别组织
二、结构体定义
2.1 完整代码(第 95-117 行)
typedef os_err_t (*init_call_fn_t)(void);
#define OS_INIT_CALL_DEBUG_EN
/* Level and sublevel must be defined by macro provided by the system. */
#ifdef OS_INIT_CALL_DEBUG_EN
struct _init_call_entry
{
const char *name; /* The name of function */
init_call_fn_t func; /* The function address of init call */
};
typedef struct _init_call_entry init_call_entry_t;
#else
struct _init_call_entry
{
init_call_fn_t func; /* The function address of init call */
};
typedef struct _init_call_entry init_call_entry_t;
#endif2.2 分步详细解释
第一步:定义函数指针类型
typedef os_err_t (*init_call_fn_t)(void);- 解释: 定义初始化函数的函数指针类型别名
- 语法解析:
typedef:C语言类型定义关键字os_err_t:返回值类型,表示初始化操作的执行结果(OS_EOK表示成功,其他值为错误码)(*init_call_fn_t):函数指针类型名,init_call_fn_t是新定义的类型别名(void):函数参数列表为空,表示不接受任何输入参数
- 作用: 统一所有初始化函数的签名规范,任何初始化函数都必须遵循这个签名:返回
os_err_t类型且不带参数
第二步:定义调试模式宏
#define OS_INIT_CALL_DEBUG_EN- 解释: 定义调试模式开关
- 含义: 当这个宏被定义时,启用调试模式,结构体中会包含函数名字段
- 作用: 方便调试时查看是哪个初始化函数执行失败
第三步:调试模式下的结构体定义
#ifdef OS_INIT_CALL_DEBUG_EN
struct _init_call_entry
{
const char *name; /* The name of function */
init_call_fn_t func; /* The function address of init call */
};- 解释: 调试模式下的结构体定义
- 含义:
name字段:保存初始化函数的名称字符串func字段:保存初始化函数的指针
- 作用: 在调试时,如果初始化失败,可以打印出失败的函数名称
typedef struct _init_call_entry init_call_entry_t;- 解释: 为结构体类型创建简短别名
- 语法解析:
typedef:类型定义关键字struct _init_call_entry:原始结构体类型(包含下划线前缀的命名通常表示内部使用类型)init_call_entry_t:新定义的类型别名(后缀_t是 C 语言中表示类型的常见约定)
- 作用:
- 简化类型书写:使用
init_call_entry_t替代冗长的struct _init_call_entry - 提高代码可读性:更清晰地表达这是一个类型名
- 封装实现细节:将内部命名
_init_call_entry隐藏,对外提供统一的init_call_entry_t接口
- 简化类型书写:使用
第四步:发布模式下的结构体定义
#else
struct _init_call_entry
{
init_call_fn_t func; /* The function address of init call */
};
typedef struct _init_call_entry init_call_entry_t;
#endif- 解释: 发布模式下的结构体定义
- 含义: 只包含函数指针,不包含函数名字段
- 作用: 节省内存空间,发布版本不需要函数名调试信息
2.3 调试模式(OS_INIT_CALL_DEBUG_EN 已启用)
struct _init_call_entry
{
const char *name; /* 函数名称 */
init_call_fn_t func; /* 初始化函数指针 */
};
typedef struct _init_call_entry init_call_entry_t;2.4 发布模式(OS_INIT_CALL_DEBUG_EN 未启用)
struct _init_call_entry
{
init_call_fn_t func; /* 初始化函数指针 */
};
typedef struct _init_call_entry init_call_entry_t;