Title Image

Blog Logo

Core 13. Các thành phần cơ bản để xây dựng RTOS

🌱 Core 13. Các thành phần cơ bản để xây dựng RTOS

    Ở post này mình sẽ giới thiệu về các thành phần cơ bản để xây dựng nên một hệ điều hành RTOS. Vi điều khiển thực chất hoạt động rất đơn giản, bao gồm phần cứng - Hardware để lưu chương trình và dữ liệu, phần Firmware để nạp xuống phần cứng đó. Vì vậy, hệ điều hành cũng được xây dựng không ngoài 2 yếu tố này, đó là Hardware và Firmware (hay chương trình code).

    👉 Phần cứng cần sử dụng - Hardware

    Cũng là một phần trong chương trình, nên tất nhiên RTOS cũng sẽ chiếm một phần trong bộ nhớ chương trình (trên FLASH). Mỗi task là một chương trình riêng biệt, vì vậy chúng cũng cần được cung cấp những vùng nhớ riêng để hoạt động, tránh việc các task bị xung đột bộ nhớ với nhau.

    Người ta thường sử dụng vùng nhớ Heap để phân bổ bộ nhớ cho các Task. 

Heap Memory for RTOS

    Mỗi task trong RTOS sẽ được cấp một vùng nhớ (giống như một mảng dữ liệu lớn) trên Heap. Mỗi task sẽ được chia làm 2 phần:

  • TCB (Task Control Block): dùng để điều khiển 1 task, nhiệm vụ chính là lưu trữ lại các ngữ cảnh đang thực hiện của một task, trước khi chuyển qua task khác. 
    💬 Ví dụ, một task đang thực hiện một công việc, chẳng hạn đếm từ 1 đến 100. Nó đang đếm đến 20, thì bỗng dưng bị task có quyền ưu tiên cao hơn chiếm quyền, hoặc bị hết Time-Slice. Điều bắt buộc ở đây là phải có một nơi để nó lưu lại con số 20, sau đó chuyển qua task khác, sau đó khi tiếp tục thực hiện ở lần tiếp theo, nó sẽ load số 20 ra và tiếp tục đếm. Số 20 này sẽ được lưu trong phần TCB.
  • Stack: Mỗi task chạy thì đều cần có vùng nhớ dữ liệu để thực thi, ở đây là vùng stack riêng của từng task, khác với vùng nhớ stack của chương trình.   

    Như vậy, mỗi task hoạt động như một chương trình bình thường, và có cả vùng stack riêng, với stack thì chúng ta cần bố trí một con trỏ ngăn xếp - Stack Pointer (SP). Đó chính là một chức năng của SP, cũng là câu trả lời cho câu hỏi tại sao Cortex Mx lại có MSP và PSP. Ở đây chúng ta sẽ dùng PSP - Process Stack Pointer cho hoạt động của các Task, và MSP - Main Stack Pointer vẫn được sử dụng trong chương trình chính (main).

PSP for RTOS

    💬 Một phần cứng khác mà mình đã nhắc tới trong những bài trước đó là Timer, mà cụ thể là Systick Timer (sử dụng trong freeRTOS). Timer dùng để đếm thời gian Time-Slice cho việc lập lịch.

    💬 Ngoài ra, còn 2 Exception là PendSV và SVC sử dụng để chuyển đổi giữa các task, sẽ được mình giới thiệu trong những post sau.

    👉 Phần mềm hay chương trình Code - Firmware

    Chẳng hạn một Task được viết như thế nào, đó chính là Firmware, là những chương trình code chúng ta cần viết để thực thi RTOS. Một số thành phần chính của chương trình cần viết:

  • Nội dung của các Task, đó là điều không thể thiếu khi ta muốn dùng nhiều Task. Các Task thực chất là một Function, có cấu trúc giống như một chương trình bình thường (tức là bao gồm 2 phần: Initialization và Super Loop). 
  • Thuật toán lập lịch (Hàm lập lịch), việc lập lịch sẽ thực hiện bằng cách gọi đến Task tiếp theo được thực hiện. Các task sẽ được xếp trong một queue - hàng đợi (Task có ưu tiên cao hơn hoặc task tiếp theo theo sắp xếp ban đầu sẽ được đứng trước và thực thi trước).
  • Các hàm Context Switch - chuyển đổi ngữ cảnh: Khi chuyển từ task này sang task khác, chúng ta cần phải lưu trữ ngữ cảnh của task đang thực hiện và load ngữ cảnh của task sắp thực hiện (như ví dụ đếm số ở trên). Quá trình này gọi là Chuyển đổi ngữ cảnh - Context Switch.
  • Hàm vTaskDelay: Trong RTOS, người ta sẽ hạn chế tối đa việc dùng hàm delay thông thường để tránh việc chiếm dụng CPU. Thay vào đó, nếu Task muốn delay, thì nó sẽ gọi hàm lập lịch để chuyển qua Task khác, bằng cách thay hàm delay thông thường bằng vTaskDelay. Sau khi hết thời gian delay, CPU sẽ quay trở lại với Task đang thực hiện.

    vTaskDelay

  • Một số cơ chế như Semaphore, Mutex, ... sẽ được giới thiệu ở những post sau.

    Trên đây là những yêu cầu tài nguyên sử dụng của một hệ điều hành RTOS. Nếu muốn xây dựng một hệ điều hành RTOS, các bạn cần nắm được và triển khai từng phần trên đây.

>>>= 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

2 Nhận xét