Embedded Recipes 3. SW 정체
SW에서 나오는 이런저런 이야기 훑기
컴파일 이야기
우리는 원하는 동작을 기계에 입력해야한다.
- 동작을 문서화한다 (.c, .h)
- Assembly로 만든다. (.s)
- 이걸 다 연결한다. (.ld)
- 실행 가능파일로 만든다. (.elf)
- 기계가 읽을수 있게 한다. (.bin)
코드를 변경하고 연결하는 것을 컴파일러가 해준다.
Cross Compiler
- ADS: ARM Developers. ARM에서 운영하는 상용 툴.
- ARM GCC: GNU에서 사용하는 무료 툴.
C언어에서는 전처리문이란게 있는데, Assem에서는 없음.
- 전처리문을 썼다면 컴파일러는 C 컴파일러를 사용해야함
Libray 이야기
.lib: object(.o) 모음. 아카이브 파일
- static. 정적 lib: FW단에서 쓰는 그 lib
- 공유 lib: OS System에 App 단에서 쓰는 lib
lib을 역으로 깔수 있다.
- 컴파일 툴 중에 armar을 통해 lib을 까집을 수 있다.
Memory Map, Symbol
Symbol: Linker가 알아볼 수 있는 자신만의 주소
- 포인터, 변수 or 함수이름
- Global 변수: Symbol 이다.
- Local 변수: Symbol 아니다.
- ELF엔 Linker용 Symbol table이 따로 있음.
메모리 맵
- ROM
- RO: .const, .text
- RW: .data
- RAM
- ZI: .bss
- Local: none symbol
ELF는 2가지로 나뉘고 각자 비슷한 구조를 띈다
- .o: 오브젝트 파일. 링크전. relocatble
- .elf: 실행 가능
ELF 구조
- ELF header
- op code
- data
- section
Linker
코드, 어셈, 오브젝트 전부 알아서 엮어주는 친구
Scatter Loading (Descript Script)
- 최종적으로 실행할때 필요한 메모리를 매핑해주는 것
- Code를 XIP 메모리에 매핑
- Data는 RW 가능한 메모리에 매핑
- .scl 파일
매핑된 이것들은 메모리상에 Region으로 올라가가되는데
- Input section: .o 에있ㅅ는 RO, RW, ZI 집합
- Output section: Input 집합
- Region: output 집합. 실제 메모리에 올라가는 단위
- Load view: 실행 전 ROM에 저장되는 형태
- Excution view: 실행 후 형태
- XIP 관련
- XIP가 안되는 친구면 이 View로 실행
- Load & Exe가 분리된 형태
- NAND 메모리
- XIP가 되는 친구면 이 View로 실행되도 됨
- Load & Exe가 합쳐진 형태
- NOR메모리
- 실행전 메모리맵과 실행후 메모리맵이 다름
- ZI 는 실행전 메모리맵에서 안잡힘. 실행후에 잡힘. 그래서 .scl 쓰는거임.
- Root Region: Load View = Exe View
Scatter Loading을 사용하지 않으면?
- RO, RW, ZI 순으로 메모리에 차례로 PUSH 됨.
Memory Map 과 Linker의 만남
Linking 할때
- RO, RW, ZI가 단순하게 이어져있다면
Linker 사용
- RO, RW, ZI가 얽혀져 있으면
Scatter Code 사용
Makefile
Makefile 구조

MACRO 와 SUFFIX
- SUFFIX를 사용하여 Makefile을 단순화시킬 수 있다
$@: output
$^: object (재료)
TARGET = bugger.bin
ELF_TARGET = bugger.elf
BINTOOL - fromelf
CC = tcc
OBJECT = bugger.o photatochip.o
$(TARGET) : $ $(ELF_TAGERT)
$(BINTOOL) -bin -o $@ -$^
$(ELF_TARGET) : $(OBJECTS)
%o : %c
(CC) -c $@ $<
%은 확장자 규칙
- 기타 등등 Makefile 규칙은 따로 또 찾아보시길