嵌入式ARM驱动开发基于Makefile构建方法

268 阅读1分钟

1 编写 Makefile

image.png

  • 第 4 行是使用 arm-linux-gnueabihf-ld 进行链接,链接起始地址是 0X87800000,但是这一行用到了自动变量“,“^”,“^”的意思是所有依赖文件的集合,在这里就是 objs 这个变量的值:start.o 和 main.o。链接的时候 start.o 要链接到最前面

    objs := start.o main.o
    ledc.bin:$(objs)
    
  • arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^

  • arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf start.o main.o

  • 第 5 行使用 arm-linux-gnueabihf-objcopy 来将 ledc.elf 文件转为 ledc.bin,本行也用到了自动变量“@”,“@”,“@”的意思是目标集合,在这里就是“ledc.bin”,那么本行就相当于:

  • arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@

  • arm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.bin

  • 第 9 行就是具体的命令,这行也用到了自动变量“@”和“@”和“<”,其中“$<”的意思是依赖目标集合的第一个文件。比如start.s 要编译成 start.o 的话第 8 行和第 9 行就相当于:

  • start.o:start.s

  • arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o start.o start.s

1.1 Makefile完整工程

```
1 objs := start.o main.o
2
3 ledc.bin:$(objs)

4 arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^

5 arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@

6 arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
7
8 %.o:%.s
9 arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
10
11 %.o:%.S
12 arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
13
14 %.o:%.c
15 arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
16
17 clean:
18 rm -rf *.o ledc.bin ledc.elf ledc.dis
```

2 工程化编写 Makefile

  • 项目工程化管理 image.png image.png

  • Makefile静态模式语法 image.png

  • 模式字符串替换函数 image.png

2.1 脚本详细分析

image.png

image.png

image.png

2.2 工程化完整脚本

1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?= bsp
3
4 CC := $(CROSS_COMPILE)gcc
5 LD := $(CROSS_COMPILE)ld
6 OBJCOPY := $(CROSS_COMPILE)objcopy
7 OBJDUMP := $(CROSS_COMPILE)objdump
8 
9 INCDIRS := imx6ul \
10           bsp/clk \
11           bsp/led \
12           bsp/delay
13
14 SRCDIRS := project \
15            bsp/clk \
16            bsp/led \
17            bsp/delay
18 
19 INCLUDE := $(patsubst %, -I %, $(INCDIRS)) //INCLUDE := -I imx6ul -I bsp/clk -I bsp/led -I bsp/delay
20 
21 SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) //SFILES := project/start.S
22 CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
23
24 SFILENDIR := $(notdir $(SFILES))
25 CFILENDIR := $(notdir $(CFILES))
26
27 SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) //COBJS = obj/main.o obj/bsp_clk.o obj/bsp_led.o obj/bsp_delay.o
28 COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
29 OBJS := $(SOBJS) $(COBJS)
30
31 VPATH := $(SRCDIRS)
32
33 .PHONY: clean
34
35 $(TARGET).bin : $(OBJS)
36 $(LD) -Timx6ul.lds -o $(TARGET).elf $^
37 $(OBJCOPY) -O binary -S $(TARGET).elf $@
38 $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
39
40 $(SOBJS) : obj/%.o : %.S
41 $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
42
43 $(COBJS) : obj/%.o : %.c
44 $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
45
46 clean:
47 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)