Khi chúng ta nghe thấy ai đó nhắc tới hệ điều hành (Operating System - OS) thì chúng ta sẽ nghĩ ngay tới chiếc máy tính chạy Windows XP, Windows 7, Windows 8 hay chạy một distro Linux và Android hoặc iOS cho điện thoại. Chúng ta biết đến hệ điều hành chủ yếu là dành cho máy tính. Tuy nhiên trong thực tế, có rất nhiều thiết bị điện tử có chạy một dạng hệ điều hành rút gọn bên trong nó. Bên cạnh đó cũng có rất nhiều loại hệ điều hành được thiết kế cho vi điều khiển. Trong số chúng có một số thuộc họ Hệ điều hành thời gian thực (Real Time Operating System - RTOS), cụm từ thời gian thực ở đây chỉ ra rằng thời gian phản hồi của hệ thống là rất nhanh.
Bạn có thể hiểu như sau:
Vì vậy, RTOS sử dụng trong những ứng dụng yêu cầu thời gian đáp ứng nhanh, chính xác về thời gian. Vi điều khiển có tài nguyên rất giới hạn. Do đó, hệ điều hành này chỉ tập trung vào một số ít các tính năng. Chúng cố gắng tối ưu tối đa số luồng, bộ lập lịch và các tác vụ (task) trên một hệ thống cỡ nhỏ.
Thông thường, RTOS là một phân đoạn hoặc một phần của chương trình, trong đó nó giải quyết việc điều phối các task, lập lịch và phân mức ưu tiên cho task, nắm bắt các thông điệp gửi đi từ task. RTOS khá phức tạp, nói một cách dễ hiểu hơn là nó thực hiện việc xử lý các trạng thái máy (State Machine). Dưới đây là 1 minh hoạ cho bạn dễ hiểu hơn về thứ gọi là trạng thái máy.
while(1)
{
switch(state)
{
case 1: //Code for Task 1;
state= 2;
case 2: //Code for Task 2;
state= 3;
case 3: //Code for Task 3;
state= 4;
case 4: //Code for Task 4;
state=1;
}
}
Bạn có thể thấy trong đoạn mã trên, có sự điều chuyển giữa các mệnh lệnh thực thi một cách liên tục. Nó có thể được phát triển và thiết kế phức tạp hơn nữa. Người lập trình có thể thay đổi và sử dụng các lệnh điều kiện (if-else, switch-case…) để chuyển qua lại giữa các task. Do vậy, các luồng chương trình có thể được xác định rõ ràng.
Nhân (kernel) của hệ điều hành giao cho CPU thực hiện việc xử lý các task theo những khoảng thời gian. Nó cũng liên tục kiểm tra mức ưu tiên của các task, xắp xếp các thông điệp từ task và tiến hành lập lịch. Trong một hệ thống chạy RTOS, cũng có các tài nguyên dùng chung cùng với phần được cấp phát riêng cho mỗi task.
Các chức năng cơ bản của một RTOS:
Mỗi task có thể có 3 trạng thái.
Để lập lịch cho Task, có 3 kỹ thuật được áp dụng:
Preemptive Scheduling: Phương pháp này ưu tiên phân bổ thời gian cho các task có mức ưu tiên cao hơn. Mỗi task được gán 1 mức ưu tiên duy nhất. Có thể có 256 mưc ưu tiên trong hệ thống, và có thể có nhiều task có cùng mức ưu tiên.
Preemptive: Các task có mức ưu tiên cao nhất luôn được kiểm soát bởi CPU, khi phát sinh ISR thì hệ thống sẽ tạm dừng task đang thực thi, hoàn thành ISR sau đó hệ thống thực thi task có mức ưu tiên cao nhất tại thời điểm đó. Sau đó hệ thống mới tiến hành nối lại các task đang bị gián đoạn. Ở chế độ preemptive, hệ thống có thể đáp ứng các công việc khẩn cấp một cách nhanh chóng. Đa số các hệ thống thực tế đang chạy ở chế độ này.
Non-preemptive: Ở chế độ non-preemptive thì các task được chạy cho đến khi nó hoàn tất. Khi phát sinh ISR thì hệ thống sẽ tạm dừng task đang thực thi và hoàn thành ISR , sau khi hoàn thành ISR thì hệ thống sẽ quay lại thực thi nốt phần việc còn lại của task bị gián đoạn. Task có mức ưu tiên cao hơn sẽ giành quyền kiểm soát CPU sau khi task bị gián đoạn thực thi xong.
Ưu điểm của non-preemptive: độ trễ gián đoạn thấp.
Nhược điểm của non-preemptive: do phải chờ task thực thi xong thì task có mức ưu tiên cao mới được thực thi, do đó mức đáp ứng của hệ thống thấp. Vì vậy rất ít hệ thống có sử dụng non-preemptive.
Kernel tiến hành quản lý task ở nhiều giai đoạn. Chúng bao gồm:
Kernel là trái tim của mỗi hệ điều hành. Nó thực hiện chức năng quản lý và lập lịch các quá trình sử dụng CPU và điều phối tài nguyên. Mỗi task chỉ được thưc thi bởi CPU trong một khoảng thời gian, trong các khoảng thời gian còn lại thì task được quản lý bởi các dịch vụ quản lý của hệ điều hành.
Các dịch vụ của RTOS bao gồm:
Các thông điệp sử dụng để trao đổi thông tin giữa các hệ thống khác nhau hoặc giữa các task. Các dịch vụ quản lý thông điệp bao gồm:
Semaphores: Dùng để đồng bộ hóa quyền truy cập vào các tài nguyên dùng chung.
Event Flags: Dùng để đồng bộ hóa các hoạt động cần có sự phối hợp của nhiều task.
Mailboxes, Pipes, Message queues: Dùng để quản lý các thông điệp gửi đi - đến giữa các task.
Một hệ thống có thể chia làm 2 loại thời gian thực dựa vào mức độ trễ - được gọi là thời hạn lập danh mục
(scheduling deadline
) :
scheduling deadline
của nó tại mỗi và mọi thời điểm. Sự sai sót trong việc tiếp nhận deadline có thể dẫn đến hậu quả nghiêm trọng.scheduling deadline
có dễ thở hơn chút ít, với soft-realtime
thì không có gì quá nghiêm trọng xảy ra nếu hệ thống thỉnh thoảng bị trễ. Lỗi về mặt thời gian có thể chỉ đơn giản là dẫn đến hậu quả giảm độ tin cậy của đối tượng đối với hệ thống mà không dẫn đến hậu quả nghiêm trọng nào khác xảy ra.Có hệ thống bao gồm cả 2 loại này.
Hiện tại có vô vàn hệ điều hành thời gian thực, bạn có thể Google với từ khóa RTOS để tìm hiểu nhiều hơn với từng loại.