VPATH

make 를 사용하여 컴파일 할 때 object파일들을 특정 폴더에 생성하도록 하고 싶은 경우 VPATH를 사용하면 쉽게 makefile를 구현 할 수 있다.

예를 들면 src 폴더에는 소스만 inc 풀더는 헤더 파일이 있고 컴파일 된 오브젝트 파일들을 obj 폴더에 넣고 싶은 경우 다음과 같이 makefile를 만들어 주면 된다.

CC=arm-none-eabi-gcc
OUT_DIR = ./obj
SRC_DIR=./src
INC_DIR=./inc
VPATH = $(SRC_DIR)
CFLAGS =  -I./inc
SRCS=$(wildcard $(SRC_DIR)/*.c )
OBJS=$(patsubst %.c, %.o, $(notdir $(SRCS)))
OUT_OBJS = $(patsubst %, $(OUT_DIR)/%, $(OBJS))
all: target
target : $(OUT_OBJS) Makefile
 $(CC) -o target $(OUT_OBJS)
$(OUT_DIR)/%.o: %.c
 $(CC) -c $(CFLAGS) $< -o $@
debug :
 @echo SRCS=$(SRCS)
 @echo OBJS=$(OBJS)
 @echo OUT_OBJS=$(OUT_OBJS)

src 폴더에 main.c와 test.c 가 있고 inc 폴더에 test.h 가 있는 경우
make 하면 다음과 같이 컴파일 된다.

D:tempmake_test>make
arm-none-eabi-gcc -c -I./inc ./src/main.c -o obj/main.o
arm-none-eabi-gcc -c -I./inc ./src/test.c -o obj/test.o
arm-none-eabi-gcc -o target  ./obj/main.o  ./obj/test.o

각 단계에서 Makefile에 정의된 변수의 값은 다음과 같다.

D:tempmake_test>make debug
SRCS=./src/main.c ./src/test.c
OBJS= main.o  test.o
OUT_OBJS= ./obj/main.o  ./obj/test.o

여기서 VPATH의 역할은 소스 파일들의 위치를 Make에 알려주어 %.c 에 패스를 적어주지
않아도 Make 가 VPATH에 정의된 경로에서 소스를 찾아 준다. 참고로 VPATH에 src 경로를 여러개 적어 주는게 가능하다.

section

GCC 링크 스크립트에서 코드나 데이터의 메모리상의 위치를 section 이름을 사용하여 정의 한다.

 어셈블리 코드에서는 section를 이름 뒤에 콜론(:)를 붙여 간단하게 정의 할 수 있다. 
그러면 c언어내에서도 section를 정의 할 수 있지 않을까? 

다음과 같이  attribute를 사용하여 정의 할 수 있다.

 __attribute__((__section__(“.my_buffer”)))  static int MyBuffer[0x10000];

링크 스크립트를 다음과 같이 작성 했다면 MyBuffer를 sram 메모리에 위치 시킬 수 있다.

MEMORY
{
 sram  : ORIGIN = 0x300000, LENGTH = 16K
 sdram   : ORIGIN = 0x20000000, LENGTH = 64M
}

SECTIONS
{
 startup : {
   *(.startup) 
 } >sdram
 
 .my_buffer : {
   __my_buffer_beg__ = .;
   *(.my_buffer)
   . = 0x10000;
   __my_buffer_end__ = .;
 } > sram

어셈블러 확장자

GCC에서 어셈블 코드의 파일 확장자는 s이다. 그런데 소문자 s와 대문자 S는 컴파일러에서 다르게 인식한다.
대문자 S파일의 확장자는 어셈블리 하기 전에 C 컴파일러를 거친 후에 어셈블리를 한다. 그러므로 대문자 확장자를 사용하면 소문자 s확장자 파일에서 사용할 수 없는 매크로같은 것 들을 사용 할 수 있다.

GCC 컴파일 환경

ADS 컴파일러를 사용하는 E Project의 컴파일러를 GCC로 변경하는 작업을 하였다.
ADS 컴파일러는 구입을 해야 하지만 GCC는 공짜라서…
일단 기존 Makefile의 컴파일 옵션을 수정하고 문법이 맞지 않는 부분은 매크로를 정의 해서 구분 하였다.