AT91SAM7S256 Makefile에 대한 설명

#-----------------------------

# 2008 Mecha Cource - By CM WC, 2008.09.10.

#-----------------------------

ifndef ERASE_FCT	// ERASE_FCT 가 정의되어 있지 않다면 정의함

ERASE_FCT=rm -rf	// 삭제시 사용할 명령어

endif

ifndef WCCROSS_COMPILE	// WCCROSS_COMPILE 가 정의되어 있지 않으면 정의

WCCROSS_COMPILE=arm-elf-	// GNUARM의 실행파일명의 일부를 정의

endif

WCTOOL=gcc	// GCC 컴파일을 선언

WCOUTFILE_SRAM=at91sam7s_sram_wc	// 생성할 기술파일명을 선언함

WCOUTFILE_FLASH=at91sam7s_flash_wc	// 생성할 기술파일명을 선언함

WCTARGET=AT91SAM7S256	// 타겟은 현재 사용중인 ARM칩으로 설정

WCINCL=./include	// 해더파일의 경로를 설정함

# Debug Mode

OPTIM=-Os

// Make 에 내부적으로 미리 정의되어 있음

ifeq ($(WCTOOL), gcc)	// define으로 선언된 WCTOOL와 gcc 비교. 만약

AS=$(WCCROSS_COMPILE)gcc	// WCTOOL과 gcc가 같다면 밑에있는 endif까지 실행함

CC=$(WCCROSS_COMPILE)gcc	// AS는 전처리기. CC는 C컴파일러

LD=$(WCCROSS_COMPILE)gcc	// LD는 링커 GCC의 경우 3가지를 모두 포함함

OBJCOPY=$(WCCROSS_COMPILE)objcopy

// 오브젝트 파일을 다른 오브젝트 파일로 복사할 때 사용하는데, 선택적으로

필요한 부분만을 복사할 수 있기 때문에 파일의 사이즈를 줄이는 데 주로 사용되고,

바이너리 포맷을 바꾸는 데도 이용 됨.

OBJDUMP=$(WCCROSS_COMPILE)objdump

// 오브젝트 파일에 대한 정보를 출력한다. 옵션은 어떤 정보를

출력할지 결정함

NM= $(WCCROSS_COMPILE)nm

SIZE=$(WCCROSS_COMPILE)size

CCFLAGS=-g -mcpu=arm7tdmi $(OPTIM) -Wall -I$(WCINCL) -D$(WCTARGET)

// C컴파일러 플래그 정의 (object 파일을 만들기 위함). 내부적으로 정의됨

ASFLAGS=-D__ASSEMBLY__ -D$(WCTARGET) -g -mcpu=arm7tdmi -c $(OPTIM) -Wall -I$(WCINCL)

// 전처리기 플래그 정의 (object 파일을 만들기 위함). 내부적으로 정의됨

LDFLAGS+=-nostartfiles -Wl,--cref

LDFLAGS+=-lc -lgcc

LDFLAGS+=-T elf32-littlearm.lds

// 오브젝트 파일을 링킹 시킬대 사용할 플래그를 정의

OBJS=cstartup.o

endif

OBJS+= lowlevel.o \

main.o

OBJS 는 위에서 보면 cstartup.o 와 lowlevel.o main.o 를 의미함.

3가지 파일이 없기 때문에 각각의 라벨을 찾는다

처음에는 cstartup.o 라벨로 점프 해서 작업을 수행하고 작업완료 하면 lowlevel.o

라벨로 점프해서 작업. 그다음 main.o 로 점프해서 작업을 함.

각각의 작업을 완료하고 나면 sram 라벨로 돌아와서 다음 작업을 수행함

sram 작업이 끝나면 flash 작업을 수행

실행 순서

all->sram->$(OBJS) ->cstartup.o->sram->$(OBJS) ->lowlevel.o ->sram->$(OBJS) ->main.o->sram완료->all->flash->flash완료->all 완료

(6->5->4->2->3->1->) 순서임

all: sram flash

@echo "============111111111111111111111111==============="

rebuild: clean all

sram: $(OBJS)	// Ttext는 사용할 처음 주소를 나타냄

@echo "============222222222222222222222222222============="

$(LD) $(LDFLAGS) -Ttext 0x201000 -Tdata 0x200000 -n -o $(WCOUTFILE_SRAM).elf $(OBJS)

$(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_SRAM).elf -O binary $(WCOUTFILE_SRAM).bin

@echo "============2-------------------------2============="

flash: $(OBJS)	// Ttext는 사용할 처음 주소를 나타냄

@echo "============333333333333333333333333333============="

$(LD) $(LDFLAGS) -Ttext 0x100000 -Tdata 0x200000 -n -o $(WCOUTFILE_FLASH).elf $(OBJS)

$(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_FLASH).elf -O binary $(WCOUTFILE_FLASH).bin

@echo "============3-------------------------3============="

main.o: main.c	// 미리정의된 C컴파일러 플래그를 이용하여 오브젝트 파일생성

@echo "============444444444444444444444444444============="

$(CC) -c $(CCFLAGS) main.c -o main.o

@echo "============4-------------------------4============="

lowlevel.o: lowlevel.c	// 미리정의된 C컴파일러 플래그를 이용하여 오브젝트 파일생성

@echo "============555555555555555555555555555============="

$(CC) -c $(CCFLAGS) lowlevel.c -o lowlevel.o

@echo "============5-------------------------5============="

cstartup.o:  cstartup.S	// 미리정의된 전처리기 플래그를 이용하여 오브젝트 파일생성

@echo "============666666666666666666666666666============="

$(AS) $(ASFLAGS) cstartup.S -o cstartup.o

@echo "============6-------------------------6============="

clean:	// *.o, *.bin, *elf, * map 파일 clean

@echo "============777777777777777777777777777============="

@clear

$(ERASE_FCT) *.o *.bin *.elf *.map

@echo "============7-------------------------7============="