Bird
Raised Fist0
Embedded Cprogramming~5 mins

Polling vs interrupt-driven execution in Embedded C

Choose your learning style10 modes available
Introduction

Polling and interrupt-driven execution are two ways a program can check for and respond to events. They help the program know when something important happens.

When you want to keep checking a sensor regularly to see if it changed.
When you want the program to do other tasks and only respond when a button is pressed.
When you want to save power by letting the processor sleep until something happens.
When you need fast response to an event without waiting.
When your program is simple and can afford to check events in a loop.
Syntax
Embedded C
/* Polling example */
while(1) {
    if (event_flag) {
        handle_event();
        event_flag = 0;
    }
}

/* Interrupt-driven example */
void ISR() {
    handle_event();
}

int main() {
    enable_interrupts();
    while(1) {
        // main tasks
    }
}

Polling uses a loop to check for events repeatedly.

Interrupt-driven uses special functions called ISRs that run automatically when events happen.

Examples
The program keeps checking if the button is pressed and turns on the LED when it is.
Embedded C
/* Polling: Check button press in a loop */
while(1) {
    if (button_pressed()) {
        turn_on_led();
    }
}
The LED turns on automatically when the button is pressed, without checking in the loop.
Embedded C
/* Interrupt-driven: Button press triggers ISR */
void button_ISR() {
    turn_on_led();
}

int main() {
    enable_button_interrupt();
    while(1) {
        // other tasks
    }
}
Sample Program

This program simulates checking for an event in a loop. Every two loops, it sets an event flag. When the flag is set, it handles the event and clears the flag.

Embedded C
/* Simple polling example */
#include <stdio.h>
#include <stdbool.h>

bool event_flag = false;

void handle_event() {
    printf("Event handled!\n");
}

int main() {
    int counter = 0;
    while(counter < 5) {
        // Simulate event every 2 loops
        if (counter % 2 == 0) {
            event_flag = true;
        }

        if (event_flag) {
            handle_event();
            event_flag = false;
        }
        counter++;
    }
    return 0;
}
OutputSuccess
Important Notes

Polling can waste CPU time if events are rare because it keeps checking.

Interrupts let the CPU do other work or sleep until an event happens, saving power.

Interrupts need careful programming to avoid conflicts and bugs.

Summary

Polling checks for events repeatedly in a loop.

Interrupt-driven execution responds to events automatically using special functions.

Use polling for simple or fast-check needs; use interrupts for efficient and responsive programs.

Practice

(1/5)
1. Which statement best describes polling in embedded C programming?
easy
A. Polling repeatedly checks for an event in a loop.
B. Polling uses special functions to respond automatically to events.
C. Polling is more efficient than interrupt-driven execution.
D. Polling disables all hardware interrupts.

Solution

  1. Step 1: Understand polling concept

    Polling means the program continuously checks if an event has happened by running a loop.
  2. Step 2: Compare options

    Polling repeatedly checks for an event in a loop. correctly states polling as repeated checking. Options A, B, and C describe interrupts or incorrect facts.
  3. Final Answer:

    Polling repeatedly checks for an event in a loop. -> Option A
  4. Quick Check:

    Polling = repeated checking [OK]
Hint: Polling means checking repeatedly in a loop [OK]
Common Mistakes:
  • Confusing polling with interrupts
  • Thinking polling is automatic
  • Assuming polling disables interrupts
2. Which of the following is the correct way to declare an interrupt service routine (ISR) in embedded C?
easy
A. void ISR() { /* code */ }
B. __interrupt void ISR() { /* code */ }
C. void interrupt ISR() { /* code */ }
D. interrupt void ISR() { /* code */ }

Solution

  1. Step 1: Recall ISR declaration syntax

    In many embedded C compilers, the keyword __interrupt before the function declares it as an ISR.
  2. Step 2: Check options

    __interrupt void ISR() { /* code */ } uses __interrupt correctly. Options A, B, and D use incorrect or incomplete syntax.
  3. Final Answer:

    __interrupt void ISR() { /* code */ } -> Option B
  4. Quick Check:

    ISR declaration = __interrupt keyword [OK]
Hint: ISR functions use __interrupt keyword before return type [OK]
Common Mistakes:
  • Omitting __interrupt keyword
  • Placing interrupt keyword after void
  • Using plain void without interrupt
3. Consider this embedded C code snippet using polling:
while(1) {
  if (button_pressed()) {
    toggle_led();
  }
}
What happens when the button is pressed?
medium
A. The LED never toggles because interrupts are disabled.
B. The LED toggles only after the loop finishes.
C. The LED toggles immediately when the button is pressed.
D. The LED toggles only if an interrupt triggers.

Solution

  1. Step 1: Analyze the polling loop

    The loop continuously checks if button_pressed() returns true, then calls toggle_led() immediately.
  2. Step 2: Understand behavior on button press

    When the button is pressed, button_pressed() becomes true, so toggle_led() runs right away.
  3. Final Answer:

    The LED toggles immediately when the button is pressed. -> Option C
  4. Quick Check:

    Polling triggers action immediately on event [OK]
Hint: Polling checks and acts immediately inside the loop [OK]
Common Mistakes:
  • Thinking toggle waits for loop end
  • Confusing polling with interrupts
  • Assuming interrupts are required
4. This code tries to use interrupts but has a bug:
void ISR() {
  toggle_led();
}

int main() {
  enable_interrupts();
  while(1) {}
}
What is the main problem?
medium
A. enable_interrupts() is called inside main loop.
B. The main loop should not be infinite.
C. toggle_led() cannot be called inside ISR.
D. ISR is missing the __interrupt keyword.

Solution

  1. Step 1: Check ISR declaration

    The ISR function lacks the __interrupt keyword, so it won't be recognized as an interrupt handler.
  2. Step 2: Review other code parts

    enable_interrupts() is correctly called once; toggle_led() can be called in ISR; infinite loop is normal in embedded main.
  3. Final Answer:

    ISR is missing the __interrupt keyword. -> Option D
  4. Quick Check:

    ISR needs __interrupt keyword [OK]
Hint: ISR must have __interrupt keyword to work [OK]
Common Mistakes:
  • Forgetting __interrupt keyword
  • Thinking infinite loop is wrong
  • Assuming toggle_led() is invalid in ISR
5. You want to design a program that reads a sensor value only when it changes, without wasting CPU time checking constantly. Which method is best?
hard
A. Use an interrupt triggered by the sensor change.
B. Use polling to check sensor value in a tight loop.
C. Use a delay loop to check sensor every second.
D. Use a timer to poll sensor every millisecond.

Solution

  1. Step 1: Understand the requirement

    The program should react only when the sensor changes and avoid wasting CPU time on constant checking.
  2. Step 2: Compare methods

    Polling (options B, C, D) wastes CPU by checking repeatedly. Interrupt (Use an interrupt triggered by the sensor change.) triggers only on change, saving CPU.
  3. Final Answer:

    Use an interrupt triggered by the sensor change. -> Option A
  4. Quick Check:

    Interrupts save CPU by reacting only on events [OK]
Hint: Use interrupts to react only when events happen [OK]
Common Mistakes:
  • Choosing polling for efficiency
  • Using delays wastes CPU
  • Confusing timer polling with interrupts
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