代码之家  ›  专栏  ›  技术社区  ›  Len Tango Ben

(嵌入)c:void函数()或define函数()。

  •  0
  • Len Tango Ben  · 技术社区  · 14 年前

    我正在为嵌入式设备编程,我想知道如何使用宏函数,例如一些寄存器的init。 我应该使它成为静态/常量还是将其定义为宏?

    例如,这:

     #define FPGA_INIT()\
    { \
      /* Set function and direction of start_code pin*/\
      P0SEL &= ~0x04; \
      P0DIR |= 0x04; \
      FPGA_START_CODE = 0; \
    }
    

    或者这个?

    static void fpga_init()
    { 
      /* Set function and direction of start_code pin*/
      P0SEL &= ~0x04; 
      P0DIR |= 0x04; 
      FPGA_START_CODE = 0; 
    }
    

    记忆位置有什么不同?

    6 回复  |  直到 9 年前
        1
  •  6
  •   Matthew Xavier    14 年前

    一般来说,最好在需要预处理器在编译代码之前操纵代码的能力时保留预处理器宏的使用——不应使用预处理器宏定义可以作为正常函数实现的过程。由于预处理器在调用宏的任何位置替换宏代码,因此很难调试发生的错误。例如,如果调用fpga_init()宏,则(可能)全局变量p0sel、p0dir和fpga_start_代码可能被同名的局部变量隐藏。

    如果您声明了一个fpga_init()函数,编译器将根据您所针对的平台所知道的任何规则,将该函数的代码和您声明的其他函数的代码放在一起。如果声明一个fpga_init()宏,编译器将永远不会知道它存在,因为对它的所有引用都将由预处理器解析;编译器将在它被调用的每个函数中分别查看和编译宏的语句。

    除非需要以很高的频率调用此代码(在内部循环中),否则宏和函数实现的性能可能是不可区分的。如果您确实需要频繁地调用代码,那么应该尝试每种方法来衡量性能:根据处理器的体系结构,使用预处理器将代码内联可能会更快,或者将代码放在单独的函数中可能会更快(尤其是当扩展每个调用会导致重要的循环溢出时)高速缓存行)

        2
  •  3
  •   kgiannakakis    14 年前

    如果使用宏,那么无论在何处使用宏,预处理器都会将其替换为整个宏体。这意味着如果你给它打10次电话,那么你需要10倍的记忆。但是,代码执行速度更快,因为不存在进行函数调用的开销。

    我通常会避免在函数中使用宏。宏很难调试和维护。如果需要就地代码,可以使用更清洁的解决方案 inline functions 这是大多数现代编译器所支持的。

        3
  •  1
  •   Vicky    14 年前

    宏可以节省操作期间函数调用的开销(速度)。

    函数可以节省在多个地方(程序空间)使用相同代码的开销。

    选择哪个速度和空间对你来说更重要,并使用适当的选项。

        4
  •  1
  •   Thomas Matthews    14 年前

    将函数放入头文件中,并用 inline 关键词:

    inline void fpga_init()
    { 
      /* Set function and direction of start_code pin*/
      P0SEL &= ~0x04; 
      P0DIR |= 0x04; 
      FPGA_START_CODE = 0; 
    }
    

    inline关键字建议编译器将语句与其他代码“inline”放在一起,类似于 #define 宏。这比宏更好,因为它的行为类似于一个函数,并且没有宏的缺陷。

        5
  •  0
  •   Puppy    14 年前

    Trust your compiler- make it a regular function, let the compiler pick what to do with it.

        6
  •  0
  •   S Dao    9 年前

    考虑对init代码使用宏以节省内存空间,因为init代码通常在使用后被删除。