0
0
Power-electronicsHow-ToBeginner · 4 min read

How to Optimize Memory Usage in Embedded C Efficiently

To optimize memory usage in embedded C, use static and const keywords to limit variable scope and store constants in flash memory. Also, prefer smaller data types and avoid dynamic memory allocation to reduce fragmentation and overhead.
📐

Syntax

Here are key syntax elements to optimize memory in embedded C:

  • static: Limits variable scope to the file or function, preventing unnecessary memory usage.
  • const: Stores data in read-only memory (flash) instead of RAM.
  • Use smaller data types like uint8_t or uint16_t instead of int when possible.
  • Avoid malloc() and free() to prevent heap fragmentation.
c
static int counter = 0;  // persists in memory but limited to this file
const char message[] = "Hello";  // stored in flash memory
uint8_t smallNumber = 255;  // uses 1 byte instead of 4 bytes for int
💻

Example

This example shows how to use static and const to save RAM and how choosing smaller data types helps reduce memory usage.

c
#include <stdio.h>
#include <stdint.h>

// Static variable keeps value between calls but is local to this file
static uint8_t call_count = 0;

// Constant string stored in flash memory
const char greeting[] = "Hi Embedded!";

void printGreeting() {
    call_count++;
    printf("%s Call number: %u\n", greeting, call_count);
}

int main() {
    for (int i = 0; i < 3; i++) {
        printGreeting();
    }
    return 0;
}
Output
Hi Embedded! Call number: 1 Hi Embedded! Call number: 2 Hi Embedded! Call number: 3
⚠️

Common Pitfalls

Common mistakes that waste memory include:

  • Using large data types unnecessarily, e.g., int instead of uint8_t.
  • Declaring global variables without static, increasing memory scope.
  • Using dynamic memory allocation (malloc) in embedded systems causing fragmentation.
  • Not marking constant data as const, causing it to use RAM instead of flash.
c
#include <stdio.h>

// Wrong: global variable accessible everywhere, wastes memory
int globalCounter = 0;

// Right: static limits scope and lifetime
static int staticCounter = 0;

void incrementCounters() {
    globalCounter++;
    staticCounter++;
    printf("Global: %d, Static: %d\n", globalCounter, staticCounter);
}

int main() {
    incrementCounters();
    incrementCounters();
    return 0;
}
Output
Global: 1, Static: 1 Global: 2, Static: 2
📊

Quick Reference

Summary tips to optimize memory usage in embedded C:

  • Use static to limit variable scope and lifetime.
  • Mark constant data with const to store in flash memory.
  • Choose the smallest suitable data type (e.g., uint8_t instead of int).
  • Avoid dynamic memory allocation to prevent fragmentation.
  • Reuse variables and buffers when possible.

Key Takeaways

Use static and const to reduce RAM usage and limit variable scope.
Choose the smallest data type that fits your data to save memory.
Avoid dynamic memory allocation to prevent fragmentation and leaks.
Store constant data in flash memory by marking it const.
Reuse buffers and variables to minimize memory footprint.