我正在努力了解AVR微控制器的twi库,并查看.h文件,静态说明符有以下变量。
所以,这个库中的所有变量都以static为前缀,有些变量与volatile和void结合,只有一个是静态的。
那么,每个组合对这个特定库的作用是什么?我的意思是这将如何影响代码的整体行为。
以下是我在twi.c中找到的变量,我在这里了解到,只能在.c文件中声明和定义变量,而不在.h文件中声明它们。您还可以在.c文件中初始化或取消初始化它们。我的猜测是真的吗?
static volatile uint8_t twi_state;
static volatile uint8_t twi_slarw;
static volatile uint8_t twi_sendStop; // should the transaction end with a stop
static volatile uint8_t twi_inRepStart; // in the middle of a repeated start
static void (*twi_onSlaveTransmit)(void);
static void (*twi_onSlaveReceive)(uint8_t*, int);
static uint8_t twi_masterBuffer[TWI_BUFFER_LENGTH];
static volatile uint8_t twi_masterBufferIndex;
static volatile uint8_t twi_masterBufferLength;
static uint8_t twi_txBuffer[TWI_BUFFER_LENGTH];
static volatile uint8_t twi_txBufferIndex;
static volatile uint8_t twi_txBufferLength;
static uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH];
static volatile uint8_t twi_rxBufferIndex;
static volatile uint8_t twi_error;
此致
答案 0 :(得分:4)
static - 在这种情况下,变量仅在当前文件中可见
volatile - 它是编译器的一个信息,可以通过正常执行路径之外的某些东西(例如中断例程)更改对象,并保证在任何使用之前读取变量并在每次更改之后写入。 volatile(这是一个非常常见的误解)并不保证其他任何东西 - 没有原子性,没有缓存一致性等等
答案 1 :(得分:1)
对于关键字static
和volatile
,写得足够......
参见例如:
在TWI接口的关注中,需要voltatile
,因为可以从不同的中断服务处理程序调用修改这些变量的函数。如果volatile
将被删除,编译器将优化代码,而不知道代码可以被中断。这可能会导致失败。
答案 2 :(得分:0)
静态: 静态变量是指在所有实例之间共享的类变量。
易失性: 易失性变量是可读写的变量。没有存储在本地缓存中,总是从主内存中获取。 例如,如果使用2个线程,则说private volatile int x; 如果线程A的write(x)和线程B的read(x),则它在不使用线程本地缓存的情况下从主内存中写入和读取的时间。
静态挥发物: 即使静态变量是共享变量,但在不同的线程中,线程的本地缓存中的静态变量的值也可能不同。为了使其与所有线程保持一致,只需将其声明为静态volatile。因此,每次它将从主内存中获取。