一种C语言自动初始化的实现方式

        在嵌入式操作系统中,流行自动初始化的方法来初始设备和应用。但是一般的自动初始化代码需要修改链接脚本lds文件。例如RT-thread和鸿蒙的自动初始化都需要修改链接脚本,平台适配性不强。

        在gcc编译环境下,我发现一种方法可以不修改链接脚本。采用链接器自动生成 __start_和__stop_字段,可以控制函数起始和结束位置。

//section demo with gcc
#include "stdio.h"  #define SECTION(x)  __attribute__((used,section("init_fn"#x)))
typedef void (*init_fn_t)(void);#define INIT_EXPORT(fn, level) const init_fn_t init_fn_##fn SECTION(level) = fn
#define INIT_BOARD_EXPORT(fn)           INIT_EXPORT(fn,1)
#define INIT_PREV_EXPORT(fn)            INIT_EXPORT(fn, 2)
#define INIT_DEVICE_EXPORT(fn)          INIT_EXPORT(fn, 3)
#define INIT_COMPONENT_EXPORT(fn)       INIT_EXPORT(fn, 4)
#define INIT_ENV_EXPORT(fn)             INIT_EXPORT(fn, 5)
#define INIT_APP_EXPORT(fn)             INIT_EXPORT(fn, 6)
//定义了SECTION("init_fn"#level)后,链接器自动生成 __start_和__stop_字段
extern init_fn_t __start_init_fn1;
extern init_fn_t __start_init_fn2;
extern init_fn_t __start_init_fn6;
extern init_fn_t __stop_init_fn1;
extern init_fn_t __stop_init_fn2;
extern init_fn_t __stop_init_fn6;int test(void)
{printf("func %s run\n",__func__);return 0;
}int  test0(void)
{printf("func %s run\n",__func__);return 0;
}int test1(void)
{printf("func %s run\n",__func__);return 0;
}INIT_BOARD_EXPORT(test);
INIT_PREV_EXPORT(test0);
INIT_APP_EXPORT(test1);int main(void)  
{for (init_fn_t* fn_ptr = &__start_init_fn1; fn_ptr < &__stop_init_fn1; fn_ptr++){(*fn_ptr)();}for (init_fn_t* fn_ptr = &__start_init_fn2; fn_ptr < &__stop_init_fn2; fn_ptr++){(*fn_ptr)();}for (init_fn_t* fn_ptr = &__start_init_fn6; fn_ptr < &__stop_init_fn6; fn_ptr++){(*fn_ptr)();}return 0;  
}  


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部