I want to know why to declare variables with static volatile and arrays with only static in TWI library?
For example;
static uint8_t twi_masterBuffer[TWI_BUFFER_LENGTH];
static volatile uint8_t twi_masterBufferIndex;
static volatile uint8_t twi_masterBufferLength;
1 Answer 1
You use volatile
to mark variables that are going to change at any moment, in a ISR (Interrupt Service Routine) typically.
You mark them so the compiler doesn't optimize, and always go and pick its actual value. If you don't do that, then an ISR may update a variable while the main "thread" of execution keeps using its old value. That's is a nasty situation to debug.
You only need to mark variables that are used both in the ISR and in the main sketch. If twi_masterBuffer
is not changed inside an ISR, you don't need to mark it with volatile
.
static
is used inside function to mark variables that need to be permanent, i.e., keep their values between calls, but not accessible from outside that function.
-
I'm studying the TWI library, to modify my I2C library because my I2C library has a bug, and I went back to learn about the well professional written code for I2C which is the TWI library. So, I'm going through C techniques of coding. And, now this is going more difficult to me because after looking over and over to the code, I looked to the ISR and it has operations of sending and receiving data, then what's going in the actual functions?R1S8K– R1S8K2017年11月21日 20:08:08 +00:00Commented Nov 21, 2017 at 20:08
-
static and volatile are a different aspect of programming, but very related, because I have to understand what actual functions do and what ISR also do, and then I may understand what static and volatile means.R1S8K– R1S8K2017年11月21日 20:12:22 +00:00Commented Nov 21, 2017 at 20:12
-
static variables are declared at the head of the .c code, they are not inside any function, so how would they be used from outside the function? Or, the static goal here is to keep the values of these variables constant between all the functions inside TWI library, right?R1S8K– R1S8K2017年11月21日 20:14:56 +00:00Commented Nov 21, 2017 at 20:14
-
@PerchEagle. You are confusing
static
withconst
.user31481– user314812017年11月21日 20:19:35 +00:00Commented Nov 21, 2017 at 20:19 -
1@PerchEagle. Static global variable means: this variable is global to all functions in the file (.ino) where it's declared, and unknow in other files (.ino). Non-static global variable means they are global across all files in the project. It's not about the value; it's about where it's allocated (heap vs stack), what is his lifetime (forever vs only during that particular function call), and where it's know (one file vs all files in the project). C/C++ is tricky, tricky.user31481– user314812017年11月21日 21:02:11 +00:00Commented Nov 21, 2017 at 21:02
volatile
does?