임베디드/임베디드 레시피

2장 이어서 ~ 3장까지 (완)

twoweeks-within 2025. 1. 26. 16:56

 

1. extern  :: linker 에게 구멍 위치를 알려준다는 느낌

 

섹션별로 분리하고 모으고 분리하고 모으고.. > 실행가능한 파일로 만들어줌

    > Relocate

// Segment = ∑ Sections

 

 

2. Linker 의 link rule ( 동일한 이름의 Global symbol )

   >   

strong : 함수와 초기화가 된 전역변수

Weak  : 초기화가 되지 않은 전역변수

 

1) 여러 개의 Strong Symbol  > X   :: Link error

2)  한개의 Strong Symbol, 여러 개의 Weak Symbol  >> Strong Symbol 선택
3) 여러 개의 Weak Symbol  > 아무거나 하나 골라서 선택

// Flag : True, false 

    > static으로 선언 > 다른 file 에서 참조 X

 

3. DWARF :: ARM의 debug 방식

      > ICD (In circuit debugger - Trace32) > Debugging

 

4. -Linker: Execution View를 참조,

     Bootloader : LoadView를 참조 > Execution View로 만듬! 

 

5. XIP :  Execution In Place > 직접 SW executive 가능

 >

 Memory :: code

 Data      :: R/W 가능한 영역

>> 그래야 그 안에서 XIP 가능

>>>

 Linker Descript Script (Scatter Loading)  // *.scl , GNU할때

   > Input section, Region 만 잘 표기 > 나머진 linker가 

 

 

Load view : SW 실행전 저장매체 (ROM, RAM) 에 담겨있을때

Execution view : SW 실행될때

/*

RAM : Read Write 가능 but 사라짐 

ROM : Read Only          but 유지 

*/

  RW section ::

ROM 으로 데이터 값을 저장하고 있어야함

+

프로그램 실행중 값 변경 되어야함

> ROM 에서 보관 RAM 에서 실행

 

NOR Flash : XIP 가능 > Flash 에서 그대로

NAND Flash : XIP 불가 > SDRAM 같은곳으로 옮겨 줘야함 (Load > Execution)

 

5-1)

        Load View         : ZI 필요 X  > 어짜피 0 이라 아무렇게나

<>    Execution View :  실행할땐 0 의 값이 필요

 

5-2)

ex) NOR + PSRAM 

RO       : Load view 그대로 (NOR:: Flash)

RW, ZI : Execution view

 

 

               

6. BSS : Block Started by Symbol

    ~= ZI영역 ::  RAM 에 0 으로 채워짐 <> ROM 에는 안잡힘

  >

(ROM)

  $$ 을 이용한 symbol 로 시작과 끝만 알려줌

 >>

ZI 는 symbol로 이름만 잡혀져있음

 

7. Map file

  a) Image Symbol Table
  b) Memory Map of the image
  c) Image component sizes
  d) 전체 Layout

 Image Symbol Table 찾고 > symbol 확인

   > Layout 에서 Memory 양 확인

 

8. Makefile 

 

목적 : 종속

   목적을 위한 명령어

>

spaghetti.bin : spaghetti.elf                                                                  
    fromelf -bin -o spaghetti.bin spaghetti.elf 

선언법

 CC := tcc

 TEMP  := $(CC) temp     :: 이전에 선언이 되어있어야 따름 

 TEMP   = $(CC) temp     :: 어디에 있는 상관없이 

 TEMP  += $(CC) temp    :: 각 변수마다 띄어쓰기를 해줌

 TEMP  ?= $(CC) temp    :: 선언된게 없다면 // #ifdef

 

$(TARGET) : $(ELF_TARGET)
$(BINTOOL) -bin -o $@ $^

 

Compiler 가 위의 TARGET , ELF_TARGET ,BINTOOL 을 보고

 알아서 해당되는 $@ 와 $^을 처리해줌

 

SRC = $(wildcard *.c) : 모든 c 파일들 지칭
OBJECTS = $(SRC:.c=.o) : SRC 의 .o 들

 

>> 명령어: make

'임베디드 > 임베디드 레시피' 카테고리의 다른 글

4장 ,안한부분 끝 // 완  (0) 2025.01.28
2장 이어서  (0) 2025.01.25
2장 정리  (0) 2025.01.24
1장 이어서  (0) 2025.01.22
1장 정리안된부분  (0) 2025.01.20