OIL(OSEK Implementation Language)은 OSEK/VDX를 쓰는 애플리케이션의 구성을 기술하는 언어다. OSEK의 목표인 소프트웨어 이식성을 위해 정해졌다. 다루는 범위는 ECU 안의 CPU 하나이며, ECU 네트워크는 다루지 않고 CPU마다 OIL 기술이 하나다.[1]
객체와 속성
OIL은 OSEK 시스템 객체를 모두 OIL 객체로 기술하고, 객체마다 속성과 참조의 집합으로 기술한다. 객체마다 고유한 이름이 있다. 참조는 다른 객체로 가는 단방향 링크이며, 값으로 대상 객체의 이름을 적는다.[1]
OSEK OS의 시스템 객체는 사용자가 모두 정적으로 정하며, 객체를 동적으로 만드는 시스템 서비스는 없다.[2]
OIL 2.5의 객체는 다음과 같다.[1]
| OIL 객체 | 나타내는 것 |
|---|---|
CPU | 애플리케이션이 도는 CPU. 다른 모든 객체를 담는 컨테이너다. |
OS | 그 CPU에서 도는 OSEK OS. CPU 하나에 정확히 하나를 둔다. |
APPMODE | 애플리케이션의 동작 모드. CPU 하나에 적어도 하나를 둔다. |
TASK | 운영체제가 다루는 태스크 |
ISR | 운영체제가 지원하는 ISR |
RESOURCE | 공유 자원에 대한 태스크와 ISR의 접근을 조정하는 resource |
EVENT | 태스크가 반응할 수 있는 이벤트. 마스크로 나타낸다. |
COUNTER | 알람의 하드웨어·소프트웨어 틱 소스 |
ALARM | counter 값에 따라 만료되어 태스크를 활성화하거나 이벤트를 설정하거나 callback 루틴을 부르는 알람 |
COM | 통신 하위 시스템 |
MESSAGE | OSEK COM(Communication)이 정의한 메시지의 공급자 쪽 속성 |
NETWORKMESSAGE | 같은 메시지의 OEM(Original Equipment Manufacturer) 쪽 속성 |
IPDU | OSEK COM이 정의한, 외부 통신에 쓰는 메시지를 나르는 단위 |
NM | 네트워크 관리 하위 시스템 |
OS, COM, NM 객체를 뺀 나머지는 한 애플리케이션 정의에 같은 종류를 여럿 둘 수 있다. 태스크는 자기가 접근하는 resource와, extended 태스크라면 반응할 이벤트를 참조한다. 알람은 자기가 배정된 counter 하나를 참조하고, 만료 동작에 따라 활성화할 태스크나, 설정할 태스크와 이벤트를 참조한다.[1]
구현 정의와 애플리케이션 정의
OIL 기술은 주 OIL 파일 하나와, 그 파일이 include하는 파일들로 이루어진다. 내용은 두 부분이다.[1]
- 구현 정의: 특정 OSEK 구현에 대해 OIL 객체마다 모든 속성과 그 특성을 정한다. 표준 속성을 모두 담아야 하고, 값의 범위를 좁힐 수 있으며, 구현 고유의 속성을 더할 수 있다. 다만 새 OIL 객체를 만들거나 문법을 바꿀 수는 없다. 구현 정의는 따로 파일로 만들어 OSEK 구현과 함께 배포하고, 사용자의 OIL 파일에서 include할 수 있다.
- 애플리케이션 정의: 그 CPU에 올라가는 애플리케이션이 쓰는 객체와 그 속성 값을 적는다. 구현 정의에 없는 속성은 쓸 수 없고, 값은 구현 정의가 정한 특성을 따라야 한다.[1]
OIL 파일은 BNF(Backus-Naur Form)와 비슷한 표기로 정한 문법을 따르며, 키워드, 속성, 객체 이름은 대소문자를 구분한다. OIL 기술은 손으로 쓰거나 시스템 구성 도구로 만들 수 있다. OIL 파일은 여러 개일 수 있는데, 예를 들어 공급자가 만드는 CPU 고유의 구성 파일과 OEM이 주는 네트워크 전체의 구성 파일이 따로 있을 수 있다.[1]
문법 요소
OIL은 속성 사이의 의존 관계를 조건부 속성으로 나타낸다. ENUM과 BOOLEAN 속성은 매개변수를 가질 수 있고, 이런 의존은 얼마든지 중첩할 수 있다. 매개변수는 ENUM의 열거자나 BOOLEAN의 TRUE·FALSE 값마다 따로 정하며, 그 값 뒤의 중괄호 안에 적는다. 매개변수에는 어떤 속성 타입이든 쓸 수 있다. 한 조건부 속성의 여러 갈래에 이름이 같은 속성이 있으면 타입도 같아야 한다.[1]
구현 정의에서 속성에 WITH_AUTO를 붙이면 그 값을 생성기가 계산할 수 있고, 애플리케이션 정의와 기본값에 AUTO를 쓸 수 있다. OS 객체의 STATUS 속성은 자동 배정을 지원하지 않는다.[1]
기본값은 애플리케이션 정의에 속성이 빠졌을 때 생성기가 쓰는 값이다. 선택 속성에는 기본값이 필수이며, 기본값을 쓰지 않게 하려면 NO_DEFAULT를 주고 그 속성을 애플리케이션 정의에 적어야 한다. 표준 속성에는 명세가 따로 허용하지 않는 한 기본값을 둘 수 없다.[1]
다른 파일은 ISO/ANSI-C와 같은 꼴의 #include <file>과 #include "file"로 포함한다. 앞 꼴은 도구에 지정한 검색 경로를, 뒤 꼴은 포함하는 파일이 있는 디렉터리를 쓴다. 객체, 속성, 값에는 콜론 뒤에 큰따옴표로 감싼 설명을 붙일 수 있고, 설명의 해석은 구현이 정한다. 구현 고유의 추가 매개변수는 선택 속성에만 둘 수 있으며, 이식성을 위해 표준 속성에는 둘 수 없다.[1]
판과 호환
OIL의 판은 OSEK OS와 OSEK COM 명세의 판에 대응한다.[1]
| OIL | 대응하는 판 | 앞 판과의 호환 |
|---|---|---|
| 2.0 | OSEK OS 2.0r1 | — |
| 2.1 | OSEK OS 2.0r1 | 호환되지 않음. OIL 안의 문법과 의미를 넓혔다. |
| 2.2 | 명세에 적히지 않음 | 호환됨. 새 표준 속성만 더했다. |
| 2.3 | OSEK OS 2.2 | 호환됨. 새 표준 속성만 더했다. |
| 2.4 | OSEK OS 2.2·2.2.x, OSEK COM 3.0·3.0.x | 호환되지 않음. TASK와 ISR 객체의 ACCESSOR 속성을 MESSAGE 속성으로 바꾸고 MESSAGE 객체를 완전히 다시 정의했다. |
| 2.5 | 2.4와 같음 | 호환되지 않음. MESSAGE 객체를 공급자 쪽 MESSAGE와 OEM 쪽 NETWORKMESSAGE로 나눴다. |
OIL은 객체와 표준 속성의 집합을 둘 정한다. 전체 집합은 OSEK OS와 기능을 다 갖춘 OSEK COM을 다루며 conformance class BCC1, BCC2, ECC1, ECC2, CCCA, CCCB, CCC0, CCC1을 지원한다. 부분집합은 내부 통신만 하는 OSEK OS를 다루며 BCC1, BCC2, ECC1, ECC2, CCCA, CCCB를 지원한다. OIL 구현은 둘 가운데 하나를 지원해야 한다. 내부 통신용 부분집합과 표준 속성의 기본값은 OIL 2.4에서 들어왔다.[1]
System Generator와 빌드
OIL 명세가 예로 드는 개발 과정에서 System Generator는 OIL 구성 파일을 입력으로 받아 C 코드 파일을 만드는 도구다. 이 코드와 사용자 소스 코드가 컴파일러로 들어가고, 링커가 실행 파일 하나를 만든다. OS 커널이나 OSEK COM 같은 하위 시스템은 소스 코드로 배포되면 애플리케이션과 함께 컴파일되고, 라이브러리로 배포되면 링커가 통합한다.[1]
시스템 생성과 거기 쓰는 도구는 구현마다 다르다. OSEK OS 2.2.3 명세는 구현과 시스템 생성에 관한 사항을 OIL 명세로 넘긴다.[2] OSEK/VDX OIL은 ISO 17356-6:2006으로 국제 표준이 됐다.[3]