중요한 개념입니다.

크리티컬 섹션으로 인해서 프로그램이 이상하게 동작 할 수 있지용 ㅋ

모르는 사람은 왜 이러나 하고 디버깅하기가 쉽지 않은데~ 한번 겪어본 사람은 그래도 접근을 할수는 있으니
이런게 있구나 하고 들어두시면 되겠습니다.

조금더 이해를 돕기 위해서는 Reentrancy(재진입성) 에 대해서 이야기하겠습니다.

: 함수는 함수인데, 언제 어느 시점에서든이 콜 되어도 문제가 없는 함수를 재진입성 함수라고 불러요.
좀더 직관적으로 설명을 드리자면, 1번 테스크에서 A 라는 함수를 콜해서 잘 돌고 있는데 갑자기 인터럽트가 걸려서
A 라는 함수를 또 콜해버리고, 인터럽트에서 복귀하니까 다른 우선순위 높은 테스크로 CPU 점유율이 넘어갔는데
그녀석이 또 A라는 함수를 불르고......

이런식으로 진행이 되어도 아무런 문제가 없는 형태의 함수를 재 진입성 함수라고 합니다 ㅋ
대부분 Local 변수들로 짜져있겠죠??

그래가 각 테스크의 스텍에 변수들을 생성하니까, 여기서 불르던 저기서 불르던 서로 별개의 변수가 될것 아닙니까 ㅋㅋ

그런데... 함수에서 전역 변수를 사용한다면????
아 이거 이야기가 달리지지요 ㅋㅋㅋ

예제 나갑니다.

int Temp; (어거 전역입니당~~)

void swap(int *x, int*y)
{
   Temp = *x;
      <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   인터럽트!!!!!
   *x = *y;
   *y = Temp;
}

자 위와같은 함수를 하나 짜놓았다고 가정합시다.

x 와 y 에 들어있는 값이 2와 3이라고 가정하구요~

메인에서 2와 3의 위치를 바꺼조 하면서 swap 이란 함수를 콜했어용~

Temp 에다가 2를 집어넣고 x 에 y 를 집어넣으려던 찰나에 인터럽트가 걸린 겁니다.

그래놓고 나서 우선순위가 높은 다른 테스크로 CPU 점유권이 넘어가버렸다고 가정하지요

그 테스트에서는 4와 5라는 값을 바꾸려고 swap 을 콜했군요.

일단 4,5라는 값은 잘 바뀔것입니다~ 하지만 이때 Temp 에 있던 2라는 값이 4로 Overwrite 되어 버리지요~

그다음 원래 테스크로 CPU 가 돌아왔을때 x=3, 이지만 y=4 라는 이상한 결과가 나와버리는 것이지요~

Temp 는 전역변수였으니까요 ㅋㅋ 

이런 함수들은 비재진입 함수라고 부릅니다 ㅋ

이렇듯 비 재진입 함수들에서 절대로 분리가 되면 안되는 코드의 구역이 존재합니다.
만약 분리가 되어버려 왔다리 갔다리 하다가 여러 곳에서 진입을 할경우 데이터가 손실될 우려가 있는 구간.

이런 구간을 우리는 Critical Section  이라고 부릅니다.

이런 구간을 막아주기 위해서 우리는 Critical Section 앞쪽에서 인터럽트 Disable , Critical Section 이 끝난 후에

인터럽트 Enable 을 해주는 방식으로 보호합니다~ 

일단 한번 진입하고 나면 무조건 쭈욱 돌아라 라는 의도이지용 ㅋ 

대표적인 Critical Section 을 하나 알려드리지용~

USART TX 통신 구현시에 Ring Buffer 를 구현하지용 ㅋ

void USART_Transmit( u8 data ){
u32 tmphead;
// Calculate buffer index //
__disable_irq();
tmphead = (u32)( USART_TxHead + 1 ) & (u32)USART_TX_BUFFER_MASK;  
__enable_irq(); 

if(tmphead == USART_TxTail)
BufferOverFlow =1;
while ( tmphead == USART_TxTail );
USART_TxBuf[tmphead] = data;                 // Store data in buffer
__disable_irq();
USART_TxHead = tmphead;                      // Store new index
__enable_irq();
USART_ITConfig(USARTx, USART_IT_TXE, ENABLE); // Enable TX Interrupt    


실제로 제가 사용하는 코드의 일부입니다.

붉은색으로 표시 해 놓은것이 보이시지요??

저곳이 바로 크리티칼 섹션입니당~~~

왜냐구요???

아 그것은.... 일단 이해하실수 있는분만 이해하시거나 아래 댓글로 질문해주세요 ㅋㅋ
주제에 벗어나는것 같으니까 나중에 설명할 기회가 있으면 USART 통신 설명하면서
한번 다루도록 하겟스무니다이~~~ ㅋㅋ 

흐음.. 사진이 없으니까 허전하넹 ㅋㅋ 

최근에 아주 재미있게 본 파파씨네 펭귄들 사진이라도 올려야겠따 ㅋㅋㅋ



 
Posted by J.Bear