Embedded System Software는 기본적으로 무한 loop구조를 가졌기 때문에, 한정된 일만 할 수 있는 한계가 있지요. 아함~ 한정된 일만 하다 보니까, 무료한 일상입니다요. 아침에도 Lamp를 깜빡 깜빡, 점심에도 Lamp를 깜빡 깜빡, 저녁에도 Lamp를 깜빡 깜빡.
void main ()
{
Lamp_init();
while (1)
{
Lamp_on();
time_wait (100); /* wait 100uS */
Lamp_off();
time_wait (100); /* wait 100uS */
}
}
아~ 깜빡만말고, 나한테는 Motor도있는데, Motor도움직이고싶다. 그러면 또하나의 main()함수를 만들어내면 되는겁니다요.
void main()
{
Motor_init();
while (1)
{
Motor_on();
time_wait (100); /* wait 100uS */
Motor_off();
time_wait (100); /* wait 100uS */
}
}
Motor를 움직이려면 또 이런 구조의 무한 Loop가 필요하지요. 그냥 Lamp 무한 Loop에 Motor도 끼워 넣지 머.
void main ()
{
motor_init();
while (1)
{
Lamp_on();
time_wait (100); /* wait 100uS */
Lamp_off();
time_wait (100); /* wait 100uS */
Motor_on();
time_wait (100); /* wait 100uS */
Motor_off();
time_wait (100); /* wait 100uS */
}
}
아.. 난 이제.. Lamp도 깜빡일 수 있고, Motor도 움직일 수 있어. 아.. 하지만.. 또.. 똑같은 일의 반복이네.. 좀 더.. 많은 일을 할 수는 없을까? 좀 지루하지요. 그래서 Embedded System에 생기를 불어 넣어준 것이 바로 RTOS라는 거에요. Real Time OS인데요, 실은 RTOS라는 말은 좀 그렇죠. RTOS라는 말보다는 Embedded OS라는 말이 더 맞다고 봐야겠네요. RTOS는 뭐시깽이 Hard/ Soft 뭐 이런 구분이 있거든요. Hard는 응답을 정해진 시간 안에 주는, 그리고 Soft는 응답을 하기만 하면 되는 뭐 그런 건데, 예전같이 Embedded에 탑재되는 Processor가 느릴 때는 그게 중요했었지만, 요즘은 워낙 Computing Power가 좋아져서 Soft도 웬만한 시간 안에 응답을 주니까, 그다지 큰 구분은 많이 없어 졌어요. 물론 돈이 많이 들어가는 미사일이나, 위성 같은데 사용하는 것들은 시간 응답성이 워낙 좋아야 하니까, Hard type의 RTOS라는 말이 공공연히 쓰여지고 있으나, 우리가 보통 만드는 Embedded System은 그렇진 않으니까, 굳이 그렇게 까지 구분하는 건 무리가 아닌가 싶어요. 긁적.
뭐, 막상 Embedded OS는 Scheduler라는 기능을 가져요. Embedded System의 매니저에요. 할 일들, 스케쥴을 관리해서 그때그때 그 일을 하게 해주죠. Lamp의 무한 Loop의 함수 이름을 Lamp_task() 라고 이름 지어주고요, Motor의 무한 Loop의 함수 이름을 Motor_task() 라고 이름 지어줘 볼까요? - 보통은 한가지 일 단위에 따라서 task라는 이름의 형태를 갖고요, Scheduling의 기본 단위가 되어요 -
void Lamp_task ()
{
Lamp_init();
while (1)
{
Lamp_on();
time_wait (100); /* wait 100uS */
Lamp_off();
time_wait (100); /* wait 100uS */
}
}
뭐 이렇게 이름 지을 수 있겠네요. Lamp Task는 무한히 깜빡이는 일을 하죠. 그러면, 또 다른 Motor를 돌리는 Motor Task도 같이 돌아야겠죠. 그러면 Lamp_task()와 Motor_task()가 서로 주거니 받거니 일을 했으면 좋겠는데 말이죠. 그래서 signal이라는 걸 만들어줘 보죠. 이건 Task끼리 signal을 주고 받을 수도 있고, 그걸로 서로 일을 시킬 수도 있는 거라 생각하시면 되요. wait(signal); 이라는 함수를 약속해 볼까요? wait (signal)은 signal을 기다린다는 의미이고요, signal을 기다리기만 해서는 안되겠죠. signal을 주는 일도 해야 하니까, send (task, signal) 이라는 함수를 약속해 보면, 어떤 task한테 signal을 주는 역할을 한다고 해보죠. 그러면, 위의 task를 이런 식으로 만들면 서로 주거니 받거니 될까요?
/* 여기에서 Make_Ready() 함수는 대상 함수를 Ready, 즉 Scheduling이 일어 났을 때 제일 먼저 실행 될
Task로 설정해 주는 함수라고 보시지요 */
void main ()
{
Make_Ready (Lamp_task());
wait (DONE); /* Lamp task는 init을 하고 DONE을 주고 WORK을 기다리겠지? */
Make_Ready (Motor_task());
wait (DONE); /* Motor task는 init을 하고 DONE을 주고 WORK을 기다리겠지? */
send (LAMP, WORK) /* Lamp task야 깜빡여 보렴 */
return; /* Good bye forever */
}
void Lamp_task ()
{
Lamp_init();
/* 우선은 초기화는 무조건 하네 */
send (main, DONE); /* wait을 만나면 main으로 돌아가~ */
while (1)
{
wait (WORK); /* 여기서 WORK이라는 signal을 일단 무작정 기다리죠 */
/* while(1)이니까 한번 깜빡이면 항상 여기서 signal을 기다리죠 */
/* Signal을 받기만 하면, 일을 시작 할테야 */
clear (WORK); /* WORK을 받았으니 다음번에도 WORK을 받을 수 있도록 초기화 해주자 */
Lamp_on();
time_wait (100); /* wait 100uS */
Lamp_off();
time_wait (100); /* wait 100uS */
send (MOTOR, WORK); /* Motor task야 Motor를 돌려봐 */
}
}
void Motor_task ()
{
Motor_init();
/* 우선은 초기화는 무조건 하네 */
send (main, DONE); /* wait을 만나면 main으로 돌아가~ */
while (1)
{
wait (WORK); /* 여기서 WORK이라는 signal을 일단 무작정 기다린다 */
/* while(1)이니까 한번 깜빡이면 항상 여기서 signal을 기다린다 */
/* Signal을 받기만 하면, 일을 시작 할테야 */■
clear (WORK); /* WORK을 받았으니, 다음번에도 WORK을 받을 수 있도록 초기화 해 주자 */
Motor_on();
time_wait (100); /* wait 100uS */
Motor_off();
time_wait (100); /* wait 100uS */
send (LAMP, WORK); /* Lamp task야 Lamp를 깜빡여봐 */
}
}
뭐 이런 걸 그림으로 그려보면?
뭐 이런 식의 동작을 무한히 반복하겠죠 뭐. 오라, 간단하죠? 이것이 바로, Embedded System에서의 Task의 구조인 거에요. Task를 이렇게 만들어 놓으면 죽을 때 까지 죽지 않고요, 시킬 때 마다 자기에게 주어진 일을 하고 다시 기다리는 구조로 되어 있는 거죠. 차암~ 쉽죠~잉?
![](https://tistory1.daumcdn.net/tistory/6281347/skin/images/./ico_comment.gif)
![](https://tistory1.daumcdn.net/tistory/6281347/skin/images/./icon_depth.gif)
![](https://tistory1.daumcdn.net/tistory/6281347/skin/images/./icon_depth.gif)
![](https://tistory1.daumcdn.net/tistory/6281347/skin/images/./icon_depth.gif)
![](https://tistory1.daumcdn.net/tistory/6281347/skin/images/myface_recipes.jpg)
![](https://tistory1.daumcdn.net/tistory/6281347/skin/images/click15x15.png)
댓글