본문 바로가기
WORK/Sotfware

[FreeRTOS] FreeRTOS 에 대한 공부 - 1

by KANG Stroy 2022. 12. 6.
728x90
728x90

FreeRTOS는 생각보다 많은 곳에서 사용되고 있더군요. 어디에요? 글쎄요~ ㅎ프로그램에 대한 공부를 하다보니 이 부분을 빼 놓고 갈 수 없는 부분이 되었습니다. 동작을 공부 해 보기로 했습니다. 시작하고 끝을 내기 위해서 .. 그렇다고 끝이 언제 인가? 라고 물어 본다면? 끝은 없겠죠? 

기본적인 이론들은 많이 나와 있을거라 말해야 하나? 라는 생각이 들면서도.. 이론도 모르면서 이렇게 써야 하나? 라는 생각도 듭니다. 공부를 하는 마음 가짐을 가지면서 진행해 봅니다. 

아래 사진은 테스크의 기본적인 동작 방식 입니다. 테스크는 하나의 동작이라고 생각합니다. 여러개의 일을 책상에 놓아 둔다 가정해 봅니다. 책이 될 수도 있겠내요. 동화, 소설, 자기계발서 등등... 처음에는 2권정도 놓아 둡니다. 동화와 소설 두권만 놓아 두기로 하죠. 두 책을 동시에 읽는것은 쉽습니다. 동화책 그림을 보고, 소설의 내용을 확인하는건 정말 쉬운 동작입니다. 

아래의 테스크 상태도는 책이 끝날때까지 머리속에 들어가 있어야 할거 같습니다. 

동화책은 책상 아래 Task, 소설은 책상 위에 Task가 존재 한다고 봅시다. 

실행(Running)
Task 실제로 실행될 때 이것을 실행중이라 한다 . Task가 현재 프로세서를 사용하고 있다.

준비(Ready)

준비 상태의 Task는 실행 가능하지만 우선순위가 같거나 더 높은 다른 Task가 현재 이미 실행중인 상태에 있기 때문에 실행될 수 없는 상태를 말한다.

대기(Blocked)

만약 Task가 시간적 또는 외부적 이벤트를 위해 기다리고 있다면 이것은 대기 상태에 있다고 한다.
예를 들어 만약 Task가 vTaskDelay() 함수를 호출한다면 이것은 지연 기간이 종료될 때 까지 대기 중인 상태가 된다.
Task
는 또한 큐와 세마포어 이벤트를 기다릴 때 대기 상태가 될 수도 있다.
대기 중인 상태에 있는 Task는 항상 ‘제한 시간’을 가지고 있다.
이 제한 시간이 지나면 Task는 대기 상태에서 벗어난다(unblocked) 대기 중인 Task는 스케줄링 대상에서 제외된다.


중지(Suspended)

중지 상태에 있는 Task는 스케줄링 할 수 없다. Task는 오직 명시적으로 vTaskSuspend() xTaskResume() API 를 호출할 경우에만 중지 상태가 되거나 벗어날 수 있다. '제한 시간’은 명시될 수 없다.

예전에는 각각의 상태를 왜 알아야 할까? 라는 생각이 들었습니다. 그런데 책을 읽으려면 각각의 상태를 알아야 하죠. 어디까지 읽었는지 알아야 하기 때문에 체크가 필요 합니다. 동화책을 읽는 시간은 짧습니다. 그런데 재미가 있죠. 소설을 읽는 시간은 시간이 걸립니다. 가끔 300~400 페이지를 읽는것은 쉬운일이 아닙니다. 

두개의 책은 동시에 읽는다고 하지만, 막상 눈은 하나의 책에 고정이 됩니다. 일단 두 책을 읽기로 마음을 먹었습니다. 첫장을 한장씩 펴 놓았습니다. ( 프로그램 초기화 / 셋팅 ) 우선 순위를 정해 보도록 하겠습니다. 아이가 있는 집은 동화책이 우선 순위가 높을 겁니다. 아이가 빨리 읽어 주세요라는 신호를 보낼 수 있습니다. 

Ready 단계를 살펴 보기로 했습니다. y 만 빼면? Read 가 되겠내요. 독서 입니다. 읽다... 언어 유희 입니다. ㅎ 

Running 단계는 모든 상태로 갈 수 있습니다. 그러나 들어 올수 있는 조건은 오직 Ready 상태여야 합니다. 준비가 되지 않은 상태에서는 절대 Running 상태로 들어 올수 없습니다. 모든 조건은 Ready 상태가 되도록 해야 동작이되는거죠. 책을 읽는거로 생각한다면? 현재의 읽고 있는 책을 접고, 다른책을 펴기 위한 준비 단계 후에 새로운 책으로 넘어 갈 수 있습니다. 

Ready 단계는 Task가 준비 된 상태 입니다. 모든 동작은 Ready 를 거쳐야 합니다. 그러나 Blocked 단계는 들어 갈수 없습니다. Ready에서는 우선순위를 정해 줍니다. 동작을 할 수 있는 조건을 선별 하는거죠. 테스크를 동작 시키고 다른 동작이 없다면 Running에서 Blocked 상태로 움직이게 됩니다. 

Blocked 상태는 대기 상태이죠. 중지가 아니고 대기 상태입니다. 대기하고 있다가 이벤트만을 기다리고 있는겁니다. 단순하죠. 이벤트를 기다리느냐, 아무것도 하지 않으니 Suspended 상태로 갈것이냐를 판단합니다. 

Suspended 상태는 Task를 제어 할수 없는 상태가 됩니다. 오직 Resume API를 호출해야만 벗어 날 수 있습니다. Suspended 상태로 가는경우는 모든 상태에서 가능하지만, 나올 수 있는 방법은 Ready 상태로만 돌아와야 하는거죠. 물고 물리는 상태에 대한 부분입니다. 

RTOS는 이 Task를 기반으로 스케쥴링을 하면서 동작 하기 때문에 Task 상태에 대한 부분을 기억하고 있어야 하겠내요. 

728x90

댓글