Cortex-M7——ARMCC编译器
小狼@http://blog.youkuaiyun.com/xiaolangyangyang
一、链接脚本(ld.scat)
IRAM 0x00000000 0x80000
{
IRAM 0x00000000 0x80000
{
*.o (.isr_vector, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
DRAM 0x20000000 0x20000
{
.ANY (+RW +ZI)
}
ARM_LIB_STACKHEAP 0x0 EMPTY 0
{
}
}
二、启动代码
.syntax unified
.cpu cortex-m7
.fpu softvfp
.thumb
.global g_pfnVectors
.global Default_Handler
.word Load$$DRAM$$Base
.word Image$$DRAM$$Base
.word Image$$DRAM$$Length
.word Image$$DRAM$$ZI$$Base
.word Image$$DRAM$$ZI$$Length
.section .text.Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
ldr sp, =0x20020000 /* set stack pointer */
movs r1, #0
b LoopCopyDataInit
CopyDataInit:
ldr r3, =Load$$DRAM$$Base
ldr r3, [r3, r1]
str r3, [r0, r1]
adds r1, r1, #4
LoopCopyDataInit:
ldr r0, =Image$$DRAM$$Base
ldr r3, =Image$$DRAM$$Length
adds r2, r0, r1
cmp r1, r3
bcc CopyDataInit /* if r1 < r3, then jump to CopyDataInit */
movs r1, #0
b LoopFillZerobss
FillZerobss:
movs r3, #0
str r3, [r2, r1]
adds r1, r1, #4
LoopFillZerobss:
ldr r2, =Image$$DRAM$$ZI$$Base
ldr r3, =Image$$DRAM$$ZI$$Length
cmp r1, r3
bcc FillZerobss
bl SystemInit
bl main
bx lr
.size Reset_Handler, .-Reset_Handler /* equ mov pc lr (lr=r14) */
.section .text.Default_Handler,"ax",%progbits
.type Reset_Handler, %function
Default_Handler:
b Default_Handler
.size Default_Handler, .-Default_Handler
.section .isr_vector,"a",%progbits
.type g_pfnVectors, %object
g_pfnVectors:
.word 0x20020000
.word Reset_Handler
.word Default_Handler
.word Default_Handler
.word Default_Handler
.word Default_Handler
.word Default_Handler
.word 0
.word 0
.word 0
.word 0
.word Default_Handler
.word Default_Handler
.word 0
.word Default_Handler
.word SysTick_Handler
.word Default_Handler /* int 0 */
.word Default_Handler /* int 1 */
.word Default_Handler /* int 2 */
.word Default_Handler /* int 3 */
.word Default_Handler /* int 4 */
.word 0 /* int 5 Reserved */
.word 0 /* int 6 Reserved */
.word Default_Handler /* int 7 */
.word Default_Handler /* int 8 */
.word Default_Handler /* int 9 */
.word Default_Handler /* int 10 */
.word Default_Handler /* int 11 */
.word Default_Handler /* int 12 */
.word Default_Handler /* int 13 */
.word Default_Handler /* int 14 */
.word Default_Handler /* int 15 */
.word Default_Handler /* int 16 */
.word Default_Handler /* int 17 Float Point */
.word Default_Handler /* int 18 */
.word Default_Handler /* int 19 */
.word Default_Handler /* int 20 */
.size g_pfnVectors, .-g_pfnVectors
三、Makefile
TESTTOPDIR = $(CURDIR)
-include $(TESTTOPDIR)/config.mk
TEST_TARGET = test
OUT = $(TESTTOPDIR)/out
BUILD = $(OUT)/obj
OBJS_LIST_FILE = $(OUT)/objs.list
OBJS_DEF_FILE = $(OUT)/objs.mk
OBJ_MKDIR = if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi
define add_obj_to_list_file
$(if $(1), @echo $(1) >> $(OBJS_LIST_FILE))
endef
define update_from_obj_list_file
$(eval ALL_OBJS := $(shell cat $(OBJS_LIST_FILE)))
@$(RM) $(OBJS_LIST_FILE)
@echo "ALL_OBJS := " $(ALL_OBJS) > $(OBJS_DEF_FILE)
endef
LOCAL_SRCS = \
$(TESTTOPDIR)/src/main.c \
$(TESTTOPDIR)/src/nvic.c \
$(TESTTOPDIR)/src/it.c \
$(TESTTOPDIR)/src/startup.s
LOCAL_INCLUDE := \
-I $(TESTTOPDIR)/inc \
-I $(TESTTOPDIR)/hal \
-I $(TESTTOPDIR)/driver/inc
OBJOUT := $(BUILD)$(dir $(subst $(TESTTOPDIR),,$(shell pwd)))
LOCAL_SRCS := $(subst $(CURDIR)/, , $(LOCAL_SRCS))
LOCAL_CSRCS := $(filter %.c, $(LOCAL_SRCS))
LOCAL_ASMSRCS2 := $(filter %.s, $(LOCAL_SRCS))
LOCAL_COBJS := $(patsubst %.c, $(OBJOUT)/%.o, $(LOCAL_CSRCS))
LOCAL_ASMOBJS2 := $(patsubst %.s, $(OBJOUT)/%.o, $(LOCAL_ASMSRCS2))
LOCAL_OBJS := $(LOCAL_COBJS) $(LOCAL_ASMOBJS2)
.PHONY: clean $(TEST_TARGET) $(TEST_BUILD) ADD_OBJ_LIST $(OBJOUT)
TEST_BUILD: ADD_OBJ_LIST
@echo "start code compile..."
$(TEST_TARGET): clean TEST_BUILD
$(call update_from_obj_list_file)
$(LD) $(ALL_OBJS) --scatter=$(TESTTOPDIR)/lsp/ld.scat -o $(OUT)/$@.elf --lto
$(OBJCOPY) -O ihex $(OUT)/$@.elf $(OUT)/$@.hex
$(FROMELF) --bin $(OUT)/$@.elf -o $(OUT)/$@.bin
$(FROMELF) -c $(OUT)/$@.elf -o $(OUT)/$@.asm
$(SIZE) $(OUT)/$@.elf
ADD_OBJ_LIST: $(LOCAL_OBJS)
if [ ! -d $(dir $(OUT)) ]; then mkdir -p $(dir $(OUT)); fi
$(call add_obj_to_list_file,$(LOCAL_OBJS))
$(OBJOUT)/%.o: %.c
@$(OBJ_MKDIR)
$(CC) $(LOCAL_INCLUDE) -Wno-unused-function -flto \
-O3 -Wall -Werror -Wformat -mthumb -g -gdwarf-2 \
-Wpointer-arith -mfloat-abi=hard -mfpu=fpv5-d16 \
--target=arm-arm-none-eabi \
-mcpu=cortex-m7 -c \
-Wa, $< -o $@ \
-Wno-error -w
$(OBJOUT)/%.o: %.s
@$(OBJ_MKDIR)
$(CC) $(LOCAL_INCLUDE) -Wno-unused-function -flto \
-O3 -Wall -Werror -Wformat -mthumb -g -gdwarf-2 \
-Wpointer-arith -mfloat-abi=hard -mfpu=fpv5-d16 \
--target=arm-arm-none-eabi \
-mcpu=cortex-m7 -c \
-Wa, $< -o $@ \
-Wno-error -w
clean:
-rm -rf $(OUT)/*