zoukankan      html  css  js  c++  java
  • 嵌入式(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 *)&sectionName$$Base;
      size_t count = ((size_t)(&sectionName$$Length))/sizeof(DeviceInitFunction_t);
      while(count--) {
        (*initFunc)();
        initFunc++;
      }
    }
    
  • 相关阅读:
    Flask之flask-script
    Flask之flask-sqlalchemy
    sqlalchemy之基础操作
    Linux之服务管理
    python之PEP8规范
    app开发-1
    Mongodb之pymongo
    Mongodb之增删改查操作
    Mongodb之数据类型
    linux的virtualenv和virtualenvwarpper
  • 原文地址:https://www.cnblogs.com/windtail/p/3045883.html
Copyright © 2011-2022 走看看