Bird
Raised Fist0
Embedded Cprogramming~5 mins

Double buffer technique in Embedded C

Choose your learning style10 modes available
Introduction

The double buffer technique helps to show smooth images or data updates without flickering or tearing.

When drawing graphics on a screen to avoid flickering.
When updating data that is read and written at the same time.
When you want to prepare new data while the old data is still being used.
When working with animations to make them look smooth.
When handling input/output buffers in embedded systems to prevent glitches.
Syntax
Embedded C
char buffer1[SIZE];
char buffer2[SIZE];
char *frontBuffer = buffer1;
char *backBuffer = buffer2;

// Write to backBuffer
// Swap pointers to display new data

You use two buffers: one to show data (front buffer) and one to prepare new data (back buffer).

After preparing data in the back buffer, you swap the buffers to update the display or output.

Examples
This example fills the back buffer with numbers and then swaps the buffers to update the front buffer.
Embedded C
char buf1[100];
char buf2[100];
char *frontBuffer = buf1;
char *backBuffer = buf2;

// Fill backBuffer with new data
for(int i = 0; i < 100; i++) {
    backBuffer[i] = i;
}

// Swap buffers
char *temp = frontBuffer;
frontBuffer = backBuffer;
backBuffer = temp;
Using a struct for the buffer, this example prepares pixel data and swaps the buffers.
Embedded C
typedef struct {
    int pixels[50];
} FrameBuffer;

FrameBuffer bufferA, bufferB;
FrameBuffer *front = &bufferA;
FrameBuffer *back = &bufferB;

// Prepare back buffer
for(int i = 0; i < 50; i++) {
    back->pixels[i] = i * 2;
}

// Swap
FrameBuffer *temp = front;
front = back;
back = temp;
Sample Program

This program fills the back buffer with letters, swaps the buffers, and prints the front buffer to show the updated data.

Embedded C
#include <stdio.h>

#define SIZE 5

int main() {
    char buffer1[SIZE] = {0};
    char buffer2[SIZE] = {0};
    char *frontBuffer = buffer1;
    char *backBuffer = buffer2;

    // Prepare backBuffer with data
    for(int i = 0; i < SIZE; i++) {
        backBuffer[i] = 'A' + i; // Fill with letters A, B, C, ...
    }

    // Swap buffers
    char *temp = frontBuffer;
    frontBuffer = backBuffer;
    backBuffer = temp;

    // Print frontBuffer content
    printf("Front buffer content: ");
    for(int i = 0; i < SIZE; i++) {
        printf("%c ", frontBuffer[i]);
    }
    printf("\n");

    return 0;
}
OutputSuccess
Important Notes

Always swap pointers, not the whole buffer data, to save time and memory.

Make sure to prepare the back buffer fully before swapping to avoid showing incomplete data.

Summary

Double buffering uses two buffers to avoid flickering and tearing.

Prepare data in the back buffer while the front buffer is displayed.

Swap buffers to update the display smoothly.

Practice

(1/5)
1. What is the main purpose of using the double buffer technique in embedded systems?
easy
A. To prevent flickering and tearing on the display
B. To increase the CPU clock speed
C. To reduce memory usage by using only one buffer
D. To simplify the code by avoiding buffer swaps

Solution

  1. Step 1: Understand flickering and tearing issues

    Flickering and tearing happen when the display updates while drawing is in progress.
  2. Step 2: Role of double buffering

    Double buffering uses two buffers so one can be drawn while the other is shown, preventing flicker.
  3. Final Answer:

    To prevent flickering and tearing on the display -> Option A
  4. Quick Check:

    Double buffering = prevent flickering [OK]
Hint: Double buffer means two buffers for smooth display updates [OK]
Common Mistakes:
  • Thinking double buffer reduces CPU speed
  • Believing it uses less memory
  • Assuming it avoids buffer swaps
2. Which of the following code snippets correctly declares two buffers for double buffering in embedded C?
easy
A. char buffer[128]; char buffer[128];
B. char buffer1[128]; char buffer2[128];
C. char buffer1; char buffer2;
D. int buffer1[128]; char buffer2[64];

Solution

  1. Step 1: Check buffer declarations

    Buffers must be arrays of the same size and type to hold display data.
  2. Step 2: Validate each option

    char buffer1[128]; char buffer2[128]; declares two char arrays of size 128, suitable for double buffering.
  3. Final Answer:

    char buffer1[128]; char buffer2[128]; -> Option B
  4. Quick Check:

    Two same-size arrays = correct buffers [OK]
Hint: Two buffers must be separate arrays of same size [OK]
Common Mistakes:
  • Declaring two arrays with the same name
  • Using single variables instead of arrays
  • Using different sizes or types for buffers
3. Consider this code snippet using double buffering:
char frontBuffer[5] = {1, 2, 3, 4, 5};
char backBuffer[5] = {6, 7, 8, 9, 10};

// Swap buffers
char *temp = frontBuffer;
frontBuffer = backBuffer;
backBuffer = temp;

printf("%d", frontBuffer[0]);
What will be the output?
medium
A. Compilation error
B. 6
C. 1
D. Runtime error

Solution

  1. Step 1: Analyze buffer declarations

    frontBuffer and backBuffer are arrays, not pointers, so they cannot be assigned directly.
  2. Step 2: Understand pointer assignment error

    Assigning arrays like pointers causes compilation error in C.
  3. Final Answer:

    Compilation error -> Option A
  4. Quick Check:

    Arrays cannot be assigned directly = compilation error [OK]
Hint: Arrays can't be assigned directly in C [OK]
Common Mistakes:
  • Assuming arrays can be swapped by assignment
  • Expecting output 6 without fixing code
  • Ignoring pointer vs array difference
4. The following code attempts to implement double buffering but causes flickering. What is the likely bug?
char buffer1[100];
char buffer2[100];
char *front = buffer1;
char *back = buffer2;

void updateDisplay() {
  // Draw to back buffer
  for (int i = 0; i < 100; i++) {
    back[i] = i;
  }
  // Swap buffers
  front = back;
  back = front;
}
medium
A. Buffers should be global, not local
B. Buffers are too small for display data
C. Buffers are not swapped correctly; back and front point to same buffer
D. Drawing loop uses wrong index range

Solution

  1. Step 1: Examine buffer swap logic

    Swapping front and back pointers as done causes both to point to the same buffer.
  2. Step 2: Identify correct swap method

    Need a temporary pointer to swap buffers properly to avoid flickering.
  3. Final Answer:

    Buffers are not swapped correctly; back and front point to same buffer -> Option C
  4. Quick Check:

    Incorrect pointer swap = flickering [OK]
Hint: Use temp pointer to swap buffers correctly [OK]
Common Mistakes:
  • Swapping pointers without temp variable
  • Assuming buffers auto-swap
  • Ignoring flicker cause from wrong swap
5. You want to implement double buffering for a 2D LED matrix display of size 8x8. Which approach correctly updates the display without flicker?
char frontBuffer[8][8];
char backBuffer[8][8];

void drawPixel(int x, int y, char value) {
  backBuffer[x][y] = value;
}

void swapBuffers() {
  // Swap pointers to buffers
  char (*temp)[8] = frontBuffer;
  frontBuffer = backBuffer;
  backBuffer = temp;
}

void refreshDisplay() {
  // Send frontBuffer data to LED matrix hardware
}
What is the main problem with this code?
hard
A. refreshDisplay should clear backBuffer before swapping
B. drawPixel writes to frontBuffer instead of backBuffer
C. swapBuffers uses wrong pointer type for temp
D. Cannot assign arrays directly; frontBuffer and backBuffer are arrays, not pointers

Solution

  1. Step 1: Understand array vs pointer assignment

    In C, arrays cannot be assigned directly; frontBuffer and backBuffer are arrays, not pointers.
  2. Step 2: Identify correct buffer swapping method

    To swap buffers, pointers to arrays should be used instead of arrays themselves.
  3. Final Answer:

    Cannot assign arrays directly; frontBuffer and backBuffer are arrays, not pointers -> Option D
  4. Quick Check:

    Arrays can't be swapped by assignment = problem [OK]
Hint: Use pointers to arrays for swapping buffers [OK]
Common Mistakes:
  • Trying to assign arrays directly
  • Ignoring pointer type mismatch
  • Assuming drawPixel writes to wrong buffer
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