- 멀티태스킹 시스템에서 여러 Task 나 ISR이 공유 자원에 동시에 접근
→ Data Corruption이 발생 가능- Accessing Peripherals (주변장치 접근)
- 여러 Task가 동시에 UART, SPI, I2C에 접근
- 출력 충돌, 데이터 손상, 통신 오류
- Read-Modify-Write Operations (읽기-수정-쓰기 연산)
- count++, total += value 같은 연산은 다단계 연산
- context switching 발생 시 값이 꼬임
- Non-atomic Access to Variables (비원자적 변수 접근)
- 32비트 변수나 구조체 등 멀티바이트 자료를 여러 Task가 접근
- 중간 값이 읽히거나 쓰이면 예상과 다른 결과
- Function Reentrancy (재진입성 문제)
- printf, rand 같은 함수는 thread-safe 하지 않음
- 여러 Task가 동시에 호출하면 내부 버퍼 충돌
- Accessing Peripherals (주변장치 접근)
- freeRTOS document에서 multitasking system의 오류 발생 포인트를 정리해보았다.
- FreeRTOS 시스템에서는 Task 뿐만 아니라 ISR도 공유자원에 접근 가능
→ 위험성 증가 (ISR이 Task를 가로채 실행될 수 있음)

⇒ Mutual Exclusion 기법으로 관리되어야 함 - mutual exclusion : 한 시점에 단 하나의 Task 또는 ISR만 자원에 접근 가능하게 제어
- 자원 보호 및 데이터 무결성 유지
- FreeRTOS 시스템에서 다양한 mutual exclusion 도구를 제공

→ 가장 간단하고 안전한 방법은 공유 자원이 없도록 설계하는 것
→ 하나의 자원은 하나의 Task만 접근!
다음은 위 4 방법 중 Critical Section을 만드는 두 가지 방법이다.
Critical section
인터럽트 응답 시간에 영향을 끼치므로, Critical Section은 짧아야 한다.

- taskENTER_CRITICAL / taskEXIT_CRITICAL 함수
- taskENTER_CRITICAL
- critical section 시작
- taskEXIT_CRITICAL
- critical section 종료
두 함수 모두 입력 인자와 반환 값이 없다.
함수명이 FromISR로 끝나지 않으며, ISR로 호출되는 것만은 아니다.
⇒ ISR로부터 접근이 가능하기 때문에, 완전한 보호가 되지 않는다.

- taskENTER_CRITICAL_FROM_ISR / taskEXIT_CRITICAL_FROM_ISR 함수
앞선 함수에서 interrupt safe 버전이다.
- taskENTER_CRITICAL_FROM_ISR
- taskEXIT_CRITICAL_FROM_ISR→ ENTER 함수의 반환 값과 일치해야만 한다.
- 입력 인자로서 ENTER의 반환 값을 받는다.
Suspending (or Locking) the Scheduler
Scheduler에 lock을 걸어 선점을 막는다.

- vTaskSuspendAll / vTaskResumeAll 함수
- vTaskSuspendAll
- return 값
- 스케줄러가 suspend 된 동안 요청된 context switch는 보류 상태로 남는데, 스케줄러가 재개될 때 실행된다. 보류된 context switch가 스케줄러 재개 전에 수행되면 pdTRUE를 반환하고, 그렇지 않으면 pdFALSE를 반환한다.
- 스케줄러를 suspend 한다.
- vTaskResumeAll
- 스케줄러 Suspend 해제시킨다
- vTaskSuspendAll
'RTOS' 카테고리의 다른 글
| freeRTOS Resource Management(2)-Mutexes(and Binary Semaphores), Gatekeeper Tasks (0) | 2026.02.26 |
|---|---|
| freeRTOS Task management(2) -라운드로빈, 우선순위스케줄링과 Not Running State (0) | 2025.05.25 |
| freeRTOS Task Management(1)-CMSIS, Task 생성 (0) | 2025.05.25 |