English

커널구조-크리티컬 섹션 #1

2008.02.26 10:44

권오용 Views:2602 Recommend:45

크리티컬 섹션 즉 임계영역이라고 불리는 이영역은 각 태스크들 사이에서 공통으로 사용하는

공유변수등이 위치하며 이영역에서는 값이 다른태스크에의해 변하는 것을 막기위해 인터럽트를 금지시켜야하며 영역사용이 끝날시에는 인터럽트를 다시 활성화 시킨다.



uc/os-ii에서는 이러한 크리티컬섹션사용을 위해  OS_ENTER_CRITICAL()과 OS_EXIT_CRITICAL()

두개의 매크로를 이용하며 임계영역은 이 두개의 매크로 사이에 위치한다.



두개의 매크로에대해 설명하고자 하면 다음과같다.

OS_ENTER_CRITICAL() : 인터럽트 비활성화 매크로

OS_EXIT_CRITICAL() : 인터럽트 활성화 매크로



uc/os-ii에서는 위의 2개의 매크로를 구현하는데 3개의 방법이 쓰이는데 이방법을 정의하는 곳은

프로세서 의존적 파일인 OS_CPU.H에 있다.



1. OS_CRITICAL_METHOD == 1

  이 방법은 OS_ENTER_CRITICAL()에 인터럽트를 비활성화하는 프로세서 명령을 정의하고

  OS_EXIT_CRITICAL()에 인터럽트 활성화 하는 명령을 정의하는것으로  비교적 단순하지만

  인터럽트 비활성 상태에서 uc/os-ii함수를 호출하면 함수복귀시 인터럽트가 활성화하는 문제가

  있다. 즉 인터럽트 이전상태가 함수호출이후에 변하는  단점이 있다.



2.  OS_CRITICAL_METHOD == 2

이 방법은 인터럽트 활성 / 비활성 상태를 스택에 저장후 인터럽트를 비활성한다.

OS_EXIT_CRITICAL()은 인터럽트 상태를 스택에서 읽어와 복구하는 방식으로 구현된다.

이방법은 첫번쨰방법과 비교하여 인터럽트 이전상태가 함수호출이후에도 변하지 않는 장점이있다.



3. OS_CRITICAL_METHOD  == 3

이 방법은 직접적으로 프로세서에서 제공하는 컴파일러 자체의 명령어를 사용하는 방법이며,

주로 ARM계열을 포팅할시 이방법을 이용한다.



위 방법을 이용한 의사코드와 직접구현한 예제는 3번재글을 참조하기 바란다.