Bird
Raised Fist0
Embedded Cprogramming~20 mins

Volatile variables in ISR context in Embedded C - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Volatile ISR Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of volatile variable update in ISR

Consider the following embedded C code snippet where a variable is updated inside an Interrupt Service Routine (ISR). What will be the output printed by the main function?

Embedded C
#include <stdio.h>
#include <stdbool.h>

volatile int flag = 0;

void ISR() {
    flag = 1;
}

int main() {
    while (!flag) {
        // waiting for ISR to set flag
    }
    printf("Flag is set to %d\n", flag);
    return 0;
}
AFlag is set to 1
BFlag is set to 0
CProgram hangs (infinite loop)
DCompilation error due to volatile usage
Attempts:
2 left
💡 Hint

Think about how volatile tells the compiler about variable changes outside normal flow.

🧠 Conceptual
intermediate
1:30remaining
Why use volatile in ISR context?

Why is it important to declare variables shared between main code and an ISR as volatile in embedded C?

ATo prevent the compiler from optimizing out reads/writes to the variable
BTo make the variable thread-safe automatically
CTo allocate the variable in a special memory section
DTo increase the variable's size to 64 bits
Attempts:
2 left
💡 Hint

Think about what happens if the compiler assumes the variable never changes unexpectedly.

🔧 Debug
advanced
2:00remaining
Identify the bug with volatile and ISR

Examine the code below. The variable count is incremented in the ISR and read in main. The program sometimes hangs in the loop. What is the bug?

Embedded C
#include <stdio.h>

int count = 0;

void ISR() {
    count++;
}

int main() {
    while (count == 0) {
        // wait for ISR to increment count
    }
    printf("Count is %d\n", count);
    return 0;
}
AMissing return statement in ISR
BVariable 'count' should be declared volatile
CThe loop condition should be 'while(count != 0)'
DISR should not modify global variables
Attempts:
2 left
💡 Hint

Think about compiler optimizations and how the main loop sees the variable.

📝 Syntax
advanced
1:30remaining
Correct volatile declaration for ISR-shared variable

Which of the following declarations correctly declares a variable status shared between main code and an ISR to ensure proper behavior?

Avolatile int status = 0;
Bint volatile status = 0;
CA, B, and D
Dstatic volatile int status = 0;
Attempts:
2 left
💡 Hint

Consider C syntax rules for volatile and static keywords.

🚀 Application
expert
2:30remaining
Effect of missing volatile on ISR flag check

Given the code below, what is the most likely behavior when the flag variable is not declared volatile?

#include <stdio.h>

int flag = 0;

void ISR() {
    flag = 1;
}

int main() {
    while (!flag) {
        // wait for ISR
    }
    printf("Flag set\n");
    return 0;
}
AThe program will crash with a segmentation fault
BThe program will print 'Flag set' immediately
CThe program will print 'Flag set' twice
DThe program may hang indefinitely because the compiler optimizes the loop assuming 'flag' does not change
Attempts:
2 left
💡 Hint

Think about compiler optimizations and how they affect variables changed outside normal flow.

Practice

(1/5)
1. Why should a variable shared between an ISR (Interrupt Service Routine) and the main program be declared volatile?
easy
A. To allocate extra memory for the variable.
B. To tell the compiler the variable can change unexpectedly and prevent optimization errors.
C. To make the variable constant and unchangeable.
D. To speed up the program by caching the variable.

Solution

  1. Step 1: Understand the role of volatile

    The volatile keyword tells the compiler that the variable's value can change at any time, outside the normal program flow.
  2. Step 2: Apply to ISR context

    Since ISRs can change variables asynchronously, the compiler must always read the variable fresh, not use cached values.
  3. Final Answer:

    To tell the compiler the variable can change unexpectedly and prevent optimization errors. -> Option B
  4. Quick Check:

    Volatile prevents optimization errors in ISR variables = C [OK]
Hint: Volatile means 'may change anytime' to compiler [OK]
Common Mistakes:
  • Thinking volatile makes variable constant
  • Assuming volatile allocates more memory
  • Believing volatile speeds up code
2. Which of the following is the correct way to declare a variable flag that is modified inside an ISR?
easy
A. const int flag;
B. int flag;
C. volatile int flag;
D. static int flag;

Solution

  1. Step 1: Identify the need for volatile

    Since flag is changed inside an ISR, it must be declared volatile to prevent compiler optimizations.
  2. Step 2: Check declaration syntax

    The correct syntax is volatile int flag; which tells the compiler to always read the variable fresh.
  3. Final Answer:

    volatile int flag; -> Option C
  4. Quick Check:

    ISR-modified variable needs volatile keyword = A [OK]
Hint: Use volatile before type for ISR-shared variables [OK]
Common Mistakes:
  • Forgetting volatile keyword
  • Using const which prevents changes
  • Using static without volatile
3. Consider this code snippet:
volatile int flag = 0;

void ISR() {
    flag = 1;
}

int main() {
    while(flag == 0) {
        // wait for flag to change
    }
    return 0;
}
What will happen if flag was NOT declared volatile?
medium
A. The program will immediately exit the loop.
B. The program will crash at runtime.
C. The program will cause a compile-time error.
D. The program may loop forever because the compiler caches flag value.

Solution

  1. Step 1: Understand compiler optimization without volatile

    Without volatile, the compiler may assume flag does not change in the loop and cache its value.
  2. Step 2: Effect on the loop

    The loop condition flag == 0 may never be rechecked from memory, causing an infinite loop.
  3. Final Answer:

    The program may loop forever because the compiler caches flag value. -> Option D
  4. Quick Check:

    Missing volatile causes infinite loop due to caching = B [OK]
Hint: No volatile means compiler caches variable, causing infinite loops [OK]
Common Mistakes:
  • Thinking program crashes without volatile
  • Assuming compile error occurs
  • Believing loop exits immediately
4. Given this code, what is the main problem?
int flag = 0;

void ISR() {
    flag = 1;
}

int main() {
    while(flag == 0) {
        // wait
    }
    return 0;
}
medium
A. flag should be declared volatile to avoid optimization issues.
B. ISR function must return a value.
C. flag should be declared as const.
D. main() should not have a while loop.

Solution

  1. Step 1: Identify variable shared with ISR

    The variable flag is modified inside the ISR and read in main.
  2. Step 2: Check declaration for optimization safety

    Since flag is shared, it must be declared volatile to prevent the compiler from caching its value.
  3. Final Answer:

    flag should be declared volatile to avoid optimization issues. -> Option A
  4. Quick Check:

    Shared ISR variable needs volatile keyword = D [OK]
Hint: Always declare ISR-shared variables volatile [OK]
Common Mistakes:
  • Thinking ISR must return a value
  • Declaring shared variable const
  • Removing the loop instead of fixing volatile
5. You have a variable counter incremented inside an ISR and read in the main loop. Which of these is the best way to safely read counter in main without race conditions?
hard
A. Declare volatile int counter and disable interrupts briefly while reading it in main.
B. Declare volatile int counter and read it directly in main.
C. Declare int counter without volatile and read it directly.
D. Declare const int counter and read it in main.

Solution

  1. Step 1: Understand volatile role

    Declaring counter volatile ensures main reads fresh value, but does not prevent partial updates during read.
  2. Step 2: Prevent race conditions

    Disabling interrupts briefly while reading counter prevents ISR from changing it mid-read, avoiding inconsistent values.
  3. Final Answer:

    Declare volatile int counter and disable interrupts briefly while reading it in main. -> Option A
  4. Quick Check:

    Volatile + interrupt disable ensures safe multi-byte read = A [OK]
Hint: Disable interrupts briefly when reading multi-byte volatile variables [OK]
Common Mistakes:
  • Assuming volatile alone prevents race conditions
  • Not disabling interrupts during read
  • Using const which prevents changes
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard