PC에서 프로그램을 만들고 보드에 기록하면, 보드는 자기 CPU와 메모리로 실행한다.
| 어떤 애 | 역할 |
|---|---|
| PC | 코드를 빌드하고, 완성된 프로그램을 보드에 기록하는 데 사용한다. |
| 컴파일러 | C 코드를 STM32용 어셈블리어로 번역한다. |
| 어셈블러 | 어셈블리어를 CPU가 실행할 기계어 조각으로 바꾼다. |
| 링커 | 기계어 조각들을 합치고, 코드와 데이터가 들어갈 보드 메모리 주소를 정한다. |
링커 스크립트 (.ld) | 링커가 참고하는 보드 메모리 배치 규칙이다. |
startup 파일 (.s) | 이미 어셈블리어로 작성된 시작 코드다. 보드가 켜진 뒤 main() 실행을 준비한다. |
| STM32의 CPU | 보드에 저장된 기계어를 직접 실행한다. |
| 보드의 Flash | 전원이 꺼져도 프로그램과 초기값을 보관한다. |
| 보드의 RAM | 실행 중 변수와 함수 호출 등에 사용하는 작업 공간이다. |
startup_stm32f446retx.sSTM32F446RETX_FLASH.ld
코드 작성 → 컴파일·어셈블 → 링크 → 완성된 프로그램 → 보드에 기록
| 어떤 애 | 역할 |
|---|---|
.o | 소스 파일을 변환해서 얻은 기계어 조각. 아직 다른 조각과 연결해야 한다. |
.elf | 링크가 끝난 펌웨어 파일. 프로그램과 주소 정보 등을 담는다. |
.map | 코드와 데이터가 어느 주소에 배치됐는지 보여주는 보고서. |
.list | 기계어를 사람이 읽을 수 있는 어셈블리 명령으로 풀어 보여주는 파일. |
makefile | 어떤 파일을 어떤 명령으로 빌드할지 적어 놓은 작업 순서표. |

링커는 코드와 데이터를 역할에 맞는 보드 메모리 위치에 배치한다.
.ld는 배치 규칙을 제공하고, 링커가 그 규칙에 따라 주소를 정한다.섹션은 성격이 비슷한 코드나 데이터를 묶어 놓은 것이다.
| 어떤 애 | 역할 |
|---|---|
.text | 실행할 기계어 묶음. 이 프로젝트에서는 Flash에 둔다. |
.rodata | 상수나 문자열처럼 바꾸지 않는 데이터 묶음. Flash에 둔다. |
.data | 초기값이 있는 전역·정적 변수. 초기값은 Flash에 보관하고, 부팅할 때 RAM으로 복사해 사용한다. |
.bss | 0으로 시작할 전역·정적 변수. 부팅할 때 해당 RAM 공간을 0으로 채운다. |
예를 들어 전역 변수 int speed = 3;은 처음 값 3을 Flash에 보관하고, 실행 중 바뀌는 speed는 RAM에서 사용하는 식이다.

전원 켜짐·리셋 → CPU가 시작 위치 확인 → startup의 준비 작업 → main()
내장 Flash에 기록한 프로그램으로 부팅하는 경우의 흐름이다.
| 어떤 애 | 역할 |
|---|---|
| 벡터 테이블 | 초기 스택 값과 리셋·인터럽트 함수 주소 목록. CPU가 처음 실행할 위치를 찾는 데 사용한다. |
Reset_Handler | 리셋 후 처음 실행되는 사용자 펌웨어의 함수. 부팅 준비를 시작한다. |
SystemInit() | CPU의 기본적인 실행 준비를 한다. |
.data·.bss 초기화 | RAM의 변수에 초기값을 복사하거나 0을 채운다. |
__libc_init_array() | main() 전에 필요한 추가 초기화를 마무리한다. |
main() | 우리가 작성한 응용 프로그램이 시작되는 함수다. |

주변장치를 준비하고 → 반복문에서 원하는 동작을 계속 수행한다.
| 어떤 애 | 역할 |
|---|---|
HAL_Init() | 하드웨어 제어 함수들을 쓰기 위한 기본 준비를 한다. |
SystemClock_Config() | 보드가 사용할 클록, 즉 동작 속도의 기준을 설정한다. |
MX_GPIO_Init() | 입출력 핀을 준비한다. |
BSP_LED_Init()·BSP_PB_Init() | 보드의 LED와 버튼을 준비한다. |
while (1) | LED 제어 같은 작업을 계속 반복한다. |
| 인터럽트 처리 함수 | 버튼 입력 같은 이벤트가 생기면 실행 중인 작업을 잠시 중단해 처리하고, 끝나면 중단했던 코드로 돌아간다. |
SystemInit()은 main() 이전, SystemClock_Config()는 main() 안에서 실행된다.
현재 프로젝트의 main.c 원본은 없어, main() 내부 순서는 기존 Debug/interrupt_hard.list를 기준으로 정리했다.