[MakeFile] Gestion de projet (BSP) et écriture générale de makefile sous Linux

1. Principes de gestion de l'ingénierie BSP

​ Le but de la gestion de projet BSP est de modulariser le code, et les fichiers avec le même attribut sont stockés dans le même répertoire.

​ 1. Créez le dossier requis et placez les fichiers avec le même attribut dans le dossier correspondant.

2. Modifiez les pilotes clk, led et delay, créez les fichiers de pilote correspondants et placez-les dans les répertoires correspondants.

3. Modifiez le contenu du fichier main.c en fonction du nouveau fichier de pilote écrit.

2. Préparation du fichier makefile

Description de la fonction API :

fonction patsubst :

Format:

$(patsubst pattern,replacement,text)

Brève fonction :

Il s'agit d'une fonction de remplacement qui remplace le texte du texte par un remplacement à son tour selon les règles du modèle

Lors du remplacement, le texte du texte est divisé par "espace", "TAB", "retour chariot et saut de ligne" pour correspondre un par un, s'il est conforme au modèle de modèle. Si la correspondance est réussie, il sera remplacé par remplacement. Le motif et le remplacement peuvent tous deux utiliser % comme caractère générique (si nécessaire, le % d'origine doit être échappé avec %)

Exemple : Ajoutez un -I à tous les champs de caractères dans la variable INCLUDES.

$(patsubst %, -I %, $(INCLUDES))

fonction foreach :

Format:

$(foreach <var>,<list>,<text> )

Brève fonction :

Exécute la fonction spécifiée dans une boucle, retire les mots de la liste un par un, les place dans la variable spécifiée par le paramètre var, puis exécute la fonction de texte. La valeur de retour de la fonction est la combinaison de toutes les chaînes de texte, et var est une variable temporaire locale, qui est libérée après l'exécution de la fonction.

Exemple:

src := 1 2 3 4
out := $(foreach i, $(src), i.c)

La sortie à ce moment est

1.c 2.c 3.c 4.c

fonction joker :

Format:

$(wildcard PATTERN...) 

Description de la fonction :
Développer les caractères génériques. Étant donné que $ fait référence à une variable, le caractère générique ne sera pas valide, utilisez-le donc pour développer les caractères correspondant au caractère générique

Exemple : Il y a quatre fichiers C 1.c 2.c 3.c 4.c dans le répertoire

obj := $(patsubst %.c, %o,$(wildcard *.c))

Le caractère générique * sera attribué à ces quatre fichiers c à tour de rôle, $(wildcard *.c) se développe en chaîne 1.c 2.c 3.c 4.c, puis la fonction patsubst remplace .c par .o, et renvoie le résultat de remplacement. À ce stade : obj est 1.o 2.o 3.o 4.o

fonction notdir

Format:

$(notdir <names...> )

Brève fonction :

Une fonction pour supprimer les chemins de fichiers, en préservant les suffixes.

Exemple:

dir :=./led/led.c
src :=$(notdir $(dir))

Supprimez le chemin, à ce moment le résultat src est led.c

VPATH

La variable spéciale "VPATH" dans le fichier Makefile doit compléter cette fonction. Si cette variable n'est pas spécifiée, make ne cherchera que les fichiers dépendants et les fichiers objets dans le répertoire courant. Si cette variable est définie, alors make ira dans le répertoire spécifié pour trouver le fichier lorsque le répertoire courant est introuvable.

mode statique

Description de la fonctionnalité : définition plus facile des règles multi-objectifs.
Format:

<targets ...>:<target-pattern>:<prereq-patterns>
<commands>
...

Targets définit une série de fichiers cibles, qui constituent une collection et peuvent avoir des caractères génériques.
target-pattern spécifie le modèle des cibles, c'est-à-dire que le modèle défini cible
prereq-patterns est le modèle de dépendance de la cible, et le modèle formé par le modèle cible est défini à son tour en fonction de la cible.
$(SOBJS) : obj/%.o : %.S signifie compiler tous les .S en .o et les stocker dans le répertoire obj.

Structure du fichier de projet

.
├── bsp                              # 板级支持包
│   ├── clk                          # 时钟驱动
│   │   ├── bsp_clk.c
│   │   └── bsp_clk.h
│   ├── delay                        # 延时驱动
│   │   ├── bsp_delay.c
│   │   └── bsp_delay.h
│   └── led                          # 链接驱动                 
│       ├── bsp_led.c
│       └── bsp_led.h
├── imx6ul                           # imx6ul官方库函数
│   ├── cc.h
│   ├── fsl_common.h
│   ├── fsl_iomuxc.h
│   ├── imx6ul.h
│   └── MCIMX6Y2.h
├── imx6ul.lds                       # 链接脚本
├── imxdownload                      # 下载脚本
├── ledc_bsp.code-workspace          # vsc工程
├── load.imx
├── Makefile                         
├── obj                              # 存放obj文件
└── project                          # 工程main和start文件
    ├── main.c
    └── start.S

Scénario de lien :

SECTIONS{
        . = 0X87800000;
        .text :
        {
                obj/start.o
                *(.text)
        }
        .rodata ALIGN(4) : {*(.rodata*)}
        .data ALIGN(4)   : { *(.data) }
        __bss_start = .;
        .bss ALIGN(4)  : { *(.bss)  *(COMMON) }
        __bss_end = .;
}

Makefile

Étapes d'écriture :
1. Définir les variables du fichier objet et de la chaîne de compilation croisée
2. Définir les variables du chemin du fichier source et du chemin du fichier d'en-tête
3. Se référer au fichier d'en-tête et ajouter -I (patsubst)
4. Rechercher les fichiers source dans le chemin correspondant, fichier c et S. (pour chaque caractère générique)
5. Convertir en nom de fichier source sans chemin
6. Définir le fichier objet
7. Spécifier le chemin VPATH et indiquer à make où rechercher les fichiers de dépendance et les fichiers objet
8.
9. Écrire en clair pour effacer les fichiers compilés. (.FAUX)

TARGET                          ?= test
CROSS_COMPILER                  ?= arm-linux-gnueabihf-
																	
CC                              := $(CROSS_COMPILER)gcc
LD                              := $(CROSS_COMPILER)ld

OBJCOPY                         := $(CROSS_COMPILER)objcopy
OBJDUMP                         := $(CROSS_COMPILER)objdump

INCDIRS                         := imx6ul\
                                   project\
                                   bsp/led\
								   bsp/delay\
								   bsp/clk
							
SRCDIRS                         := imx6ul\
                                   project\
                                   bsp/led\
								   bsp/delay\
								   bsp/clk
                                   

INCLUDE                         := $(patsubst %, -I %,$(INCDIRS))

# 所有C、S文件的路径及文件名
CFILES                          := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
SFILES                          := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))

# 所有C、S文件
CFILENDIR                       := $(notdir $(CFILES))
SFILENDIR                       := $(notdir $(SFILES))

# 所有C -> obj文件,放在obj目录下
COBJS                           := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
SOBJS                           := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))

# 所有的.o文件
OBJS                            := $(SOBJS) $(COBJS)

VPATH                           := $(SRCDIRS)

$(TARGET).bin : $(OBJS)
	$(LD) -Timx6ul.lds -o $(TARGET).elf $^
	$(OBJCOPY) -O binary -S $(TARGET).elf $@
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

$(SOBJS) : obj/%.o : %.S
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<


$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<



.PHONY:clear
clear:
	rm -rf $(OBJS) $(TARGET).bin  $(TARGET).elf  $(TARGET).dis

print:
	@echo INCLUDE = $(INCLUDE)
	@echo CFILES  = $(CFILES) $(SFILES)
	@echo CFILENDIR  = $(CFILENDIR)
	@echo SFILENDIR  = $(SFILENDIR)
	@echo ---OBJ = $(OBJS)

Résumer:

1.VPATH est utilisé pour spécifier le répertoire des fichiers source. (Lorsque le répertoire courant est introuvable, recherchez-le dans le répertoire VPATH) Il ne peut pas être inférieur.

2. -o problème, à l'origine 输入-o 输出Si vous écrivez un bloc d'entrée et de sortie, vous ne pouvez écrire -o que comme ceci输出 输入

3. description du paramètre gcc :

-Wall编译后显示所有警告
-nostdlib 不链接标准库(启动文件)
-O2 优化编译及效率

4. Mode statique

<targets ...>: <target-pattern>: <prereq-patterns ...>

$(OBJS): obj/%.o : %.S 表示将所有的.S文件编译为.o并且存放到obj目录下去。

Je suppose que tu aimes

Origine blog.csdn.net/qq_44078824/article/details/119948816
conseillé
Classement