null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
AUTOSAR OS Task와 ISR 설계
#autosar
#os
#task
#isr
#basic-task
@devpc
|
2026-05-04 12:39:28
|
GET /api/v1/nodes/428?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# AUTOSAR OS Task와 ISR 설계 ## AUTOSAR OS 기반 AUTOSAR OS는 OSEK/VDX OS 표준을 기반으로 한다. RTOS 경험이 있다면 대부분의 개념이 익숙하다. 차이는 **정적 설정** — 런타임에 Task를 생성하지 않는다. 빌드 타임에 모든 Task가 결정된다. --- ## Task 종류 ### Basic Task 실행 후 스스로 종료(`TerminateTask`)하거나 다음 Task로 체인(`ChainTask`)한다. 블로킹 대기(WaitEvent)가 없다. ```c TASK(Task_10ms) { /* 주기 처리 */ Rte_Task_Dispatch_10ms(); (void)TerminateTask(); } ``` 대부분의 제어 Task는 Basic Task다. ### Extended Task `WaitEvent`로 이벤트를 기다릴 수 있다. 이벤트가 올 때까지 블로킹된다. ```c TASK(Task_Event) { EventMaskType events; for (;;) { WaitEvent(EVENT_CAN_RX | EVENT_TIMEOUT); GetEvent(Task_Event, &events); ClearEvent(events); if (events & EVENT_CAN_RX) { /* CAN 메시지 처리 */ } if (events & EVENT_TIMEOUT) { /* 타임아웃 처리 */ } } } ``` --- ## Task 우선순위와 스케줄링 AUTOSAR OS는 **Fixed Priority Preemptive** 스케줄링을 사용한다. 높은 우선순위 Task가 준비되면 낮은 우선순위 Task를 선점한다. ``` 우선순위 높음 Task_1ms ───┐ ← 선점 발생 ↓ 우선순위 낮음 Task_10ms ─→─ (중단) ──→ (재개) ``` 주의: 같은 우선순위 Task가 두 개이면 동시에 실행되지 않고 FCFS 순서로 처리된다. --- ## ISR — 인터럽트 서비스 루틴 AUTOSAR OS에서 ISR은 두 카테고리다. | 카테고리 | OS API 사용 가능 | 용도 | |---------|-----------------|------| | ISR Category 1 | 불가 | 최고 속도 필요한 인터럽트 (예: 타이머 틱) | | ISR Category 2 | 가능 | Task 활성화, 이벤트 설정 가능 | ```c /* ISR Category 2 예시 */ ISR(Can_Rx_ISR) { /* CAN 수신 처리 */ SetEvent(Task_CanProc, EVENT_CAN_RX); } ``` ISR에서는 처리를 최소화하고 Task에 이벤트를 전달하는 패턴이 기본이다. --- ## 실무 설계 패턴 **주기 Task 분배:** ``` Task_1ms → 고속 제어 (모터, 전류 루프) Task_10ms → 일반 제어 (온도, 압력) Task_100ms → 느린 모니터링 (배터리, 진단) Task_BG → 백그라운드 (NvM 접근, 로그) ``` **Task와 Runnable 매핑 규칙:** - 하나의 Task에 여러 Runnable을 매핑 가능 - RTE가 Task 안에서 Runnable을 순서대로 호출 - Runnable 실행 순서는 arxml/툴 설정에서 결정됨 --- ## GetResource / ReleaseResource — 공유 자원 보호 여러 Task가 동일한 자원(전역 변수, 하드웨어 레지스터)에 접근할 때 Priority Ceiling Protocol로 보호한다. ```c TASK(Task_10ms) { GetResource(RES_SharedBuffer); /* 공유 자원 접근 */ shared_buffer[0] = new_value; ReleaseResource(RES_SharedBuffer); (void)TerminateTask(); } ``` Mutex와 달리 `GetResource`는 블로킹하지 않고 현재 Task의 우선순위를 일시적으로 올린다.
// COMMENTS
Newest First
ON THIS PAGE