打印

使用makefile进行编译链接ARM程序

[复制链接]
3206|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuweifeng168|  楼主 | 2009-9-1 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
                                    Liuweifeng168(技术刘)
liuweifeng168@126.com

Makefile文件涉及的语法众多,如果每一个工程都分别写一个makefile文件,既费时又费力,而且写出来的文件不一定正确。此文介绍的是基于RVDS4.0(讨厌的Eclipse)开发软件的可共用的makefile文件,用户不需要了解太多的makefile语法,甚至不需要任何修改就可以进行编译链接。具体的使用方法如下。
Step 1:把写好的汇编/C程序(不包括cpp程序)copy到新建个src文件夹中;
Sterp 2:打开makefile文件(使用记事本或者写字板都可以);
Step 3:在“CPU_FLAG = ARM7TDMI”选择你所使用的ARM核的类型,如,你使用的是ARM920T,那么你就要在改为“CPU_FLAG = ARM920T”;
Step 4:在“ISA_FLAG = __DEBUG_RAM”中修改你的预定义,如果没有预定义,可不修改此处,相应的如果你在程序中使用了预定义“__DEBUG_FLASH”,那么此处要修改为“ISA_FLAG = __DEBUG_FLASH”;
Step5:在“OPT_LEVEL = 0”处修改优化等级,0——34个等级;
Step6:在“OPT_TIME_SPACE = time”处修改空间优化还是时间优化,如选择空间优化,可改为“OPT_TIME_SPACE = space”;
Step7:在“ADDR_ENTRY = 0x40000000”处修改程序的入口地址,如果程序的入口地址是0x00,则此处改为“ADDR_ENTRY = 0x00”;
Step8:在“SCAT = scatter_mem.scat”处选择分散加载文件,如,分散加载文件(必须在src文件夹中)的文件名是scatter.scat,那么此处修改为“SCAT = scatter.scat”;
Step9:这里是基于ARM指令,使用C和汇编进行编程的一些常用设置,如果想使用THUMB指令或者是使用CPP语言或者是想进一步设置,可在具体的地方加些其他的指令;
Step10:打开DOS命令进入src文件夹所在的目录,使用make命令可生成映像文件main.axf,使用make bin命令可生成可执行的main.bin文件,使用make
clean
命令可把make生成的文件全部删除;

Step11:可以在生成的locator.txt文件中查看执行的结果等等。


附:makefile文件

# This is a makefile by Liu Weifeng 2009/08/27

CC=armcc
AS=armasm
LD=armlink
AR=armar
FE=fromelf


SRC_DIR = src
OBJ_DIR = obj

CPU_FLAG = ARM7TDMI
ISA_FLAG = __DEBUG_RAM
DEBUG_FLAG = -g
OPT_LEVEL = 0
OPT_TIME_SPACE = time
ADDR_ENTRY = 0x40000000
SCAT = scatter_mem.scat

CFLAGS = $(DEBUG_FLAG) -Otime -O$(OPT_LEVEL) --cpu $(CPU_FLAG) -D$(ISA_FLAG) $(INCLUDES)
AFLAGS = $(DEBUG_FLAG) --cpu $(CPU_FLAG) #--apcs /interwork
LFLAGS = --list=locator.txt  --scatter $(SRC_DIR)/$(SCAT) --entry $(ADDR_ENTRY) --info=sizes --info=totals
AXF_FILE = main.axf
BIN_FILE = main.bin

INCLUDES = -I$(SRC_DIR) #\
   #-I$(SRC_DIR)/arm \  #
   #-I$(SRC_DIR)/arm/lib

CSRC := $(wildcard $(SRC_DIR)/*.c)
ASRC := $(wildcard $(SRC_DIR)/*.s)
OBJ_FILES := $(CSRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) $(ASRC:$(SRC_DIR)/%.s=$(OBJ_DIR)/%.o)
DEP_FILES := $(OBJ_FILES:%=%.d)

ifeq ($(OS),Windows_NT)
RM_FILE = del /q
RM_DIR = rmdir /s /q
MK_DIR = mkdir
else
RM_FILE = /bin/rm -f
RM_DIR = /bin/rm -rf
MK_DIR = /bin/mkdir -p
endif

.phony: all clean bin
all: $(AXF_FILE)
$(AXF_FILE): $(OBJ_DIR) $(OBJ_FILES) $(SRC_DIR)/$(SCAT)
$(LD) $(LFLAGS) --output $@ $(OBJ_FILES)

clean:
- $(RM_DIR) $(OBJ_DIR)
- $(RM_FILE) $(AXF_FILE)
- $(RM_FILE) $(BIN_FILE)
- $(RM_FILE) locator.txt

bin: $(AXF_FILE)
$(FE) --bin $(AXF_FILE) -o $(BIN_FILE)

$(OBJ_DIR):
$(MK_DIR) $(OBJ_DIR)

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c makefile
$(CC) $(CFLAGS) -c [email=--depend=$@.d]--depend=$@.d[/email] --depend_format=unix_escaped --no_depend_system_headers -o $@ $<

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.s makefile
$(AS) $(AFLAGS) [email=--depend=$@.d]--depend=$@.d[/email] --depend_format=unix_escaped -o $@ $<

-include $(DEP_FILES)

相关帖子

沙发
auzxj| | 2009-9-1 09:34 | 只看该作者
mark~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

26

帖子

0

粉丝