임베디드 기초 3편 - 빌드 과정: 소스 코드가 플래시에 올라가기까지

들어가며 2편에서 .text/.data/.bss 섹션과 링커 스크립트를 다뤘다. .data > RAM AT > FLASH 구문이 LMA와 VMA를 분리한다는 것까지 정리했다. 그런데 이 링커 스크립트는 누가, 언제, 어떻게 처리하는 걸까. main.c 하나를 작성하고 빌드 버튼을 누르면 어떤 일이 일어나는지 정확히 알지 못한 채로 쓰고 있었다. ARM Cortex-M 툴체인 ARM Cortex-M을 타겟으로 빌드할 때 쓰는 컴파일러는 arm-none-eabi-gcc다. 이름을 뜯어보면: arm: 타겟 아키텍처 none: 운영체제 없음 (bare-metal) eabi: Embedded ABI — 함수 호출 규약, 데이터 정렬 방식 표준 gcc: GNU Compiler Collection STM32CubeIDE나 PlatformIO 같은 IDE를 쓰면 이 툴체인이 자동으로 설정된다. 직접 Makefile이나 CMake를 구성할 때는 직접 지정해야 한다. ...

2026년 5월 14일 · 3 min · 서보민

임베디드 기초 2편 - 메모리 구조와 변수 저장 원리

들어가며 1편에서 펌웨어가 플래시에 저장되고, 변수는 RAM에서 동작한다고 정리했다. 그런데 막상 “전역변수는 어디 저장돼요?”, “const는요?” 라는 질문을 받으면 정확하게 대답하기가 쉽지 않다. Flash vs RAM 다시 짚기 플래시(Flash) 비휘발성(non-volatile) — 전원을 꺼도 데이터가 유지된다 읽기는 자유롭지만, 쓰기는 Erase → Write 순서로 페이지/섹터 단위로만 가능하다 속도가 RAM보다 느리다 코드(명령어), 상수, 전역변수 초기값이 저장된다 RAM 휘발성(volatile) — 전원을 끄면 데이터가 사라진다 자유롭게 읽기/쓰기 가능하고 속도가 빠르다 실행 중 변하는 데이터(전역변수, 지역변수, 동적 할당(dynamic allocation))가 올라간다 메모리 섹션: .text / .data / .bss 링커는 빌드 결과물을 목적에 따라 여러 섹션으로 분리해서 관리한다. ...

2026년 5월 10일 · 4 min · 서보민