RAM (Random Access Memory)

CHUNG COCHUNG CO
5 min read

🧠 1. Tổng quan về RAM trong Embedded Systems

✅ RAM là gì và dùng để làm gì?

  • RAM (Random Access Memory) là bộ nhớ dễ bay hơi (volatile), dùng trong thời gian chương trình đang chạy để:

    • Lưu trữ biến tạm thời (local, global, static)

    • Duy trì stack (cho function calls)

    • Quản lý heap (malloc/free)

    • Làm buffer, cache, vùng trao đổi dữ liệu.

✅ So sánh RAMFlash

Đặc điểmRAM (SRAM)Flash (ROM)
Tốc độRất nhanh (nanosecond level)Chậm hơn (microsecond level)
Dữ liệuMất khi mất điện (volatile)Lưu trữ lâu dài (non-volatile)
Sử dụngDùng trong runtimeLưu trữ firmware/code/constants
Viết/ĐọcNhanh, không giới hạnGiới hạn số lần ghi
Chi phí/Số lượngĐắt, giới hạn vài KB – MBRẻ hơn, thường có nhiều hơn

⚠️ STM32 có thể chỉ có từ 16KB đến 512KB RAM, vì RAM tốn silicon và tiêu thụ điện nhiều hơn.


🧩 2. Phân tích từng vùng nhớ trong RAM

Dưới đây là cấu trúc điển hình khi sử dụng RAM:

sqlSao chépChỉnh sửa+----------------------+ ← Low Address (start of RAM)
| .data / .bss         |  → Static & global variables
|----------------------|
| Heap                 |  → malloc/free allocation
|   ↑ grows upward     |
|----------------------|
|                      |
|      Unused RAM      |
|                      |
|----------------------|
| Stack                |  → Function calls, local vars
|   ↓ grows downward   |
+----------------------+ ← High Address (end of RAM)

📌 3. Chi tiết từng vùng nhớ

🟩 STACK

✅ Hoạt động:

  • Cơ chế LIFO (Last-In First-Out).

  • Tự động quản lý bởi CPU và compiler (developer chỉ cần viết code bình thường).

  • Mỗi lần gọi hàm → stack frame được tạo.

✅ Lưu gì?

  • Local variables trong hàm

  • Địa chỉ return

  • Context của hàm (thanh ghi...)

⚠️ Nguy cơ Stack Overflow:

  • Khi stack chạm vùng heap hoặc giới hạn RAM → ghi đè dữ liệu.

  • Nguy hiểm trong hệ thống nhúng vì dễ crash hoặc hành vi không xác định.

✅ Cách phòng tránh:

  • Hạn chế đệ quy.

  • Tránh biến cục bộ lớn.

  • Dùng static thay vì local nếu cần giữ giá trị.

  • Trên RTOS (FreeRTOS): mỗi task có stack riêng → phân tích kỹ task stack size.


🟨 HEAP

✅ Hoạt động:

  • Dùng cho cấp phát động (malloc, calloc, free).

  • Không có cơ chế tự động quản lý (developer phải chủ động free()).

✅ Rủi ro:

  • Memory Fragmentation: nhiều mảng nhỏ rải rác không liền kề.

  • Memory Leak: không giải phóng heap → cạn kiệt RAM.

⚠️ Một số hệ thống cấm dùng heap:

  • Vì khó quản lý trong real-time systems.

  • Gây chậm trễ, không xác định thời gian cấp phát.


🟦 STATIC / DATA SECTION (.data, .bss)

Loại biếnSectionĐặc điểm
int global_var;.bssChưa khởi tạo → mặc định là 0
static int s = 10;.dataĐã khởi tạo → nạp từ Flash vào RAM
const int val = 5;.rodata (Flash)Không nằm trong RAM
  • Tồn tại suốt đời chương trình.

  • Dữ liệu khởi tạo được copy từ Flash vào RAM khi khởi động.


💻 4. Code minh họa vùng nhớ

cSao chépChỉnh sửaint global_var;               // .bss (chưa khởi tạo)
static int static_var = 10;   // .data (đã khởi tạo)

void foo() {
    int local_var;            // Stack
    static int local_static;  // .bss (.data nếu khởi tạo)
    int *ptr = malloc(100);   // Heap
}

🧾 5. Map file – Compiler Memory Map

Dùng file .map từ linker để kiểm tra:

textSao chépChỉnh sửa.bss        0x20000000    0x400
.data       0x20000400    0x200
.stack      0x20000800    0x1000

→ Cho biết bộ nhớ sử dụng ở đâu, vùng nào chiếm bao nhiêu byte.


🔧 6. Tối ưu bộ nhớ trong Embedded Systems

✅ Giảm stack usage:

  • Dùng biến static nếu không cần reset mỗi lần gọi.

  • Tránh đệ quy.

  • Hạn chế truyền struct lớn theo kiểu pass-by-value.

✅ Quản lý heap:

  • Tránh dùng malloc trong vòng lặp hoặc ISR.

  • Cân nhắc sử dụng memory pool hoặc quản lý thủ công.

✅ Tool hỗ trợ:

  • FreeRTOS: uxTaskGetStackHighWaterMark()

  • GCC: kiểm tra .map, -fstack-usage, -Wstack-usage

  • Keil: Runtime stack overflow detection, Symbol viewer


📘 7. Gợi ý tài liệu đọc thêm

  • 📘 The C Programming Language – Brian W. Kernighan & Dennis M. Ritchie

  • 📘 Embedded Systems in C – Michael Barr

  • 📘 Definitive Guide to ARM Cortex-M – Joseph Yiu

  • 📘 Linker Script & Memory Map in Embedded – STM32 CubeIDE doc + GNU Linker Manual


❓ Một vài câu hỏi thực chiến thú vị

  • Làm sao để tính stack tối ưu cho task trong FreeRTOS?
    → Dùng uxTaskGetStackHighWaterMark() trong thời gian thực để đo mức thấp nhất còn trống.

  • Tại sao một số hệ thống cấm heap?
    → Vì heap fragmentationkhông đảm bảo thời gian thực (real-time).

  • Cách debug stack overflow trong Keil?
    → Sử dụng:

    • __stack trong map file

    • Bật Stack Overflow Checking

    • Quan sát call stack hoặc check HardFault handler.

0
Subscribe to my newsletter

Read articles from CHUNG CO directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

CHUNG CO
CHUNG CO