收藏0 举报
# tree -l . ├── App ├── Device │ ├── Include │ │ ├── CMSIS │ └── Source │ ├── ARM ├── Drivers │ ├── inc │ └── src └── makefile
其中App目录是Application层的主逻辑代码,其中main.c就在App目录中,是业务逻辑层的主代码。 Device-->include-->CMSIS目录是arm cmsis框架层的interface 说明文件。 Device-->Source-->ARM目录是启动代码startup_ac78xx.s和ac7811_flash.ld脚本。 ac7811_flash.ld脚本主要告诉ld(链接器)如何链接各个Objects文件为可执行程序. Drivers目录是AutoChip提供的ac7811的SDK包。
# tree -l . ├── App │ └── main.c ├── Device │ ├── Include │ │ ├── CMSIS │ │ │ ├── arm_common_tables.h │ │ │ ├── arm_const_structs.h │ │ │ ├── arm_math.h │ │ │ ├── cmsis_armcc.h │ │ │ ├── cmsis_armclang.h │ │ │ ├── cmsis_compiler.h │ │ │ ├── cmsis_gcc.h │ │ │ ├── cmsis_iccarm.h │ │ │ ├── cmsis_version.h │ │ │ ├── core_cm3.h │ │ │ ├── mpu_armv7.h │ │ ├── ac78xx.h │ │ ├── ac78xx_ckgen.h │ │ ├── ac78xx_debugout.h │ │ ├── ac78xx_spm.h │ │ ├── debugzone.h │ │ └── system_ac78xx.h │ └── Source │ ├── ARM │ │ ├── ac7811_flash.ld │ │ └── startup_ac78xx.s │ ├── ac78xx_ckgen.c │ ├── ac78xx_ckgen_regs.h │ ├── ac78xx_debugout.c │ ├── ac78xx_spm.c │ ├── ac78xx_spm_regs.h │ ├── syscalls.c │ └── system_ac78xx.c ├── Drivers │ ├── inc │ │ ├── ac78xx_can.h │ │ ├── ac78xx_can_reg. │ │ ├── ac78xx_dma.h │ │ ├── ac78xx_dma_reg.h │ │ ├── ac78xx_eflash.h │ │ ├── ac78xx_eflash_reg.h │ │ ├── ac78xx_uart.h │ │ ├── ac78xx_uart_reg.h │ │ ├── ...... │ └── src │ ├── ac78xx_can.c │ ├── ac78xx_dma.c │ ├── ac78xx_eflash.c │ ├── ac78xx_uart.c │ ├── ...... └── makefile
#--------------------------------- 编译参数 ------------------------------------ #把编译过程中的命令参数log不往屏幕显示 ifneq ($(V),1) Q := @ NULL := 2>/dev/null endif TARGET := DEMO#编译文件名称,根据命名需要可自行修改 OPT := -O0#不做任何优化,这是默认的编译选项。 CSTD := -std=c11#使用C11标准库 CXXSTD := -std=c++11#使用C++11标准库 #--------------工程需要编译的头文件,根据需要自行添加-------------------- INC_FLAGS += -I ./Device/Include \ -I ./Device/Include/CMSIS \ -I ./Drivers/inc #------链接文件,里面指定了芯片flash,ram大小,需根据实际大小进行修改 LDSCRIPT := ./Device/Source/ARM/ac7811_flash.ld ARCH_FLAGS += -mthumb#thumb指令 ARCH_FLAGS += -mcpu=cortex-m3#cortex-m3 cpu架构 #编译告警设置 CWARN_FLAGS += -Wall -Wshadow CWARN_FLAGS += -fno-common -ffunction-sections -fdata-sections CWARN_FLAGS += -Wimplicit-function-declaration CWARN_FLAGS += -Wstrict-prototypes #--通过printf打印串口log,需设置-specs=nosys.specs,并且在syscalls.c中实现_write_r函数,把printf映射到串口上。 LDLIBS += -Wl,--start-group -lc -lgcc -Wl,--end-group -lm -specs=nosys.specs #----------------------------- 搜索工程目录下的源代码 --------------------------- AS_SRC := ./Device/Source/ARM/startup_ac78xx.s AS_OBJ := $(AS_SRC:%.s=%.o) #-------源代码需根据实际情况删减------------- C_SRC := ./Device/Source/ac78xx_ckgen.c \ ./Device/Source/ac78xx_spm.c \ ./Device/Source/system_ac78xx.c \ ./Device/Source/ac78xx_debugout.c \ ./Device/Source/syscalls.c \ ./Drivers/src/ac78xx_dma.c \ ./Drivers/src/ac78xx_gpio.c \ ./Drivers/src/ac78xx_timer.c \ ./Drivers/src/ac78xx_uart.c \ ./Drivers/src/ac78xx_wdg.c \ ./App/main.c C_OBJ := $(C_SRC:%.c=%.o) #--------------------------------- 参数整合 ------------------------------------ # C flags CFLAGS := $(OPT) $ $(CSTD) $(INC_FLAGS) $(FP_FLAGS) CFLAGS += $(DEFINES) $(ARCH_FLAGS) $(CWARN_FLAGS) -g #-g 增加调试选项,可以使用GDB进行调试 # Linker flags 链接器编译选项 LDFLAGS := --static#静态编译 LDFLAGS += -Wl,-Map=$(TARGET).map -Wl,--gc-sections LDFLAGS += -T$(LDSCRIPT) $(ARCH_FLAGS) $(LDLIBS) # OBJ OBJ = $(AS_OBJ) $(C_OBJ) #-------------------------------- 编译器调用指令 -------------------------------- PREFIX := arm-none-eabi CC := $(PREFIX)-gcc CXX := $(PREFIX)-g++ LD := $(PREFIX)-gcc AR := $(PREFIX)-ar AS := $(PREFIX)-as OBJCOPY := $(PREFIX)-objcopy OBJDUMP := $(PREFIX)-objdump GDB := $(PREFIX)-gdb .SUFFIXES: .elf .bin .hex .list .map .images .SECONDEXPANSION: .SECONDARY: all: elf bin hex elf: $(TARGET).elf bin: $(TARGET).bin hex: $(TARGET).hex list: $(TARGET).list images: $(TARGET).images %.images: %.bin %.hex %.list %.map [url=home.php?mod=space&uid=384087]@printf[/url] "*** $* images generated ***\n" #objdump生成二进制文件 %.bin: %.elf @printf " OBJCOPY $(*).bin\n" $(Q)$(OBJCOPY) -Obinary $(*).elf $(*).bin #objdump生成hex文件 %.hex: %.elf @printf " OBJCOPY $(*).hex\n" $(Q)$(OBJCOPY) -Oihex $(*).elf $(*).hex %.list: %.elf @printf " OBJDUMP $(*).list\n" $(Q)$(OBJDUMP) -S $(*).elf > $(*).list #链接map生成elf规则 %.elf %.map: $(OBJ) $(LDSCRIPT) @printf " LD $(TARGET).elf\n" $(Q)$(LD) $(OBJ) $(LDFLAGS) -o $(TARGET).elf #汇编文件编译规则 $(AS_OBJ): %.o:%.s @printf " AS $(*).s\n" $(Q)$(CC) $(ARCH_FLAGS) $(FP_FLAGS) -g -Wa,--no-warn -x assembler-with-cpp -o $(*).o -c $(*).s #C文件编译规则 $(C_OBJ): %.o:%.c @printf " CC $(*).c\n" $(Q)$(CC) $(CFLAGS) -o $(*).o -c $(*).c clean: @#printf " CLEAN\n" $(Q)$(RM) $(shell find -name '*.o' -o -name '*.d' -o -name '*.elf' -o -name '*.bin') $(Q)$(RM) $(shell find -name '*.hex' -o -name '*.srec' -o -name '*.list' -o -name '*.map') $(Q)$(RM) $(shell find -name 'generated.*' -o -name '*.srec' -o -name '*.list' -o -name '*.map') .PHONY: images clean elf bin hex list flash debug
(1)常用的变量名(约定俗成的): CC:表示c编译器版本 CFLAGS:表示编译时参数 CPPFLAGS:表示预处理参数 CXX:表示C++编译器版本 CXXFLAGS:表示c++编译时参数 LDFLAGS:表示库参数库选项 INCLUDE:表示头文件目录 TARGET:表示目标名 RM:删除选项 #: 注释符号 (2)一些特殊字符 $(变量):对变量取值 @:只显示命令结果,忽略命令本身 -:如果当前命令出错,忽略错误,继续执行 %:通配符,通配符是以遍历的方式实现的 (3)特殊变量 用于当前目标: $@:代表目标 $<:代表依赖中的第一个 $^:代表所有依赖
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
137
1430
2
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号