Hoạt động của hệ điều hành thời gian thực RTOS

Hoạt động của hệ điều hành thời gian thực RTOS

 

Scheduler của RTOS hoạt động như thế nào?

Scheduler là một trong những chức năng quan trọng nhất của RTOS. Scheduler được hiện thực như thế nào trong RTOS? Hãy xem cách thứ tự thực hiện của các task được kiểm soát như thế nào.
RTOS chọn task tiếp theo để thực thi theo một quy tắc rất cụ thể. Việc tạo ra hàng đợi (Queue) để chứa các task đang chờ thực thi theo một quy tắc cụ thể nào đó được gọi là Scheduling.
Kernel, là lõi của RTOS, cung cấp chức năng scheduler, xử lý việc lập lịch các tác vụ chờ thực thi. Sau đây là mô tả các thuật toán lập lịch tác vụ thường được sử dụng.

1. Đến trước, được phục vụ trước (First Come, First Served (FCFS))

Tác vụ đi vào trạng thái chờ thực thi trước sẽ được thực hiện trước. Các tác vụ chờ đợi được xếp vào hàng đợi theo thứ tự và chúng vào trạng thái chờ đợi (WATTING state).

2. Dựa trên mức độ ưu tiên (Priority Based)

Mỗi task được gán một độ ưu tiên. Task được thực thi theo thứ tự của độ ưu tiên.
Thuật toán chuyển đổi các tác vụ theo các khoảng thời gian xác định và thực hiện lặp đi lặp lại chúng lần lượt được gọi là round-robin scheduling.

Có các thuật toán scheduler khác, như thuật toán deadline-driven scheduling (Chỉ định CPU thực thi task gần tới deadline nhất), và thuật toán shortest processing time first (SPT), thuật toán sẽ xử lý task có thời gian xử lý ngắn nhất, khi đã biết thời gian xử lý cần thiết của mỗi task.

Hệ điều hành nhúng μITRON, sử dụng cả 2 thuật toán FCFS và Priority Based. Task có độ ưu tiên cao nhất sẽ được thực hiện trước, Nếu nhiều tác vụ có cùng độ ưu tiên, chúng sẽ được thực thi theo cách thức FCFS. Các task nằm trong hàng đợi thực thi (Ready queue), cũng có thể được thực thi bằng round-robin scheduling, nghĩa là việc thực thi được chuyển đổi theo chu kỳ giữa các tác vụ trong các khoảng thời gian xác định.

Scheduler của RTOS hoạt động như thế nào?


Khi nào Scheduler được kích hoạt (activated)

Scheduler được kích hoạt khi task hoặc handler yêu cầu các service từ OS. các yêu cầu này được gọi là service call. 

Khi các service call được gọi, quyền điều khiển hệ thống sẽ chuyển sang cho OS. Sau khi hệ điều hành xử lý xong service được yêu cầu, scheduler chọn nhiệm vụ tiếp theo sẽ được thực thi và chuyển việc thực thi sang tác vụ đó. Việc chuyển đổi giữa các task được gọi là task switch, và hoạt động chuyển đổi giữa các task gọi là dispatching. 

Sau khi dispatching, việc thực thi của CPU sẽ được chuyển sang các task được chọn. Dữ liệu cần thiết được lưu để tác vụ trước đó có thể tiếp tục thực hiện khi nó được gửi đi sau đó. Dữ liệu cần thiết để khởi động lại quá trình thực thi được gọi là context.

Khi nào Scheduler được kích hoạt (activated)

Số lượng các service call được cung cấp phụ thuộc vào chức năng của từng RTOS. Trong lập trình C, service call được thực hiện thông qua việc gọi hàm (function call), các task đích hoặc thời gian chờ, được truyền thông qua các đối số hàm (arguments).

[Service Call Examples]
sta_tsk Activate a task
ext_tsk Terminate the invoking task
wup_tsk Wake up a task


Sự khác biệt giữa Task và Handler

Như mô tả ở lúc đầu, mục tiêu của scheduling và dispatching là task. Một task được kích hoạt, tạm ngừng, tiếp tục hoặc kết thúc bởi hệ điều hành (OS).

Chương trình ngắt sẽ được kích hoạt mà không có sự can thiệp của hệ điều hành, chương trình ngắt sẽ không được điều khiển bởi OS, khi chương trình ngắt thực hiện một service call, quyền kiểm soát được chuyển sang OS và các tác vụ có thể được xử lý thông qua OS. Cách lập trình này sử dụng để xử lý các sự kiện được tạo ra bởi ngắt, task sẽ xử lý các sự kiện này, (nguyên nhân là trong đa phần hệ thống nhúng cố gắng tối thiểu thời gian xử lý). 

Một chương trình thực hiện service call nhưng không phải là task thì được gọi là handler. Handler mà được kích hoạt bởi ngắt (interrupt) thì được gọi là interrupt handler.

Ngoài các trình xử lý ngắt (interrupt handler), có các trình xử lý theo chu kỳ, được kích hoạt theo các khoảng thời gian xác định và các trình xử lý cảnh báo, được kích hoạt tại một thời điểm xác định hoặc sau một khoảng thời gian xác định.

Sự khác biệt giữa Task và Handler trong RTOS

Chuyển đổi trạng thái task (Task State Transition)

Như đã giới thiệu ở đầu bài viết, scheduler có nhiệm vụ xác định task nào trong hàng đợi task sẽ được thực thi. Trong hệ thống, task được chuyển đổi rất nhiều trạng thái; ví dụ: Task đang thực thi (RUNNING) chuyển sang trạng thái chờ (WARTING) hoặc task đang chờ chuyển sang trạng thái (READY) khi có event được tạo ra. Hệ điều hành quản lý trạng thái của các task. Có 3 trạng thái task cơ bản như hình bên dưới:

Trạng thái RUNNING là trạng thái task đang được thực thi, Task đang ở trạng thái READY được dispatching chọn thực thi sẽ chuyển sang trạng thái RUNNING. Khi 1 task đang RUNNING, bị tạm dừng nó sẽ chuyển sang trạng thái READY. Trong hệ thống có 1 CPU, chỉ duy nhất 1 task ở trạng thái RUNNING. Scheduling là hành động xác định task nào sẽ chuyển từ trạng thái READY sang RUNNING. μITRON có thể xử lý 6 trạng thái bao gồm DORMANT, WAITING-SUSPENDED, và SUSPENDED.

Chuyển đổi trạng thái task (Task State Transition)


Phân chia các task (Dividing Tasks)

Chúng ta quan tâm những gì khi phân chia task? Hãy xem xét một số trường hợp trong đó quá trình xử lý nên chia thành các task ở 2 góc nhìn là: lập lịch task (task scheduling) và độ ưu tiên task (preemption) trong RTOS:

Phân chia task để xử lý song song

Khi một số xử lý cần được thực thi song song trong một khoản thời gian cụ thể, việc thực thi phải được chuyển đổi giữa các xử lý với điều kiện chờ hoặc theo các khoảng thời gian xác định. 
Trong trường hợp các quá trình xử lý cần được thực hiện song song, nên chia các các xử lý thành các task riêng biệt.

Các xử lý ko cần thực thi song song, không cần chia thành các task, trong ngôn ngữ C, các xử lý như vậy chỉ cần thực thi thông qua các hàm (function). Điểm quan trọng trong góc nhìn này là xem xét phân tích xử lý nào cần được thực thi song song. 
Trong thực tế, các xử lý trong một task có chung độ ưu tiên cũng đóng vai trò kim chỉ nam cho phân chia task.

Phân chia task để xử lý dựa trên mức độ ưu tiên

Quá trình khi một task đang thực thi, có 1 task khác cần được thực hiện ngay và phải tạm dừng quá trình xử lý task trước đó gọi là preempted.

Như phần mô tả về scheduling trước, các task với cùng độ ưu tiên sẽ được chuyển đổi theo cách FCFS, các task vụ cần thiết có thể không được thực thi trước. Khi một task cần preempted, trong khi có 1 task khác cùng độ ưu tiên đang thực thi, task đó sẽ không được thực thi cho đến khi task hiện tại vào trạng thái WATTING. Nói cách khác, quá trình xử lý ưu tiên nên được đặt ở task riêng biệt, và gán mức độ ưu tiên tương ứng.

Các mức ưu tiên khác nhau cần được gán cho nhiều xử lý, chúng nên được chia thành các task riêng biệt.

Nói chung, mức độ ưu tiên cao nhất được chỉ định cho các xử lý khẩn cấp để xử lý các lỗi hệ thống và các quá trình xử lý sẽ ảnh hưởng đến hoạt động real time.
Mức độ ưu tiên thấp được chỉ định cho quá trình xử lý chỉ cần được thực thi trong khoảng thời gian không có tương tác người dùng, chẳng hạn như xử lý log, bảo trì hệ thống.
Các tác vụ có mức ưu tiên thấp nhất được gọi là các idle task vì chúng có thể được thực thi trong khi không có tác vụ nào khác được thực hiện.

Lưu ý về xử lý dựa trên mức độ ưu tiên
Khi gán độ ưu tiên vào task, lưu ý rằng việc thực thi một tác vụ có mức độ ưu tiên thấp có thể bị tạm dừng ngay cả khi nó đang thực hiện quá trình xử lý rất quan trọng, và các tác vụ có mức độ ưu tiên thấp hơn không bao giờ được thực thi trong khi một tác vụ có mức độ ưu tiên cao hơn đang được thực thi.

Các chức năng của RTOS

a. Task Management: Quản lý tác vụ, điều khiển các trạng thái task
Ví dụ: Kích hoạt hoặc dừng một task

b. Task Dependent Synchronization: Đồng bộ hóa phụ thuộc vào tác vụ, điều khiển trạng thái task để đồng bộ các task.
Ví dụ: Waking up một tác vụ hoặc đợi một tác khác wakeup.

c. Synchronization and Communication: Đồng bộ hóa và Giao tiếp, các cơ chế đợi và giao tiếp.
Ví dụ: 
Semaphore: Cơ chế đợi giữa các task, được sử dung để đợi trong chia sẽ tài nguyên giữa các task (Các biến dùng chung giữa các task,...)
Event Flag: Cơ chế đợi giữa các task, được sử dụng để thông báo kết thúc 1 quá trình xử lý.
Mailbox: Cơ chế trao đổi dữ liệu và đợi giữa các task, sử dụng trong truyền nhận dữ liệu giữa các task.

d. Memory Pool: Phân bổ và giải phóng bộ nhớ theo yêu cầu của các task.

Ngoài các tính năng trên, OS còn có data queue, message buffer, mutex, rendezvous, task exception handling, time management, interrupt management, system state management, service call management, and system configuration management functions. các chức năng này được dử dụng bằng cánh gọi các service call, có tổng cộng 165 service call được cung cấp trong phiên bản 4 của μITRON

Nhược điểm và hiệu suất của RTOS

a. Hệ điều hành chiếm bộ nhớ

Hệ điều hành được nhúng vào bộ nhớ và là 1 phần của chương trình thực thi, nên cần chuẩn bị vùng nhớ cần thiết cho hệ điều hành. Kích thước vùng nhớ phụ thuộc vào số lượng chức năng của hệ điều hành được sử dụng, cũng như số lượng task và các hàng đợi (queue) cần cho chương trình ứng dụng.

b. Tốn thời gian cho các xử lý bên trong của OS

Cần một khoảng thời gian nhất định sau khi một tác vụ đưa ra lệnh service call cho đến khi OS xử lý nó và chuyển một tác vụ nếu cần. 

Thời gian xử lý chức năng yêu cầu phụ thuộc vào dịch vụ được yêu cầu. Xử lý phức tạp chẳng hạn như giao tiếp giữa các tác vụ thông qua một hộp thư mất nhiều thời gian hơn. Một khoảng thời gian nhất định cũng cần thiết để chuyển đổi tác vụ sau khi xử lý bộ lập lịch cho đến khi điều phối, và đây được gọi là thời gian chuyển đổi tác vụ. Thời gian xử lý service call phụ thuộc vào từng service call. Các xử lý phức tạp như cơ chế giao tiếp giữa các task ví dụ mailbox sẽ nhiều thời gian xử lý. Các chuyển đổi giữa các task bên trong OS cũng cần một khoảng thời gian nhất định.

c. OS vô hiệu hóa ngắt

Trong một số trường hợp, trong khi OS đang thực hiện các xử lý nội bộ, ngắt sẽ bị vô hiệu hóa.

Các hoặc động của hệ điều hành trong hệ thống được gọi là OS overhead.

Bài viết này mục đích giới thiệu khái quát về hoạt động của RTOS. Để hiểu các hoạt động của hệ điều hành một cách sâu sắc các bạn có thể tham khảo các đường nội dung bên dưới, các nội dung này giúp các bạn có thể tự viết ra một RTOS cơ bản.

Các bạn vào đường link này và xem các video 22 đến video 28: https://www.state-machine.com/video-course

Bài viết được dịch từ link sau: https://www.tron.org/seminar/on-the-web-seminar/chap-3/

[NEXT] : Các kiểu lập trình trên RTOS

Các chủ đề nâng cao về lập trình vi điều khiển (Embedded MCU) các bạn tham khảo tại: Blog - AK Embedded Software

Mọi thông tin góp ý về bài viết các bạn gửi về: