- 支持 section 自动初始化方式,通用性更强
- 支持 constructor 自动初始化方式,移植更简单
- 支持注册表手动初始化方式,可读性和通用性更高。
- 仅依赖xf_utils,可移植性强。
- 占用低,解耦性强。
.
├── examples # linux 例程
├── linker # 各个平台的链接脚本(持续更新)
├── src # 源码文件夹
│ ├── registry # 自动注册初始化
│ │ ├── xf_init_registry.c # 实现自动注册初始化源码
│ │ ├── xf_init_registry.h # 对内的头文件
│ │ └── xf_init_registry_rule.h # 手动初始化注册表规则定义
│ ├── section # 段属性方式实现自动初始化
│ │ ├── xf_init_section.c # 实现自动初始化源码
│ │ └── xf_init_section.h # 对内的头文件
│ ├── xf_init.c # xf_init统一调用函数
│ ├── xf_init.h # xf_init对外调用头文件
│ └── xf_init_config_internal.h # 内部config配置默认值
├── DETAILS.md # 自动初始化原理说明
├── README.md # 仓库说明文档
└── xmake.lua # xmake 构建脚本自动初始化实现库. 内含三种实现方式:
- 需要自动初始化的函数的符号导出到段, 实现依赖倒置(见
registry/xf_init_registry.h). - 需要自动初始化的函数的符号, 通过
constructor挂载到内置初始化链表, 实现在调用时初始化(延迟初始化), 同时也实现依赖倒置(见section/xf_init_section.h). - 显式调用注册函数, 此时需要手动修改注册表(见
registry/xf_init_registry.h), 此时xf_init也会依赖需要初始化的组件, 通常不推荐使用.
切换这三种实现方式时, 需要自动初始化的代码无需改动, 只需使用对应的宏即可。
#define XF_INIT_IMPL_METHOD XF_INIT_IMPL_BY_CONSTRUCTOR当我们需要初始化一个函数的时候,可以选择一种初始化宏。如 XF_INIT_EXPORT_DEVICE.
使用示例如下:
static int device_test(void)
{
XF_LOGI(TAG, "hello, device");
return 0;
}
XF_INIT_EXPORT_DEVICE(device_test);但是, 如果使用的是XF_INIT_IMPL_BY_REGISTRY模式, 记得在注册表中添加需要自动初始化的函数, 如 examples/xf_init_registry.inc 所示.
XF_INIT_REGISTER(device_test);-
安装 xmake.
-
克隆 xf_utils.
# 克隆本仓库, 略 cd xf_init # 获取 xf_utils git clone https://github.com/x-eks-fusion/xf_utils.git
-
运行 linux 示例.
cd examples/ xmake clean xmake build xmake run xf_init -
测试其他初始化方式.
// 修改 examples/xf_init_config.h /** * @brief 选择自动初始化的实现方式. */ #define XF_INIT_IMPL_METHOD XF_INIT_IMPL_BY_REGISTRY // XF_INIT_IMPL_BY_SECTION // XF_INIT_IMPL_BY_CONSTRUCTOR // XF_INIT_IMPL_BY_REGISTRY
见 《详细原理说明》.