嵌入式(armcc)自动调用函数
有些时候,我们只想定义函数,却不想手动调用函数,而是希望这些函数在系统上电时自动调用。比如在写设备驱动时,设备的初始化函数就是这样一种函数,我们希望所有设备在上电的时候被初始化,每次增加一个设备时,不需要想着去调用这个函数,定义完之后,自己就被加入到设备初始化函数集中。
解决的方案有很多,比如写个预处理脚本,把特定格式声明的函数扫描上来,生成一个数组,然后统一调用,不过,这里有另一种解决方法:为每一个函数定义一个指针变量,然后将这个指针变量放到特定的section中,链接器最终会把同名的section组合到一起,即自动生成一个函数指针数组,访问链接器生成的符号即可。
typedef void(*DeviceInitFunction_t)(void); #define DEVICE_INIT_FUNCTION(func) \ DeviceInitFunction_t func##Ptr __attribute__((section("sectionName"))) = func // 定义一个设备初始化函数 DEVICE_INIT_FUNCTION(InitI2c); void InitI2c(void) { // ... } // 统一调用所有的设备初始化函数 void InitAllDevices(void) { extern int sectionName$$Base; extern int sectionName$$Length; DeviceInitFunction_t *initFunc = (DeviceInitFunction_t *)§ionName$$Base; size_t count = ((size_t)(§ionName$$Length))/sizeof(DeviceInitFunction_t); while(count--) { (*initFunc)(); initFunc++; } }
------------------------------------------------------------
本文由WindTaiL在cnblogs中发布,转载请注明出处
本文由WindTaiL在cnblogs中发布,转载请注明出处