Task2와 Task1이 ready상태에서 Task2의 priority가 높아 먼저 돌게 된다. 그러다가 이벤트를 기다리면 waiting상태로 바뀌고 Task1이 돌다가 Task3이 들어오면 priority가 더 높은 Task3가 running된다. Task3에서 Task2가 기다리는 event를 발생시켜주면 Task2는 다시 ready상태로 바뀌고 Task3이 완료되면 Task2가 실행된다.
timing behavior가 중요한 경우 basic task와 extended task를 섞어쓰는 경우에 extended task의 priority를 더 낮게 해주는 것이 좋다.
-> extended task는 event를 wait mechanism이 있기 때문이다.
Configuring Event
이벤트의 개수는 target hardware에 따라 결정된다.
이벤트 반드시 선언해야 한다.(oil 파일에)
name : run-time에서는 그 이름이 mask로 사용된다.
최소한 하나의 task에서 사용되야한다.
event mask : N-bit vector
같은 event가 다른 Task에 정의되도 서로 다른 event로 간주된다.
Waiting Tasks
extended task는 보통 AUTOSTART된다. 원래 모든 테스크는 다른 테스크가 해당 테스크를 activate 시켜줘야 ready 상태로 들어간다. 하지만 AUTOSTART라고 규정하면 OS가 start될 때 해당 task를 자동으로 activate된다.
Waiting on Event
WaitEvent(EventMask) 사용
suspended state에 있는 task에 event를 발생시킬 수 없다.
Setting Events
SetEvent() : event를 발생시키겠다.
ex. SetEvent(Task2, Event1) : 어떤 task에 어떤 event를 발생시키겠다. Task2에 event1을 발생시키겠다.
Task가 suspend state면 event를 발생시켰을 때 error가 발생하는데 사전에 GetTaskState()를 사용해서 state를 확인한다.
Clearing Events
ClearEvent() : event 처리
Counters
Alarm을 쓰려면 counter를 정의해야 한다.
OS입장에서 counter는 기억장소이다.
종류(AUTOSAR에서 규정)
Hardware Counter
Software Counter
Maximum value : 이 counter를 가졌을 때 최대값(보통 32bit이므로 2^32-1)
Minimum cycle : counter를 사용하여 alarm을 설정할 때 cycle을 설정한다. 그것의 최소 cycle.
Counter는 OS kernel이 가지고 있는 tick이 발생할 때마다 값이 1, 2, 3 증가하는 변수다. Counter가 제대로 동작하기 위해서는 일정한 주기로 증가시켜줘야하는 것이 필요하다. 그것을 counter driver라고 한다. 하지만 OSEK OS에서는 제공하지 않는다.
Alarms
OS에서 특정 counter에 구간을 설정하고 그 구간에 도달하게 되면 alarm이 expired(alarm이 발생하는 시점) 되게 하는 mechanism을 제공한다.
어떤 알람을 쓸 것인지 oil에 정의한다.
counter를 지정, counter에 alarm attach
alarm은 counter 값이 어느 특정 값에 도달하면 어떤 액션을 취할 것인지 세팅하면 OS가 알아서 처리한다.
alarm이 expire 됬을 때
Activate Task
Alarm callback routine 호출할 수 있다.
event를 발생 시킬 수도 있다.
Startup and Shutdown
OSEK OS를 사용하여 exe 파일을 만들면 target 보드에 부팅되어 시작시키면 프로그램을 시작시킨다. -> startup
exe파일이 target에 부팅됬을 때 OS는 실행파일 속에 존재한다. OS kernel이 하나의 프로그램으로 묶여있는 상태에서 같이 로딩된다. -> Initially the operating system is not running.
Power-on or Reset
reset을 하면
LPC1768에서는 메모리 0번지(스택 주소가 담겨있음)로 가서 스택주소를 스택 레지스터에 올려놓고 다음 instruction부터 실행시킨다.
reset vector : 메모리 내의 특정 위치에 address값이 저장되어 있다. Reset을 시키면 하드웨어가 무조건 그 값을 읽어 프로그램 카운터에 집어넣는다.
Application start-up
InitializeTarget() : OS가 올라가지 않은 bare metal 상태이다. 이때 자기 어플리케이션이 동작하기 위해 필요한 하드웨어에 대한 초기화 작업이 벌어진다. InitializeTarget에서 어떤 일이 벌어지냐
Application modes : StartOS를 호출할 때 파라미터로 넘겨주는 것 -> StartOS(OSDEFAULTAPPMODE)
Initialize Target Function
Setting up Memory
memory configuration : 내가 프로그램을 돌릴 때 사용하는 영역이라든지 memory map을 만드는 것이다.
Setting up Peripherals
Setting up Interrupts
Enabling Interrupts
Setting up Timers
Starting OS
Startup Hook
Application Modes
OS kernal을 start하면서 넘겨주는 파라미터 값
Shutting Down OS
oil 작성 체계
oil 파일을 작성한다. = 내 OS 커널에서 사용하게 될 object와 해당 object가 갖게 될 attribute 값을 설정하는 것이다.
OIL obeject 규정 -> 해당 object들은 attribute를 가진다.
CPU
OS
APPMODE
ISR
RESOURCE
TASK
COUNTER
EVENT
ALARM
COM
MESSAGE
NETWORKMESSAGE
IPDU
NM
implementation definition vs application definition
implementation definition
OS vendor, OSEK OS 자체를 만드는 사람이 만들어놓는다.
application definition에서 사용할 수 있는 object와 attribute의 범위를 결정
어떤 객체를 쓸 수 있다. 그 object에 대해서 어떤 attribute를 정의할 수 있는데 그 attribute의 타입은 어떻게 된다. 그리고 해당 타입의 default값은 어떻게 된다.
OS {
ENUM [STANDARD, EXTENDED] STATUS = EXTENDED;
BOOLEAN STARTUPHOOK = FALSE;
.
.
.
}