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============="