Thread(쓰레드)
RTOS 시스템에서는 어플리케이션이 그리고자 하는 큰 그림을 쓰레드(Thread)라는 작은 단위의 일/작업 단위들이 유기적으로 동작하면서 완성하게 된다.
Thread는 형태적으로는 함수와 동일하지만 그 존재를 OS에 등록해 놓고, OS가 그 실행의 흐름을 관장 할 수 있도록 조치 한다는 것이 다른 점이라 할 수 있다.
즉, 일반 함수와 다른 점은 그 용법이라고도 볼 수 있겠다.
1. 쓰레드의 특징
♦ 생성(O/S에 등록)해 놓으면 O/S 스케쥴러가 그 실행의 흐름을 관장한다.
♦ 쓰레드간 실행의 우선순위가 있으며, 스케쥴러에 의한 Scheduling의 기본단위이자 Context Swithing의 대상이 된다.
♦ Running, Ready, Suspend, Terminate와 같은 동작상태가 있다.
♦ 사적메모리로는 Stack을 할당받아 사용하며, 공유메모리로는 시스템/프로세스 소유의 Code, Data, Heap 영역을 다른 쓰레드들과 함께 사용한다.
2. 쓰레드의 정의
아래는 쓰레드를 정의한 것이다. 함수를 정의하는 것과 동일하다. 따라서 함수로써 호출될 수도 있다. 다만 그 용법에서는 앞서 말한바와 같이 차이가 있다.
3. 쓰레드의 생성
앞서 정의해 놓은 함수를 O/S가 제공하는 API를 사용하여 아래와 같이 등록/생성 하므로써 이 함수는 비로소 Thread로 탄생되고, 쓰레드로서 실행될 수 있겠다.
RTOS 시스템은 쓰레드를 등록할 때 받은 정보를 토대로 쓰레드에 대한 스케줄링(우선순위), Context Swithing시 실행할 코드위치, 메모리(Stack) 등을 관리해 갈 것이다.
thread_new(5, momo, 0x500, p); ← thread_new( uint8_t priority, mos_thread_func_t function, uint32_t stack_size, void *arg )
4. 쓰레드의 종료
쓰레드를 종료하여 O/S의 관리체계에서 벗어 날때에는 쓰레드가 차지하고 있던 시스템 자원(Resource)은 시스템에게 깨끗이 되돌려 주도록 하자.
♦ 사적자원(Stack)은 쓰레드를 종료하므로써 자연히 시스템에 반납되지만,
♦ 공유메모리는 명시적으로 시스템에 돌려줘야한다. → 예로 malloc()을 통해서 할당했던 메모리영역을 들 수 있다..