(嵌入式)C:void function()或#define FUNCTION()

时间:2010-06-21 12:28:09

标签: c function static c-preprocessor

我正在编程嵌入式设备,我想知道如何使用宏功能,例如一些寄存器的初始化。 我应该使这个静态/ const或将其定义为宏吗?

例如,这个:

 #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 个答案:

答案 0 :(得分:6)

通常,当您需要预处理器的功能在编译之前操作代码时,最好保留使用预处理器宏 - 您不应该使用预处理器宏来定义可以实现的过程作为正常功能。因为预处理器会在调用宏的任何地方替换宏代码,所以很难调试发生的错误。例如,如果调用FPGA_INIT()宏,(可能)全局变量P0SEL,P0DIR和FPGA_START_CODE可能会被同名的本地人隐藏。

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

除非您需要以极高的频率调用此代码(在内部循环中),否则宏和函数实现的性能可能无法区分。如果确实需要经常调用代码,则应尝试以各种方式测量性能:根据处理器的体系结构,使用预处理器将代码内联放置可能会更快,或者使用代码可能更快在一个单独的函数中(特别是如果扩展每次调用都会导致一个重要的循环溢出缓存行)。

答案 1 :(得分:3)

如果您使用宏,那么无论您在何处使用它,预处理器都会将其替换为全身。这意味着如果你说它10次,那么你需要10倍的内存。但是代码执行得更快,因为没有进行函数调用的开销。

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

将函数放入头文件中,并使用inline关键字作为前缀:

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

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

答案 4 :(得分:0)

相信你的编译器 - 使它成为常规函数,让编译器选择如何处理它。

答案 5 :(得分:0)

考虑使用宏来实现init代码以节省内存空间,因为初始代码通常在使用后删除。