목록2025/07 (6)
지노랩 /JinoLab
FreeRTOS에서는 여러 태스크가 서로 데이터를 주고받거나 작업 순서를 보장(동기화)해야 할 때, **세마포어(Semaphore)**를 자주 사용합니다. 특히 **이진 세마포어(Binary Semaphore)**는 “A 태스크가 데이터를 준비했을 때 B 태스크를 깨워서 처리하도록 한다”는 매우 대표적인 동기화 패턴을 간단히 구현할 수 있게 해줍니다. 본 글에서는 **“이진 세마포어를 사용해 두 태스크를 순차적으로 동기화하는 방법”**을 단계별로 살펴보겠습니다.1. 왜 동기화(Synchronization)가 필요한가?가령 다음과 같은 시나리오를 생각해 봅시다.Task 1(Producer): 센서에서 데이터를 읽어서 처리 결과(또는 가공 결과)를 준비한다.Task 2(Consumer): Task 1이 준비..
실시간 운영체제(RTOS)에서는 여러 태스크(Task)와 인터럽트(ISR)가 공유 자원(Resource)을 안전하게 사용하거나 이벤트를 신호(Signaling)하기 위해 **세마포어(Semaphore)**라는 커널 객체를 자주 사용합니다. FreeRTOS는 이 세마포어를 두 가지 주요 유형으로 제공합니다:Binary Semaphore (이진 세마포어)Counting Semaphore (카운팅 세마포어)본 글에서는 두 가지 세마포어의 특징과 용도를 정리하고, 실전 예시로 언제 어떻게 사용하면 좋을지 살펴보겠습니다.1. Binary Semaphore (이진 세마포어)1-1. 구조와 동작 원리값의 범위: 오직 0 또는 1 두 값만 가질 수 있습니다.값이 1일 때 → “세마포어 토큰(=열쇠)이 있다(Availa..
FreeRTOS를 사용하다 보면 “세마포어를 어떻게 생성하고, 내부적으로 어떤 정보가 관리되는가”가 궁금해질 때가 많습니다.이 글에서는 세마포어가 막 생성되었을 때 커널 내부에서 어떻게 관리되고, 각 태스크가 어떻게 대기·획득되는지 단계별로 살펴보겠습니다.1. 세마포어란 무엇인가?**세마포어(Semaphore)**는 여러 태스크(Task)나 ISR(Interrupt Service Routine)이“공유 자원(리소스)” 또는 “이벤트 신호”를 주고받으며 동기화(Synchronization) 또는 **상호 배제(Mutual Exclusion)**를 구현하게 하는 커널 객체입니다.FreeRTOS에서는 크게 두 종류의 세마포어를 지원합니다.Binary Semaphore (이진 세마포어)0 또는 1의 값만 가짐...
프로그램이 복수의 작업(스레드/태스크)을 동시에 수행하는 멀티태스킹 환경에서,여러 작업이 협력하여 원하는 결과를 올바르게 만들어내려면❗ “동기화” 와 ❗ “상호 배제” 개념을 반드시 이해해야 합니다.특히 임베디드 시스템에서는 FreeRTOS와 같은 실시간 운영체제를 많이 사용하므로,FreeRTOS가 제공하는 세마포어(Semaphore)·뮤텍스(Mutex) 같은 커널 객체를 활용해이 두 개념을 실전에서 어떻게 구현하는지 살펴보는 것이 중요합니다.1. 동기화(Synchronization)란?1-1. 일상(Real World) 예시“동기화”란 쉽게 말해 **“일정한 규칙(또는 시점)에 따라 여러 주체가 함께 움직인다”**는 의미입니다.예를 들어, 내일 오전 11시에 상사와 1:1 미팅이 잡혀 있다고 합시다.명..
FreeRTOS의 **소프트웨어 타이머(Software Timer)**는 실제 하드웨어 타이머 없이, 오로지 코드만으로 일정 주기마다 특정 콜백 함수를 호출해 주는 기능입니다.“500ms마다 LED를 깜빡이게 하고 싶다”거나 “1초마다 특정 작업을 수행해야 한다” 같은 반복적이고 주기적인 작업을 간편하게 처리할 수 있도록 도와줍니다.1. 하드웨어 타이머 vs. 소프트웨어 타이머1-1. 하드웨어 타이머MCU(예: STM32)의 타이머 페리페럴(TIM1, TIM2, …)을 직접 설정초단위(μs, ns) 정밀도 가능설정 단계타이머 클럭 분주(프리스케일러) 설정자동 리로드 레지스터(ARR)에 주기 값 설정인터럽트(업데이트 이벤트, CC 인터럽트 등) 활성화ISR(Interrupt Service Routine)에..
이 예제에서는 FreeRTOS 큐(Queue), 소프트웨어 타이머(Software Timer), 그리고 **태스크(Task)**와 **태스크 알림(Task Notification)**을 결합하여,UART로부터 사용자의 명령을 받아LED 이펙트 제어(LED 플래싱 패턴)실시간 시계(RTC) 설정 / 조회기능을 수행하는 심플한 콘솔 애플리케이션을 완성해 봅니다.1. 전체 구조 및 흐름 개요이 애플리케이션은 크게 **4개의 주요 구성 요소(모듈)**으로 나눌 수 있습니다.UART 입출력 모듈사용자로부터 **명령어(Command)**를 받아 파싱응답(메뉴, 에러 메시지 등)을 다시 UART로 출력명령어 처리(Task)“사용자 입력 → 큐(Queue)로 전송 → 명령어 파싱 태스크(CommandParserTask..