Quản lý Task, Bộ lập lịch
Task
Task là đơn vị cơ bản của chương trình được điều khiển bởi AUTOSAR OS (về mặt ngôn ngữ C, Task tương tự như hàm). Các yêu cầu thời gian thực của phần mềm điều khiển phức tạp được chia thành nhiều Task khác nhau.
Ví dụ: Task được thực thi định kỳ, Task được thực thi khi xảy ra ngắt (Interrupt)…
AUTOSAR OS cung cấp hai loại Framework để quản lý trạng thái của Task: Basic Task và Extended Task. Mỗi Task có thể chọn loại Task phù hợp để sử dụng.
Ví dụ: Basic Task, Extended Task
Mỗi Task có một mức độ ưu tiên (Priority) và thay đổi trạng thái theo Task State Model. SWC (Software Component) là đơn vị ánh xạ ECU, trong khi Runnable là đơn vị được lập lịch (Scheduling).
Nhiều Runnable có thể được bao gồm trong một Task.
Basic Task & Extended Task

Sự khác biệt lớn nhất giữa Basic Task và Extended Task là Basic Task có 3 trạng thái (Ready, Running, Suspended), trong khi Extended Task có thêm trạng thái Waiting, tổng cộng là 4 trạng thái.
• Ready: Trạng thái mà Task đang chờ được cấp phát CPU để thực thi. Đây là trạng thái mà Task phải trải qua trước khi vào trạng thái Running. Scheduler quyết định Task nào trong trạng thái Ready sẽ được thực thi tiếp theo.
• Running: Trạng thái mà Task được cấp phát CPU và đang thực thi. Bộ xử lý được gán cho Task và thực hiện các lệnh. Chỉ một Task duy nhất có thể ở trạng thái Running tại một thời điểm.
• Suspended: Trạng thái khi Task đã kết thúc và đang nghỉ. Task có thể được kích hoạt lại (Activated) từ trạng thái này.
• Waiting: Trạng thái khi Task tạm dừng để chờ một Event cụ thể. Task sẽ không hoạt động cho đến khi Event cụ thể đó xảy ra (Chỉ có trong Extended Task).
Basic Task
• Start: Chuyển đổi khi Scheduler chọn Task từ trạng thái Ready để thực sự vào trạng thái hoạt động.
• Preempt: Chuyển đổi từ Running trở về Ready khi Scheduler quyết định bắt đầu Task khác.
• Activate: Chuyển đổi xảy ra khi Task đã sẵn sàng thực thi thông qua dịch vụ hệ thống.
• Terminate: Chuyển đổi xảy ra khi Task kết thúc hoặc bị buộc phải kết thúc do lỗi.
• Không có Wait event (Cấm sử dụng Event!).
• Đây là loại Task đơn giản nhất để tránh sử dụng tài nguyên không cần thiết.
• Processor sẽ giải phóng trong các trường hợp sau:
o Khi Task tự kết thúc.
o Khi Task có ưu tiên cao hơn chiếm dụng.
o Khi xảy ra Interrupt.
Extended Task

Wait và Release trong Extended Task
• Wait: Chuyển đổi được xảy ra bởi dịch vụ hệ thống, cần lưu trữ Context để tiếp tục hoạt động.
• Release: Khi một Event xảy ra trong Task đang ở trạng thái Waiting, Task sẽ chuyển sang trạng thái Ready.
• Có Wait event.
• Trong trạng thái Waiting, Task giải phóng bộ xử lý và chờ đợi Event.
Kích hoạt Task (Activate Task)
Task Activation có thể được thực hiện bằng cách sử dụng API ‘ActivateTask’ hoặc ‘ChainTask’. Tùy thuộc vào môi trường hệ thống, có thể thực hiện song song (Parallel Implementation) và cho phép kích hoạt Task nhiều lần (Multiple Requesting of Task Activation).
Cơ chế chuyển đổi Task (Task Switching Mechanism)
Để khởi động hoặc kích hoạt Task, cần có Scheduler, một hoạt động nội bộ của OSEK OS. Scheduler được kích hoạt mỗi khi có thể chuyển đổi Task theo chính sách lập lịch (Scheduling Policy) đang thực thi. Vì vậy, Scheduler có thể được coi là một Resource có thể được chiếm và giải phóng bởi Task. Task có thể đặt trước (Reserve) Scheduler để tránh chuyển đổi Task cho đến khi nó được giải phóng.
Lập lịch (Scheduling)
AUTOSAR OS là một hệ điều hành hỗ trợ Multitasking dựa trên OSEK/VDX, cho phép nhiều Task chia sẻ một bộ xử lý bằng cách quản lý trạng thái và điều chỉnh thứ tự thực thi thông qua Scheduler.
Hệ điều hành đa nhiệm (Multi-Tasking OS)
• Hệ thống có thể thực thi nhiều Task cùng một lúc trong thời gian thực (Concurrency).
• Trong môi trường Single Core, không thể thực thi đồng thời nhiều Task về mặt vật lý (Không phải Parallelism).
Để thực hiện Multi-Tasking, cần phải tiến hành lập lịch (Scheduling) để quyết định Task nào trong hàng đợi sẵn sàng sẽ được cấp phát CPU.
Đồng thời (Concurrency) vs. Song song (Parallelism)
Trong tiếng Việt, “đồng thời” và “song song” thường được hiểu là thực hiện hai nhiệm vụ cùng một lúc. Tuy nhiên, trong Multi-Tasking, hai khái niệm này có sự khác biệt.
• Đồng thời (Concurrency): Có nghĩa là nhiều Task đang được thực hiện cùng lúc, nhưng Task có độ ưu tiên cao nhất sẽ được thực hiện trước. Các Task ở trạng thái Ready hoặc Waiting đang trong quá trình thực thi, nhưng chưa được chiếm dụng bộ xử lý. Các Task có độ ưu tiên thấp sẽ chuyển sang trạng thái Waiting và chờ đợi sự kiện (Event).
• Song song (Parallelism): Thực sự có nghĩa là nhiều Task có thể chiếm dụng bộ xử lý và được thực thi đồng thời về mặt vật lý. Điều này chỉ có thể xảy ra trong môi trường đa lõi (Multi Core).

Scheduler chịu trách nhiệm quyết định Task nào sẽ được thực hiện tiếp theo. Như hình minh họa ở trên, trong Scheduler tồn tại nhiều hàng đợi theo mức độ ưu tiên (Priority FIFO Queue). Scheduler sẽ quyết định Task trong hàng đợi có mức độ ưu tiên cao nhất làm Task thực thi tiếp theo. Lưu ý rằng, mức độ ưu tiên (Priority) của Task do người dùng quyết định và không thể thay đổi trong quá trình hệ thống đang chạy.
Nếu có nhiều Task cùng mức độ ưu tiên, Scheduler sẽ chọn Task đã vào hàng đợi đầu tiên (cũ nhất) và đang ở trạng thái Ready. Dưới đây là thứ tự mà Scheduler xác định Task sẽ được thực thi:
• Dò tìm tất cả các Task trong trạng thái Ready/Running.
• Quyết định nhóm Task có mức độ ưu tiên cao nhất trong tất cả các Task đang ở trạng thái Ready/Running.
• Tìm Task đầu tiên (cũ nhất) trong nhóm đó.
• Chuyển Task tìm được sang trạng thái Running.
Full Preemptive và Non-Preemptive
Có hai chính sách (Policy) lập lịch (Scheduling) là Full Preemptive và Non-Preemptive. Đây là chính sách áp dụng khi Task với mức độ ưu tiên cao hơn được kích hoạt (Activate) trong khi một Task đang ở trạng thái Running.
Vì cả hai chính sách này đều có ưu và nhược điểm, nên cần lựa chọn tùy theo mục đích sử dụng.
Full Preemptive (Chế độ chiếm quyền)
Khi một Task có mức độ ưu tiên cao hơn được kích hoạt, hệ thống sẽ thực hiện lại Scheduling và Task với mức độ ưu tiên cao hơn sẽ được thực thi trước. Như trong hình dưới, Task T1 có mức độ ưu tiên cao hơn đã chiếm quyền (Preempt) và thực hiện trước trong khi Task T2 đang chạy.
• Cải thiện khả năng xử lý thời gian thực.
• Tuy nhiên, tăng tải hệ thống (Overhead).

Non-Preemptive (Chế độ không chiếm quyền)
Khi một Task có mức độ ưu tiên cao hơn được kích hoạt, hệ thống sẽ không thực hiện Scheduling mà để Task hiện tại hoàn thành trước. Dù T1 có mức độ ưu tiên cao hơn, nó sẽ vẫn ở trạng thái Ready cho đến khi T2 kết thúc.
• Giảm khả năng xử lý thời gian thực.
• Giảm tải hệ thống (Overhead).

Mixed Preemptive (Chế độ chiếm quyền hỗn hợp)
• Kết hợp giữa Preemptive Task và Non-Preemptive Task.
• Chính sách lập lịch (Scheduling Policy) phụ thuộc vào thuộc tính chiếm quyền (Preemption) của Task đang ở trạng thái Running.
Context Switching
Trong môi trường đa lõi (Multicore), mỗi lõi có thể thực thi một Task song song, nhưng trong môi trường đơn lõi (Single Core), không thể thực thi Task cùng một lúc. Để thực hiện công việc đa nhiệm (Multitasking), cần có Context Switching.
Context là thông tin trạng thái của Task đang chiếm dụng bộ xử lý, bao gồm Program Counter (PC), Stack Pointer (SP), giá trị của các thanh ghi (Register), v.v. Context Switching xảy ra khi Task bị chiếm quyền. Context Switching là quá trình lưu trữ Context của Task bị chiếm quyền và tải Context của Task mới được thực thi.
• Context Save: Quá trình lấy thông tin trạng thái của Task hiện đang thực thi từ bộ xử lý và lưu trữ vào bộ nhớ.
• Context Load: Quá trình lấy thông tin trạng thái của Task mới từ bộ nhớ và lưu trữ vào bộ xử lý.

Do đó, trên thực tế, Context Switching có thể được xem là một loại Overhead. Full Preemptive có khả năng xử lý thời gian thực tốt vì Task có mức độ ưu tiên cao có thể chiếm dụng bộ xử lý ngay lập tức, nhưng lại xảy ra Context Switching thường xuyên. Đây là lý do tại sao Overhead tăng lên trong chế độ Full Preemptive

Context Switching trong Basic Task
• Khi Task bị chiếm quyền (Preempted), Context được lưu trữ, và khi Task chuyển sang trạng thái Running, Context đã lưu trước đó sẽ được tải lại.
Context Switching trong Extended Task
• Context được lưu trữ khi Task bị chiếm quyền và khi chuyển sang trạng thái Wait. Khi Task chuyển lại sang trạng thái Running, Context đã lưu trước đó sẽ được tải lại.
TaskHook
TaskHook là một routine Hooking do người dùng tạo ra để mở rộng chức năng như gỡ lỗi (Debugging) hoặc đo thông tin thời gian (Timing Information) trước và sau khi Task hoạt động.
• Thứ tự thực hiện: PreTaskHook → Task Running → PostTaskHook.

• Ngay sau khi chuyển vào trạng thái Running, PreTaskHook hoạt động.
• Ngay trước khi ra khỏi trạng thái Running, PostTaskHook hoạt động.
• Khi TaskHook hoạt động, trạng thái của Task vẫn duy trì là Running.
• Có thể viết routine của người dùng trong TaskHook.
Ví dụ: Sử dụng dấu thời gian (Time Stamp) trong PreTaskHook và PostTaskHook để đo thời gian thực thi của Task.
API List
• StatusType ActiveTask (TaskType <TaskID>)
o Chuyển Task với <TaskID> sang trạng thái Ready.
• StatusType TerminateTask (void)
o Chuyển Task đang ở trạng thái Running hiện tại sang trạng thái Suspended.
• StatusType ChainTask (TaskType <TaskID>)
o Kích hoạt (Activate) một Task khác và kết thúc Task hiện tại.
• StatusType Schedule (void)
o Thực hiện Scheduling.
• StatusType GetTaskID (TaskRefType <TaskID>)
o Lấy thông tin ID của Task đang ở trạng thái Running hiện tại.
• StatusType GetTaskState (TaskType <TaskID>, TaskRefType <State>)
o Lấy thông tin trạng thái hiện tại (Running, Waiting, Suspended, Ready) của Task với Task ID.
※ StatusType: Được sử dụng để lưu trữ thông tin trạng thái đối với tất cả các dịch vụ API.
Ví dụ: E_OK: Trạng thái bình thường, E_OS_LIMIT: Trạng thái Task đã được kích hoạt quá số lượng giới hạn.
Xem thêm Chuyên Mục





