[FreeRTOS] 태스크간 통신(IPC)

seopppio·2024년 11월 3일

FreeRTOS

목록 보기
6/14

세마포어

  • 3가지 연산만 가능
  1. 초기화 연산(동적 초기화)

    sem_create 커널 API 활용해서 세마포어 구조체 내부의 카운터 변수를 1로 초기화

  2. P연산

  3. V연산

    만약 우선순위가 T1,T2,T3 순으로 높다고 가정
    세마포어 변수가 초기화 된 상태에서, T3가 deposit함수를 부른다
    그러면 sem 변수가 0으로 바뀐다. 그리고 아래 코드를 진행하다가, 우선순위가 높은 T2, T1이 선점하여 deposit()을 불렀다고 하자. 그러면 세마포어 잠금에 의해 T1,T2는 블럭 상태로 돌아가고 안정적으로 T3가 돌아간다. 다 종료가 되면 세마포어변수를 다시 1로 바꿔주고, 이후 우선순위가 높은 T1이 선점하여 deposit()함수를 실행한다. 하고 T1이 끝났지만, 우선순위가 그럼에도 불구하고 T1이 더 높기 때문에 T2가 실행되지는 않는다

  • 세마포어 변수는 절대로 음의 정수가 될 수 없다

이벤트 전달용으로 사용되는 생산자/소비자 프로세스의 세마포어 IPC


우선순위가 높은 소비자 프로세서에서 P연산을 하면, 소비자 프로세스가 멈추고, 우선순위가 낮은 생산자 프로세스에서 V연산을 해서, 다시 소비자 프로세스를 실행하게 한다.

생산자 프로세스에 의해 제어를 하는 느낌으로 만들 수 있다

동기화 : 이벤트를 주기적으로 주고 받는것

xSemaphoreCreateBinary

세마포어 만드는 함수(0과 1의 값만을 가지는 세마포어 만듦)

xSemaphoreTake


우선순위가 가장 높은 메인테스크에서, xSemaphoreTake로 세마포어를 획득하려고 하지만, 세마포어 초기값이 0이여서, 메인 테스크가 blocked된다.
이후 다음으로 우선순위가 높은 Task1이 선점

xSemaphoreGive


Task1 함수에 xSemaphoreGive에 의해 sem_id의 세마포어 값이 1로 초기화, 이후 메인테스크가 선점하여loop문 돈다

다 돌고 메인 테스크가 스스로를 삭제하고, 다시 Task1을 수행한다

다시 Task1의 무한 for문에서 xSemaPhoreGive를 하지만, Take하는 세마포어가 없어서, err에는 0이 반환되고, 밑에 if문이 발동하여, 에러문을 출력한다

xSemaphoreDelete

굳이 삭제 안 해도 됨, 메모리가 열악한 시스템이 아니라면 !
xSemaPhoreGive 했을 때, 세마포어가 삭제 됐거나, Take가 없는경우 0을 반환한다

부트 코드


다양한 핸들러 실행

메인 함수 실행

디버그 모드하면 여기에 멈춰 있음

이렇게 설정되어 있어서

세마포어 예제


GPIO 출력시 발생되는 현상이다


테스크1에서 세마포어를 획득 못하여서 대기 중 이상태로 GPIO 발생


GPIO 콜백 함수 불러지면서, buttoncounter 출력및 ++
pdFalse을 담고, 세마포어 Give한다.

만약 pdTrue면, 세마포어를 획득한 기존 테스크가 있음에도 불구하고 그 함수가 진행되지 않고, 테스크 전환이 일어나 더 높은 우선순위 테스크가 있다면 그 테스크가 수행된다.

그러면 Task1에서 세마포어 획득하고, 마저 진행

카운팅세마포어


인터럽트가 계속 눌러져서 Give가 많이 호출 돼, 세마포어 변수가 증가하면,

while문에서 계속 take하면서, 세마포어 변수를 줄이면서 프린트문 실행된다

0개의 댓글