函数静态注册,自动运行 c语言实现函数静态注册自动运行问题当我们有一个或者很多个类型相似的函数我们实现了函数但是没有地方调用或者不能显示的调用怎么办目标有一个函数定义typedef int (*driver_func)(void);在rtos上我实现了一个上面的函数 sys_init并通过一个宏 ALIOS_MODULE_REGISTER 声明。在系统初始化阶段调用函数 module_init() 能够运行上面的函数。实现步骤头文件module.h/** * file module.h * brief Static driver function registration and one-click execution * * Usage: * 1. Define a driver function: int my_driver_init(void) { ... } * 2. Register it statically: ALIOS_MODULE_REGISTER(my_driver_init); * 3. Run all registered: module_init(); */#ifndef__MODULE_H__#define__MODULE_H__#ifdef__cplusplusexternC{#endif#defineSECTION(x)__attribute__((section(x)))#defineUSED__attribute__((used))typedefint(*driver_func)(void);/** * brief Statically register a driver function into ModuleDriver section. * All registered functions will be executed by cvi_module_init(). */#defineALIOS_MODULE_REGISTER(func)\USEDconstdriver_func __module_drv_##funcSECTION(ModuleDriver)func/** Begin marker of the ModuleDriver section (defined in linker script) */externconstdriver_func _module_driver_begin[];/** End marker of the ModuleDriver section (defined in linker script) */externconstdriver_func _module_driver_end[];/** * brief Run all driver functions registered via ALIOS_MODULE_REGISTER. */voidmodule_init(void);#ifdef__cplusplus}#endif#endif/* CVI_MODULE_H */调用 ALIOS_MODULE_REGISTER 把函数地址放到 SECTION(“ModuleDriver”) 段中。链接脚本中指定ModuleDriver以及上下边界。链接脚本gcc_flash.ld (显示改动部分)_module_driver_begin.;KEEP(*(ModuleDriver)).ALIGN(8);_module_driver_end.;实现 module_init() 统一运行函数。#includemodule.hvoidmodule_init(void){constdriver_func*fn;for(fn_module_driver_begin;fn_module_driver_end;fn){if(*fn){(*fn)();}}}最终编译c文件和链接gcc_flash.ld文件。这样用户只需要用 ALIOS_MODULE_REGISTER 声明一下该函数在系统初始化阶段调用 module_init() 即可批量运行所有声明的函数。