목록분류 전체보기 (333)
지노랩 /JinoLab
“코드는 플래시에, 데이터는 램에,스택은 위에서, 힙은 아래에서!”1. MCU 메모리 두 축 — Flash vs. RAM구분 Flash (ROM) RAM (SRAM)용도- 펌웨어·상수(문자열, const) 저장- 인터럽트 벡터 테이블- 전역·정적 변수- 스택(지역 변수 등)- 힙(동적 메모리)특징전원 OFF 후에도 데이터 보존, 쓰기 느림휘발성, 읽기·쓰기 빠름크기 비율RAM 보다 여러 배 큼 (F401RE: 512 KB)Flash 대비 작음 (F401RE: 96 KB)2. RAM 내부 구조 한눈에 ▲ High Addr │ │ ┌──────────────┐ ← SP 초기값 │ │ Stack │ 함수 호출·지역변수 │ └──────────────┘ │ │..
― 임베디드 스택 구조를 5 분 만에 이해하기“FreeRTOS는 커널만 제공한다.나머지는 내가 붙인다!”1. 전체 그림 한눈에 보기┌────────────────────────────────────────┐│ Application ││ • Task 1 (센서 수집) ││ • Task 2 (통신) ││ • Task 3 (UI 업데이트) │└───────▲───────────────▲───────────────┘ │ FreeRTOS API │┌───────┴───────────────────────────────┐│ FreeRTOS ..
― 오픈소스 FreeRTOS vs. 상업용 OpenRTOS·SafeRTOS 한눈에 비교1. FreeRTOS(커뮤니티 버전) – 0원으로 쓰는 RTOS항목 내용가격 / 로열티완전 무료, 판매 수량과 무관하게 로열티 0원라이선스MIT → 기존 GPL+링커예외(과거 버전)보다 훨씬 느슨함 · 커널 수정분은 공개 의무(MIT 조건) · 응용코드(앱·드라이버)는 공개할 필요 없음기술지원공식 포럼·깃허브 이슈만 제공(유료 지원 無)안전규격(SIL/IEC 61508 등)인증 대상 아님 – 세이프티 필수 제품엔 부적합법적 보호(IP, 배상)제공 안 됨🔑 정리“일반 임베디드 제품”이라면 FreeRTOS만으로 충분.커널 쪽을 손봤다면 수정한 파일만 MIT 규정에 맞춰 공개하면 종료!2. SafeRTOS – IEC 615..
“세마포어·큐 없이도 1 사이클 만에 끝나는 가장 가벼운 IPC”1. Task Notification이 뭐길래?특징 설명초경량 IPC별도 커널 객체(세마포어, 큐) 생성 X → RAM, CPU 사용 최소1 Task = 1 Notification ValueTask 생성 시 0 으로 초기화되는 32-bit 변수 포함동시에 3가지 기능① 이벤트 통지 (Unblock) ② 값 전달(32-bit) ③ 비트플래그 동기화ISR 연동FromISR 전용 API 지원 → 인터럽트에서도 안전하게 전송🔖 핵심xTaskNotify() 로 보내고, xTaskNotifyWait() 로 받는다.옵션(eAction)에 따라 값을 덮어쓰거나, 1씩 증가하거나, 비트를 OR할 수 있다.2. API 한눈에 보기사용처 함수 주요 파라미터수..
FreeRTOS 입문하면 vTaskDelay() 만 줄줄 쓰다가“주기가 흐트러져요…😵” 라는 난관을 꼭 맞닥뜨립니다.두 API 차이와 활용 팁을 블로그 포스팅 포맷으로 깔끔히 정리해 봤습니다.1️⃣ 왜 ‘딜레이 API’를 써야 할까? 목적 기존 방법문제점RTOS식 해결CPU 비우기(for/while 지연 대체)HAL_Delay(), busy-wait100 % CPU 점유vTaskDelay()정확한 주기 유지(주기성 태스크)vTaskDelay() 남발실행 지점 ‘밀림’vTaskDelayUntil()2️⃣ vTaskDelay( ticks )“지금부터 n 틱 동안 잠깐 쉰다.”/* 500 ms 동안 Blocked 상태 진입 */vTaskDelay( pdMS_TO_TICKS(500) );입력값: RTOS Ti..
RTOS를 쓰다 보면“태스크가 안 돌아요…” “언제 깨어나는 거죠?” 같은 질문을 매번 하게 됩니다.이번 글에서는 가장 헷갈리는 BLOCKED 상태와 SUSPENDED 상태를 중심으로,Delay API·동기화 오브젝트까지 실전 위주로 정리했습니다.1. 4대 최상위(Task) 상태 복습상태 의미 전이(Transition)RunningCPU 독점 실행 중❌ (오직 1 개)Ready실행 조건 만족 ➜ CPU 할당만 대기▸ 스케줄러가 우선순위 기준 선택Blocked이벤트·시간·자원 을 기다리며 “잠시 쉼”▸ 이벤트/타임아웃 발생 → ReadySuspended사용자 호출로 ‘중단’ – 커널도 안 깨움▸ vTaskResume() 으로만 Ready포인트Blocked ↔ Ready 는 자동 전환Suspended ↔ R..
“내 태스크가 왜 안 돌지?”RTOS 디버깅에서 가장 먼저 확인해야 할 것은 현재 태스크의 상태입니다.이번 포스팅에서는 FreeRTOS(프리RTOS)를 기준으로 4 가지 최상위(Task) 상태와 전이(transition)를 한 번에 정리해 드립니다.0. 배경 지식용어 의미 기억 포인트태스크(Task)FreeRTOS가 스케줄링하는 실행 단위(=쓰레드)메모리: 전용 스택 + TCB(Task Control Block)스케줄러어떤 태스크를 CPU에 올릴지 결정Tick(타이머 인터럽트)마다 동작PSP / MSPProcess Stack / Main Stack 포인터• PSP → 각 태스크 전용 스택• MSP → 커널·인터럽트 스택1. Running – “CPU는 내 꺼!”단일 코어 MCU에서는 오직 하나의 태스크만..
핵심 아이디어SysTick ISR ― xTaskIncrementTick()로 스케줄 필요 여부를 판단하고, 필요하면 PendSV를 펜딩한다.PendSV ISR ― “Old Task 문맥 저장 → 스케줄러 호출 → New Task 문맥 복원” 을 실행한다.두 ISR 모두 NVIC 최하위 우선순위(보통 15)로 동작해, 사용자-/주변장치 인터럽트보다 뒤에 실행된다.0. 선행 지식구분 설명스택 2종PSP(Process Stack Pointer) — 각 태스크 전용 스택MSP(Main SP) — 인터럽트·커널 코드용TCB 첫 멤버pxTopOfStack — 마지막으로 저장된 PSP 값을 보관HW 자동 스택인터럽트 진입 시 Cortex-M이 자동 PUSH: R0-R3, R12, LR, PC, xPSR(8 워드)SW..
(FreeRTOS v10.x - GCC / ARM_CM4F portable/port.c 기준)아래 코드는 원본 소스를 이해하기 쉽게 줄을 간추리고 주석을 덧붙인 의사(edited) 버전입니다.컴파일러마다 약간씩 다르지만, Cortex-M 계열에서는 구조가 동일합니다./*----------------------------------------------------------- * PendSV handler – FreeRTOS 핵심 컨텍스트 스위칭 루틴 *----------------------------------------------------------*/__attribute__((naked)) void xPortPendSVHandler( void ){ /*----------------------..
1. 개요FreeRTOS에서 “태스크(Task)”는 독립적인 실행 흐름을 가진 논리적 단위입니다. 태스크가 CPU에서 실행될 때는 다음 두 가지 리소스를 사용합니다:프로세서 코어 레지스터(Registers)R0~R12: 일반 목적 레지스터R13 (SP): 스택 포인터(Stack Pointer)R14 (LR): 링크 레지스터(Link Register)R15 (PC): 프로그램 카운터(Program Counter)xPSR: 현재 상태(Condition Flag, Interrupt Flag 등)태스크 전용 스택(Task’s Private Stack)함수 호출 시 지역 변수나 복귀 주소(Return Address)를 보관ISR 진입/복귀 시 자동으로 레지스터(R0~R3, R12, LR, PC, xPSR)가 푸시..
1. 컨텍스트 스위칭이란?정의두 개 이상의 태스크(Task)가 하나의 CPU를 공유할 때, CPU를 현재 실행 중인 태스크에서 다른 태스크로 넘겨주는 과정을 컨텍스트 스위칭이라고 합니다.왜 필요한가?실시간 운영체제(RTOS)는 우선순위 기반 스케줄링으로 태스크 간 CPU 점유를 관리합니다.어떤 태스크가 우선순위나 타이밍에 의해 “지금 CPU를 사용할 책임이 없다”고 판단되면, 실행 중이던 태스크의 상태(Context: 레지스터 값, 스택 포인터 등)를 저장하고, 새로운 태스크의 상태를 복원하여 CPU 실행을 넘겨줘야 합니다.2. ARM Cortex-M에서 PendSV, SVC, SysTick 역할FreeRTOS가 ARM Cortex-M 마이크로컨트롤러에서 동작할 때, 스케줄러와 컨텍스트 스위칭을 위해 세..
1. 컨텍스트 스위칭이란 무엇인가?컨텍스트 스위칭은 현재 실행 중인 태스크(task) 상태(레지스터, 스택 포인터 등)를 메모리(태스크 컨트롤 블록, TCB)에 저장하고, 새로 실행할 태스크의 상태를 메모리에서 복원하여 CPU가 다른 태스크로 “넘어가게” 하는 과정을 말합니다. FreeRTOS에서는 PendSV_Handler가 바로 이 “태스크 교체” 역할을 담당합니다.왜 PendSV인가?ARM Cortex-M 계열 프로세서에는 여러 예외(interrupt) 우선순위를 설정할 수 있는데, PendSV는 “가장 낮은 우선순위” 예외로 예약되어 있습니다.이렇게 낮은 우선순위를 가지므로, 시점이 되면 SysTick이나 다른 인터럽트(ISR)가 종료된 직후에 PendSV가 자동으로 실행되어 컨텍스트 스위칭 작업..
(STM32F4 + Cortex-M4F 기준, GCC 포팅·heap4 사용 예)아래 흐름이 “누가, 언제, 어떤 레지스터에 얼마를 써서 1 ms마다 SysTick 인터럽트를 일으키는지”를 단계별로 보여 줍니다.1. 시스템 클록 확정 — SystemCoreClock 갱신/* SystemClock_Config() — HAL 코드 */HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);/* … */SystemCoreClockUpdate(); // ← 25 000 000 Hz(25 MHz)로 기록CubeMX/IDE의 Clock Configuration 탭에서 HCLK를 25 MHz로 잡았기 때문에SystemCoreClock 전역변수 = 25..
RTOS에서 “틱(Tick)”은 시스템의 시간 흐름(time base) 을 관리하고,• 딜레이(vTaskDelay())나 소프트웨어 타이머를 구현하기 위해 “경과 시간”을 재고• 우선순위 기반 선점 스케줄링 시, 새로운 태스크를 실행해야 하는지 판단등 매우 중요한 역할을 합니다.STM32와 같은 ARM Cortex-M 마이크로컨트롤러의 경우, 일반적으로 SysTick 타이머를 사용하여 이 틱을 발생시키지만, 필요에 따라 다른 하드웨어 타이머(TIM6, TIM7 등)를 사용할 수도 있습니다.아래에서는 FreeRTOS의 틱 발생(configTICK_RATE_HZ), SysTick 초기화 코드, 틱 인터럽트 핸들러(Data Flow) 를 단계별로 자세히 살펴보겠습니다.1. configTICK_RATE_HZ 설..
FreeRTOS에서 틱(Tick) 은 “다음 스케줄링 주기를 알리는 시계” 역할을 합니다.즉, CPU가 얼마나 오랫동안 현재 태스크를 실행할지, 언제 딜레이된(블록된) 태스크를 깨워야 할지 등을 결정하는 핵심 기준이 됩니다.1. “틱”이란 무엇인가?틱(Tick)→ RTOS 내부에서 사용하는 시간 단위로, 보통 1 ms나 10 ms 등 일정 주기마다 발생하는 타이머 인터럽트입니다.→ 이 주기를 통해 FreeRTOS 커널은vTaskDelay() 등으로 “딜레이(Delay)”된 태스크 중 깨어날 시점을 판단우선순위 기반 선점(Preemption) 스케줄링 시, 주기마다 새로운 태스크로 문맥 전환 여부 결정소프트웨어 타이머(Software Timer) 를 운용를 수행합니다.configTICK_RATE_HZFre..
FreeRTOS가 동작하면서 태스크 스케줄링을 위해 반드시 사용되는 세 가지 핵심 Cortex-M 예외(인터럽트)는 다음과 같습니다:SVC(Supervisor Call) 예외PendSV(Pending Supervisor) 예외SysTick 타이머 예외이 세 예외가 어떻게 협력하여 FreeRTOS 커널이 태스크를 시작하고, 틱마다 우선순위를 재평가하며, 실제로 문맥 전환(Context Switch)을 수행하는지 상세히 살펴보겠습니다.1. SVC 예외 (vPortSVCHandler)1.1 역할FreeRTOS 스케줄러를 최초로 시작할 때 단 한 번만 사용됩니다.“첫 번째(최초) 태스크”가 CPU에서 실행되도록 진입점을 제공합니다.즉, vTaskStartScheduler() → portSTART_SCHEDULE..
1. 개요FreeRTOS에서 “스케줄러”는 크게 두 부분으로 나뉩니다:커널 일반 코드(아키텍처 독립)FreeRTOS/Source/tasks.c 등에 구현태스크 생성, 삭제, Ready 리스트 관리, 우선순위 결정 등 통합 논리아키텍처별 포팅 코드(아키텍처 종속)FreeRTOS/Source/portable/[플랫폼]/port.c, portmacro.h 등에 구현실제 컨텍스트 스위칭, SysTick 또는 타이머 인터럽트 처리, SVC 호출 진입점 제공 등ARM Cortex-M 시리즈가 쓰이는 경우, SVC, PendSV, SysTick 핸들러가 이 파일에서 구현됨다음 섹션부터 ARM Cortex-M 계열을 예로 들어, 포트 코드(port.c)와 커널 일반 코드(tasks.c)가 어떻게 어우러져 스케줄러를 구..
1. 개요FreeRTOS를 실행하면, 사용자(애플리케이션)가 직접 생성하지 않아도 커널이 자동으로 만들어주는 **“시스템 태스크(system task)”**가 두 가지 있습니다:Idle 태스크 (Idle Task)타이머 서비스(데몬) 태스크 (Timer/Daemon Task)이 둘은 모두 사용자 태스크(User Task)와 함께 실행되며, 각각 고유한 목적을 갖고 있습니다.다음 섹션에서 하나씩 차례대로 살펴보겠습니다.2. Idle 태스크 (Idle Task)2.1 역할과 필요성항상 CPU에 남아 있어야 할 “백업 태스크”FreeRTOS 스케줄러가 시작되면, 최소한 하나의 태스크가 반드시 실행 가능한 상태여야 합니다.모든 사용자 태스크(User Task)가 블록되거나(예: vTaskDelay() 호출) 삭..
1. 전체 RAM 구조와 FreeRTOS 힙(heap)1.1 MCU 전체 RAM 영역예시 대상: STM32F407 기반 보드SRAM1: 약 112 KBSRAM2: 약 16 KB→ 총합 약 128 KB의 RAM을 보유다른 MCU를 사용할 경우 SRAM 크기는 달라지므로, 아래 설명의 수치(예: 128 KB)는 STM32F407 기준입니다.1.2 FreeRTOS 힙(heap) 영역 예약FreeRTOSConfig.h 상의 configTOTAL_HEAP_SIZE 매크로가 정의한 크기만큼의 메모리를“힙(heap) 영역”으로 고정 예약한다.예시:→ MCU가 가진 전체 RAM(128 KB)에서, 75 KB만 FreeRTOS용 힙으로 할당→ 나머지(≈ 53 KB)는 전역/정적 변수, 스택, 디폴트 런타임 영역 등으로 ..
1. 스케줄러 실행과 SWO Observer 설정Debug Configuration프로젝트에서 “Debug As → STM32 Cortex-M C/C++ Application”을 선택합니다.Debugger 탭에서인터페이스는 “SWD”로 지정되어 있어야 하고“Serial Wire Viewer”를 체크해야 SWO 출력(ITM→SWO→ST-Link→PC)이 가능해집니다.“Core Clock”에는 실제 시스템 클록(FCLK) 값을 입력해야 합니다. (예시: 25 MHz)시스템 클록 확인CubeMX(.ioc) → Clock Configuration 탭을 보면,HCLK = 25 MHzSYSCLK = 25 MHz (Cortex-M4 코어 클록)SysTick도 HCLK 기반으로 동작따라서, SWO Console에서 “..