全局变量与ARM C中main中声明的变量之间的差异

nik*_*par 5 c microcontroller arm global keil

我一直在试图用CKeil写我的一些测试代码TM4C123G,它使用的ARM微控制器.我不知道ARM assembly,但我已经为AVR microcontroller过去编写了一些汇编代码.

存储变量的值在哪里,如果我们在C中声明一个变量global,而不是声明它main

关于是否应该声明一个变量global而不是main(在为微控制器编写C时)是否有一般指导原则?

Mic*_*gan 3

ARM 中的全局变量会导致在调用函数的“池”区域中放置一个偏移量。一般来说,每个全局都需要自己的偏移量。如果您决定使用全局变量,请将它们放入单个结构中,以便可以通过单个池偏移量访问所有变量。

在函数级别定义的变量位于堆栈中。在合理范围内,可以通过堆栈寄存器的更简单的偏移量来访问这些,并且往往是更有效的操作码明智,也许是缓存明智,具体取决于您使用的系统类型。

什么时候使用其中一个?除了全局与局部的可维护性圣战之外,这取决于您的代码还想做什么。如果某个变量在很多地方使用,并且您不想将其作为参数传递(这表明您的设计可能需要工作......),那么全局将是最佳选择。如果您需要跨多个汇编程序包访问此变量(再次设计...)那么也许全局也可以。

但大多数时候,我会使用局部变量。它们的线程安全性更高,而且从上面来看,它们往往更高效。它们也更容易维护,因为范围更加有限——这也有助于编译器更好地完成这些工作。