Title Image

Blog Logo

Core 14. RTOS - Heap Memory Management

🌱 Core 14. RTOS - Heap Memory Management

    Ở post trước chúng ta đã cùng tìm hiểu về phần cứng sử dụng để xây dựng một hệ điều hành RTOS. Một hệ điều hành RTOS trên vi điều khiển bao gồm các task được phân bổ bộ nhớ trên vùng nhớ Heap (Thuộc RAM). Việc cấp phát và quản lý bộ nhớ này là vô cùng quan trọng. 

💛 Bài viết này là phần tìm hiểu của bạn Đặng Văn Sơn, người anh em cùng team FPT. Mình xin gửi lời cảm ơn của anh em đọc được bài viết này đến bạn. 

    Về cơ bản, trong RTOS cần quản lý RTOS cho các yếu tố: các Tasks, cho các cơ chế Semaphore, Queue, Mutex, và việc cấp phát động (Dynamic memory allocation). Như các bạn đã biết thì vùng nhớ Heap trên RAM sẽ thường được sử dụng với hàm malloc() và free() trong C. Tức là vùng nhớ này có thể dùng để cấp phát động cho một biến/mảng/..., sau đó có thể giải phóng để tiết kiệm bộ nhớ. 

Heap Memory Management

    Có 5 cách cơ bản để cấp phát bộ nhớ cho RTOS:

    👉 Heap_1: Đây là cách cấp phát cơ bản nhất và không cho phép giải phóng bộ nhớ.

Heap_1

    Cách này rất đơn giản là cấp một mảng cố định trên Heap để đặt các Task vào. Mỗi task bao gồm TCB + Stack như đã nói ở bài trước.
  • Ưu điểm của phương pháp triên khai này là đơn giản, dễ sử dụng, chỉ cần cấp phát mảng tĩnh cố định trên Heap.
  • Nhược điểm của nó là không giải phóng bộ nhớ được, nên chỉ dùng với những ứng dụng mà chúng ta không cần xóa các Task, Semaphore, Mutex, ... 

    👉 Heap_2: cho phép giải phóng bộ nhớ, nhưng không đặt các vùng Task cạnh nhau. 

Heap_2
    Cách cấp phát này giống như cách cấp phát ở Heap_1 là dùng một mảng để chứa các Task, nhưng nó cho phép giải phóng các vùng nhớ của các Task.
    Chẳng hạn trong ví dụ trên, Task thứ 2 (ở giữa) được free(), nhưng Task trên cùng sẽ không được sắp xếp cạnh Task dưới cùng mà vẫn giữ nguyên vị trí của nó.
    Cách này có thể gây ra phân mảng bộ nhớ, nếu như không biết trước được kích thước của các Task sử dụng.

    👉 Heap_3: Cách này sử dùng các hàm theo thư viện chuẩn C, đó là malloc() và free() để cấp phát và giải phóng bộ nhớ. 

Heap_3

    Để triển khai được Heap_3, dùng thư viện chuẩn trong C thì vi điều khiển cần được xác định một vùng nhớ heap bằng linker (Vì trong vi điều khiển chỉ phân biệt FLASH, RAM, không phân biệt rõ ràng đâu là Heap, đâu là Stack, nên cần quy định đâu là Heap trong file Linker Script).

    👉 Heap_4: Giống như Heap_2 tuy nhiên cho phép sử dụng lại các vùng Free Space.

Heap_4

    Vùng nhớ Task sau khi free() sẽ là vùng free space. Vùng nhớ này ở Heap_2 sẽ không được sử dụng, có thể gây ra phân mảng bộ nhớ. Khác với Heap_2, Heap_4 cho phép sử dụng vùng nhớ này.

    👉 Heap_5: Không giống như Heap_4, Heap_5 không bị giới hạn trong việc cấp phát bộ nhớ từ một mảng được khai báo tĩnh duy nhất; Heap_5 có thể cấp phát bộ nhớ từ nhiều không gian bộ nhớ riêng biệt.

Heap_5

    Điều này khá hữu ích khi RAM được phân cách thành nhiều vùng như hình trên.

    👉 Các cách phân bổ bộ nhớ trên Heap khác quan trọng khi thiết kế RTOS, tùy vào ứng dụng cụ thể cũng như tài nguyên của hệ thống, chúng ta sẽ có những cách thiết kế khác nhau.

>>>= Follow ngay =<<<

Để theo dõi những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

                                        

Đăng nhận xét

0 Nhận xét