5/5 - (3 bình chọn)

Interrupt, ISR Autosar

Interrupt

Interrupt đóng vai trò quan trọng trong việc đồng bộ hóa với các sự kiện bên ngoài. Nó xảy ra khi phát hiện các thay đổi trạng thái trong các thiết bị ngoại vi, chẳng hạn như khi nhận tín hiệu CAN hoặc khi bộ đếm thời gian (Timer) hết hạn.
Vì Interrupt xảy ra ở cấp độ phần cứng, OS quản lý nó và gọi ISR (Interrupt Service Routine). (Bất kể Full Preemptive hay Non-Preemptive, Interrupt sẽ chiếm quyền của Task và Context Switching sẽ xảy ra!)
• Mức độ ưu tiên (Priority): Interrupt Level > Logical Level for Scheduler > Task Level.

Interrupt Osek Operating System
Interrupt Osek Operating System

Interrupt Processing

ISR (Interrupt Service Routine) có thể được phân loại thành hai loại: Category 1 (CAT 1) và Category 2 (CAT 2).

Interrupt Processing
Interrupt Processing

ISR Category 1 (CAT 1)
• Đứng ở vị trí cao nhất trong các loại ISR.
• Không sử dụng dịch vụ của OS, không yêu cầu Interrupt thông qua dịch vụ API.
• Sau khi ISR kết thúc, tiếp tục xử lý câu lệnh đang được thực thi ngay trước đó.
• Interrupt không ảnh hưởng đến quản lý Task.
• Có Overhead tối thiểu, là Interrupt Routine nhanh nhất.
ISR Category 2 (CAT 2)
• Sử dụng dịch vụ của OS, yêu cầu Interrupt thông qua dịch vụ API.
• OS cung cấp ISR-frame để cung cấp môi trường chạy thời gian thực (Runtime Environment) cho routine người dùng được chỉ định.
• Routine người dùng được gán cho Interrupt trong quá trình tạo hệ thống (System Generation).
• Thường cần Counter, Task, Event hoặc Message.
Lập lịch (Scheduling) giữa Interrupt và Task
Không xảy ra tái lập lịch (Re-Scheduling) trong khi thực hiện ISR.
• Thực hiện tái lập lịch cho Task sau khi CAT 2 ISR kết thúc và không có Interrupt nào khác xảy ra.
• Task được kích hoạt (Active) từ Interrupt sẽ chỉ có thể được lập lịch sau khi tất cả các ISR đã kết thúc.
Interrupt Lồng nhau (Nested Interrupt) của các Category Khác nhau
• Tình huống vấn đề: Trong khi đang thực hiện CAT 1 ISR, CAT 2 ISR xảy ra và kích hoạt (Activate) một Task. Sau khi CAT 1 ISR kết thúc, do không gọi đến OS, dẫn đến việc Task được kích hoạt gặp phải độ trễ không giới hạn (Unbounded Delay).
• Giải pháp: Đảm bảo tất cả CAT 1 ISR có mức độ ưu tiên không bằng hoặc cao hơn CAT 2 ISR.

API List

• void EnableAllInterrupts (void) / void DisableAllInterrupts (void)
o Bật/Tắt tất cả các Interrupts.
o Chặn cả tín hiệu phần mềm và phần cứng.
o Không ghi nhớ trạng thái trước đó của ISR.
o Không cho phép Nesting.
• void ResumeAllInterrupts (void) / void SuspendAllInterrupts (void)
o Bật/Tắt tất cả các Interrupts.
o Chặn cả tín hiệu phần mềm và phần cứng.
o Ghi nhớ trạng thái trước đó của ISR.
o Cho phép Nesting.
• void ResumeOSInterrupts (void) / void SuspendOSInterrupts (void)
o Bật/Tắt tất cả các Interrupts thuộc CAT 2.
o Chỉ chặn tín hiệu phần mềm, chỉ bỏ qua Interrupts từ phần mềm bên ngoài.
o Không ghi nhớ trạng thái trước đó của ISR.
o Cho phép Nesting.
※ Nesting: Việc gọi lồng nhau cùng một API. Để kích hoạt lại Interrupt đã bị treo (Suspend), cần gọi Resume Interrupt tương ứng với số lần Suspend Interrupt đã được gọi lồng nhau.

Xem thêm Chuyên Mục

Autosar OS

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây