Embedded Recipes 3. SW 정체

Sireal·2024년 3월 4일

Embedded Recipes

목록 보기
5/10
post-thumbnail

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 format


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 규칙은 따로 또 찾아보시길
profile
달리다 넘어져도 아픔마저 즐기려하는 사람

0개의 댓글