国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

【IMX6ULL學(xué)習(xí)筆記】三、U-BOOT Makefile詳解

發(fā)布者:快樂(lè)奇跡最新更新時(shí)間:2025-03-05 來(lái)源: cnblogs關(guān)鍵字:U-BOOT  Makefile 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

00、通識(shí)

版本號(hào)


VERSION = 2016      //主版本號(hào)

PATCHLEVEL = 03 //補(bǔ)丁版本號(hào)

SUBLEVEL = //次版本號(hào)

EXTRAVERSION =      //附加版本信息

NAME = //名字有關(guān)的,一般不使用這兩個(gè)

MAKEFLAGS 變量


export VARIABLE //導(dǎo)出變量給子 make 

unexport VARIABLE    //不導(dǎo)出變量給子 make


MAKEFLAGS += -rR --include-dir=$(CURDIR)  

MAKEFLAGS /SHELL 值始終自動(dòng)的傳遞給子make  除非使用“unexport”聲明


-rR : 表示禁止使用內(nèi)置的隱含規(guī)則和變量定義

--include-dir : 指明搜索路徑

$(CURDIR): 表示當(dāng)前目錄

編譯選項(xiàng)


V=1          來(lái)實(shí)現(xiàn)完整的命令輸出

O=out        指定輸出目錄

C = 1        使能代碼檢查

M=dir        單獨(dú)編譯某個(gè)模塊

HOSTARCH     主機(jī)架構(gòu)

HOSTOS       系統(tǒng)

ARCH         架構(gòu) //ARCH = arm

CROSS_COMPILE  交叉編譯工具 //arm-linux-gnueabihf- (只到 “ - ”)

CC = $(CROSS_COMPILE)gcc   //CC 為編譯gcc的簡(jiǎn)短語(yǔ)法

常用變量


ARCH = arm

CPU = armv7

BOARD = mx6ullevk

VENDOR = freescale

SOC = mx6

CPUDIR = arch/arm/cpu/armv7

BOARDDIR = freescale/mx6ullevk

ARCH、CPU、BOARD、VENDOR、SOC、CPUDIR、BOARDDIR 等變量定義在 config.mk 文件:


config.mk:


ARCH := $(CONFIG_SYS_ARCH:'%'=%)      

CPU := $(CONFIG_SYS_CPU:'%'=%)     //'%'=% 取雙引號(hào)里面的值

.....


= 是最基本的賦值

:= 是覆蓋之前的值

?= 是如果沒(méi)有被賦值過(guò)就賦予等號(hào)后面的值

+= 是添加等號(hào)后面的值

01、清除過(guò)程

make distclean 或者 make mrproper

會(huì)調(diào)用頂層的Makefile的 distclean 規(guī)則。

image

02、配置工程,生成.config配置文件

make xxx_defconfig

會(huì)調(diào)用頂層的Makefile的 %config 規(guī)則。

image

%config 規(guī)則: %通配符,當(dāng)輸入“make xxx_defconfig”的時(shí)候就會(huì)匹配到%config 目標(biāo):


%config: scripts_basic outputmakefile FORCE

第一步:依賴(lài)部分

目標(biāo) %config 依賴(lài)于 scripts_basic、outputmakefile、FORCE


1、FORCE目標(biāo):

FORCE 在頂層 Makefile的 1610 行有如下定義:


PHONY += FORCE

FORCE:

FORCE 是沒(méi)有規(guī)則和依賴(lài)的,所以每次都會(huì)重新生成 FORCE。當(dāng) FORCE 作為其他目標(biāo)的依賴(lài)時(shí),由于 FORCE 總是被更新過(guò)的,因此依賴(lài)所在的規(guī)則總是會(huì)執(zhí)行的。即將FORCE當(dāng)做依賴(lài)時(shí),對(duì)應(yīng)的目標(biāo)規(guī)則總是會(huì)被執(zhí)行。


2、scripts_basic目標(biāo):

image

目標(biāo)不依賴(lài)其它目標(biāo),會(huì)執(zhí)行以下規(guī)則命令:


$(Q)$(MAKE) $(build)=scripts/basic

其中:


Q是顯示方式:靜默make -s;詳細(xì)make V=1;不顯示make V=0

MAKE=make

build定義在scriptskbuild.include

    build := -f $(srctree)/scripts/Makefile.build obj

    展開(kāi)后:

    build := -f ./scripts/Makefile.build obj

展開(kāi)后:


@make -f ./scripts/Makefile.build obj=scripts/basic

@rm -f .tmp_quiet_recordmcount

最終會(huì)調(diào)用文件./scripts/Makefile.build


3、outputmakefile目標(biāo):

image

可以通過(guò)echo查看KBUILD_SRC為空


mytest:

    @echo KBUILD_SRC = $(KBUILD_SRC)

所以該目標(biāo)規(guī)則沒(méi)有執(zhí)行如何命令。


第二步:命令部分

目標(biāo) %config 依賴(lài)于 scripts_basic、outputmakefile、FORCE ,執(zhí)行以下命令:


 $(Q)$(MAKE) $(build)=scripts/kconfig $@

展開(kāi):


make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

也跟文件./scripts/Makefile.build 有關(guān)


第三步:Makefile.build

上面的分析最后指向以下兩條命令:


make -f ./scripts/Makefile.build obj=scripts/basic

make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

1、 scripts_basic 目標(biāo)對(duì)應(yīng)的命令:

make -f ./scripts/Makefile.build obj=scripts/basic

打開(kāi)文件 scripts/Makefile.build,有如下代碼:


# Modified for U-Boot

prefix := tpl

src := $(patsubst $(prefix)/%,%,$(obj))

ifeq ($(obj),$(src))

prefix := spl

src := $(patsubst $(prefix)/%,%,$(obj))

ifeq ($(obj),$(src))

prefix := .

endif

endif

# The filename Kbuild has precedence over Makefile

kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))

kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)

include $(kbuild-file)

使用@echo打印各個(gè)變量值,結(jié)果如下:


src= scripts/basic

kbuild-dir = ./scripts/basic

kbuild-file = ./scripts/basic/Makefile

include ./scripts/basic/Makefile

其中src的值即為obj=scripts/basic的值。

make執(zhí)行時(shí)未指定目標(biāo),會(huì)執(zhí)行Makefile.build中的默認(rèn)目標(biāo),如下:


__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))

$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target))

$(subdir-ym) $(always)

@:

其中KBUILD_BUILTIN = 1、KBUILD_MODULES = 0,展開(kāi)后即為:


__build:$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)

@:

image.png


include ./scripts/basic/Makefile

2、 %config 目標(biāo)對(duì)應(yīng)的命令:

make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

src的值即為obj=scripts/basic的值,所以Makefile.build中各個(gè)變量值如下:


src= scripts/kconfig

kbuild-dir = ./scripts/kconfig

kbuild-file = ./scripts/kconfig/Makefile

include ./scripts/kconfig/Makefile

include包含了./scripts/kconfig目錄下的Makefile,執(zhí)行make時(shí)會(huì)調(diào)用scripts/kconfig/ Makefile中的內(nèi)容,此文件有如下所示內(nèi)容:


%_defconfig: $(obj)/conf

    $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)


# Added for U-Boot (backward compatibility)

%_config: %_defconfig

    @:

目標(biāo)%_defconfig 剛好和我們輸入的 xxx_defconfig 匹配,依賴(lài)為$(obj)/conf,展開(kāi)后就是 scripts/kconfig/conf。接下來(lái)就是檢查并生成依賴(lài)scripts/kconfig/conf。


得到 scripts/kconfig/conf 以后就要執(zhí)行目標(biāo)%_defconfig 的命令:


 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

將其展開(kāi)就是:


@ scripts/kconfig/conf --defconfig=arch/../configs/xxx_defconfig Kconfig

結(jié)果是將配置輸出到.config 文件中,最終生成 uboot 根目錄下的.config 文件。


整體流程圖:

image

參考正點(diǎn)原子linux驅(qū)動(dòng)開(kāi)發(fā)指南,使用conf程序去生成.config;另一種舊版使用mkconfig 去生成config.mk 、config.h。


03.make 生成 u-boot.bin 等文件

make   //編譯u-boot,未指定目標(biāo)將執(zhí)行Makefile中默認(rèn)目標(biāo)

image

沒(méi)有指明目標(biāo),使用默認(rèn)的目標(biāo)。

image

如果 KBUILD_EXTMOD(編譯模塊) 為空的話(huà) _all 依賴(lài)于all:


all: $(ALL-y)

其中all依賴(lài)于ALL-y,即依賴(lài)于 u-boot.srec、u-boot.bin、u-boot.sym等:

image

u-boot.bin 依賴(lài) u-boot-nodtb.bin、FORCE目標(biāo):

image

u-boot-nodtb.bin 依賴(lài) u-boot、FORCE目標(biāo):

image

image.png


image

image.png

image

image.png

image

u-boot 依賴(lài) $(head-y):

head-y在 arch/arm/Makefile 定義,即 u-boot 依賴(lài) start.o :


head-y := arch/arm/cpu/$(CPU)/start.o

u-boot 依賴(lài) $(libs-y):

libs-y 在頂層 Makefile 中定義,為依賴(lài)的源碼文件目錄:

image

image.png

$(patsubst ,,)


名稱(chēng):模式字符串替換函數(shù)


功能:查找 中的單詞(單詞以“空格”、“Tab”或“回車(chē)”“換行”分隔)是否符合模式

,如果匹配的話(huà),則以替換。這里,可以包括通配符 % ,

表示任意長(zhǎng)度的字串。如果 中也包含 % ,那么,中的這

個(gè) % 將是 中的那個(gè) % 所代表的字串。(可以用 來(lái)轉(zhuǎn)義,以 % 來(lái)表示真實(shí)含義的 % 字符)


返回:函數(shù)返回被替換過(guò)后的字符串。

image

表示 u-boot 依賴(lài) libs-y 所指定的所有源碼路徑下的 built-in.o 文件


結(jié)論

image

image

u-boot 依賴(lài) start.o、 built-in.o 文件,u-boot 將 built-in.o、start.o 文件鏈接在一起


04.鏈接

u-boot.lds 為鏈接腳本,將 arch/arm/cpu/armv7/start.o 和各個(gè)子目錄下的 built-in.o 鏈接在一起生成 u-boot。


05.備注

make xxx_defconfig:用于配置 uboot,這個(gè)命令最主要的目的就是生成.config 文件。

make:用于編譯 uboot,這個(gè)命令的主要工作就是生成二進(jìn)制的 u-boot.bin 文件和其他的一些與 uboot 有關(guān)的文件,比如 u-boot.imx 等。


關(guān)鍵字:U-BOOT  Makefile 引用地址:【IMX6ULL學(xué)習(xí)筆記】三、U-BOOT Makefile詳解

上一篇:【IMX6ULL學(xué)習(xí)筆記】四、 U-BOOT啟動(dòng)流程
下一篇:【IMX6ULL學(xué)習(xí)筆記】二、U-Boot命令合集

推薦閱讀最新更新時(shí)間:2025-06-14 17:07

迅為-iMX6ULL開(kāi)發(fā)板-Samba服務(wù)搭建
Samba 最大的功能就是可以用于 Linux 與 windows 系統(tǒng)共享文件夾,搭建 SMB 服務(wù)首先要保證 windows 和 ubuntu 網(wǎng)絡(luò)互通,然后在 ubuntu 下載安裝: sudo apt-get install samba 創(chuàng)建共享文件夾 samba,并在共享文件夾創(chuàng)建文件 topeet: mkdir samba ,touch topeet 備份配置文件: sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup 修改配置文件: sudo vi /etc/samba/smb.conf 在后面添加如下內(nèi)容,“path”后寫(xiě)自己共享文件夾的路徑: com
[單片機(jī)]
迅為-<font color='red'>iMX6ULL</font>開(kāi)發(fā)板-Samba服務(wù)搭建
IMX6ULL裸機(jī)-2-PWM定時(shí)器
1 PWM定時(shí)器介紹 一共有 8 路 PWM 信號(hào),每個(gè) PWM 包含一個(gè) 16 位的計(jì)數(shù)器和一個(gè) 4 x 16 的數(shù)據(jù) FIFO。一路框圖如下: ①、此部分是一個(gè)選擇器,用于選擇 PWM 信號(hào)的時(shí)鐘源,一共有三種時(shí)鐘源:ipg_clk,pg_clk_highfreq 和 ipg_clk_32k。 ②、這是一個(gè) 12 位的分頻器,可以對(duì)①中選擇的時(shí)鐘源進(jìn)行分頻。 ③、這是 PWM 的 16 位計(jì)數(shù)器寄存器,保存著 PWM 的計(jì)數(shù)值。 ④、這是 PWM 的 16 位周期寄存器,此寄存器用來(lái)控制 PWM 的頻率。 ⑤、這是 PWM 的 16 位采樣寄存器,此寄存器用來(lái)控制 PWM 的占空比。 ⑥、此部分是 PWM 的中斷信號(hào),PW
[單片機(jī)]
【ARM裸機(jī)】 - GCC編譯流程&Makefile&動(dòng)靜態(tài)庫(kù)
一、編譯流程及GCC選項(xiàng) 1.1、編譯流程包括: 預(yù)處理(.i)- 編譯(.s)- 匯編(.o)- 鏈接(可執(zhí)行文件) 1.2、gcc編譯選項(xiàng): gcc 文件名 gcc常用選項(xiàng): -v:查看gcc編譯器的版本,顯示gcc執(zhí)行時(shí)的詳細(xì)過(guò)程 -o file Place the output into file 指定輸出文件名為file,這個(gè)名稱(chēng)不能跟源文件名同名 -E Preprocess only; do not compile, assemble or link 只預(yù)處理,不會(huì)編譯、匯編、鏈接 -S
[單片機(jī)]
【ARM裸機(jī)】 - GCC編譯流程&<font color='red'>Makefile</font>&動(dòng)靜態(tài)庫(kù)
1_5.3.3_內(nèi)核配置裁剪及啟動(dòng)流程_內(nèi)核啟動(dòng)流程分析之Makefile_P
分析Makefile,主要是: 找到第1個(gè)文件,從這個(gè)文件入手分析啟動(dòng)流程; 鏈接腳本,分析文件分布情況。 涉及的文件分類(lèi)如下: kbuild Makefile 首先來(lái)看子目錄下面的Makefile,也就是kbuild Makefile,每個(gè)子目錄下面都會(huì)有一個(gè)Makefile,它們的主要功能是設(shè)置該目錄的文件的編譯選項(xiàng)。 選取一個(gè)子目錄下的Makefile來(lái)研究一下。 其中大部分的內(nèi)容是設(shè)置文件的編譯選項(xiàng)。 假設(shè)有兩個(gè)文件a.c和b.c,如果需要單獨(dú)的將它們編譯進(jìn)內(nèi)核,可以使用如下語(yǔ)句: obj-y += a.o b.o 那么,如果要將這兩個(gè)文件編成一個(gè)模塊呢? 在內(nèi)核的Document/kbui
[單片機(jī)]
1_5.3.3_內(nèi)核配置裁剪及啟動(dòng)流程_內(nèi)核啟動(dòng)流程分析之<font color='red'>Makefile</font>_P
U-boot 在 mini2440-S3C2440 上的移植(4):U-boot第二階段代碼:修改初始化代碼
編譯U-boot給mini2440時(shí),要編譯出能在ARM平臺(tái)上使用的可執(zhí)行文件-bin,首先要在ubuntu 中安裝交叉編譯工具鏈,因?yàn)槲沂褂玫氖怯焉浦鄣拈_(kāi)發(fā)板,所以我使用的已經(jīng)制作好的工具鏈,當(dāng)然也可以自己制作工具鏈:如基于GCC和glibc制作工具鏈,可以使用cross tools編譯; 我使用的工具鏈的版本是arm-linux-gcc-4.3.3版本,下載地址:下載地址 1.在pc端下載好以后,將壓縮包用xftp傳輸?shù)経buntu;當(dāng)然也可以用其他軟件上傳;上傳后把它放在根目錄下的/usr/local文件夾中新建一個(gè)arm文件夾,然后把壓縮包復(fù)制到這個(gè)文件夾;注意先建好文件夾再上傳,可以減少很多工作量; 一定要上傳壓縮包,
[單片機(jī)]
<font color='red'>U-boot</font> 在 mini2440-S3C2440 上的移植(4):<font color='red'>U-boot</font>第二階段代碼:修改初始化代碼
第九章、Tiny4412 U-BOOT移植九 DDR工作時(shí)序與原理 一
DDR SDRAM 全稱(chēng)為 Double Data Rate SDRAM,中文名為“雙倍數(shù)據(jù)流 SDRAM”。DDR SDRAM 在原有的 SDRAM的基礎(chǔ)上改進(jìn)而來(lái)。下圖9-1是DDR和SDRAM的數(shù)據(jù)傳輸對(duì)比圖。 圖9-1、DDR和SDRAM的數(shù)據(jù)傳輸對(duì)比圖 上圖8-1可以清楚的看到,DDR可在一個(gè)時(shí)鐘周期內(nèi)傳送兩次數(shù)據(jù),上升沿傳一次,下降沿傳一次。 一、DDR的基本原理 圖9-2、DDR讀操作時(shí)序圖 從中可以發(fā)現(xiàn)它多了兩個(gè)信號(hào):CLK#與DQS,CLK#與正常 CLK 時(shí)鐘相位相反,形成差分時(shí)鐘信號(hào)。而數(shù)據(jù)的傳輸在 CLK 與 CLK#的交叉點(diǎn)進(jìn)行,可見(jiàn)在 CLK 的上升與下降沿(此時(shí)正好是 CLK#的上
[單片機(jī)]
第九章、Tiny4412 <font color='red'>U-BOOT</font>移植九 DDR工作時(shí)序與原理 一
基于S3C44B0X的U-Boot分析與移植
1.引言 嵌入式系統(tǒng)一般指非PC系統(tǒng),它包括硬件和軟件兩部分。硬件包括處理器/微處理器、存儲(chǔ)器及外設(shè)器件和I/O端口等。軟件部分包括Bootloader、操作系統(tǒng)(OS)和應(yīng)用程序。嵌入式系統(tǒng)的硬件和軟件都必須高效率地設(shè)計(jì)、量體裁衣、去除冗余,這樣才能在具體應(yīng)用中實(shí)現(xiàn)更高的處理性能。其中,Bootloader是基于特定硬件平臺(tái)來(lái)實(shí)現(xiàn)的,負(fù)責(zé)硬件的初始化、嵌入式系統(tǒng)的引導(dǎo)加載等工作,是嵌入式系統(tǒng)開(kāi)發(fā)中的一個(gè)重要環(huán)節(jié)。嵌入式開(kāi)發(fā)的硬件平臺(tái)是根據(jù)應(yīng)用需要定制的,因此不存在一個(gè)通用的Bootloader。U-Boot是一個(gè)支持多種CPU體系結(jié)構(gòu)的 Bootloader。本文就是針對(duì)在自制開(kāi)發(fā)板上實(shí)現(xiàn)U-Boot的移植。 2.U-Boo
[單片機(jī)]
基于S3C44B0X的<font color='red'>U-Boot</font>分析與移植
基于S3C2410A的嵌入式系統(tǒng)的U-Boot移植
0 引 言 ??? ARM嵌入式處理器已被廣泛應(yīng)用于消費(fèi)電子產(chǎn)品、無(wú)線(xiàn)通信、網(wǎng)絡(luò)通信和工業(yè)控制等領(lǐng)域。其中,ARM9的芯片更是以其低價(jià)格、低功耗、高性能在手持設(shè)備中占據(jù)著重要市場(chǎng)。在嵌入式操作系統(tǒng)中,Linux,Vxworks,WinCE三足鼎立,其中Linux由于其開(kāi)源性、穩(wěn)定性、安全性、可裁減性更是一支獨(dú)放。在嵌入式系統(tǒng)中,如何實(shí)現(xiàn)在ARM9平臺(tái)下Linux操作系統(tǒng)的引導(dǎo)工作是嵌入式技術(shù)開(kāi)發(fā)的重要環(huán)節(jié)。 1 嵌入式系統(tǒng)的軟件組成 1.1 系統(tǒng)的軟件組成 ??? 嵌入式的軟件系統(tǒng)主要由Bootloader、操作系統(tǒng)、文件系統(tǒng)、應(yīng)用程序等組成。其中,Bootloader是介于硬件和操作系統(tǒng)之間的一層,其作用就好像P
[嵌入式]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved