在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > GNU ARM匯編--(十七)u-boot的makefile和mkconfig解讀

            GNU ARM匯編--(十七)u-boot的makefile和mkconfig解讀

            作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
            自己寫的bootloader可以引導(dǎo)kernel了,我以為曾經(jīng)神秘的u-boot代碼將變得毫無挑戰(zhàn),然事實(shí)表明u-boot作為優(yōu)秀的開源代碼,閱讀起來還是很有挑戰(zhàn)的,值得一讀!

            閱讀碰到的頭等問題:Makefile和shell腳本看不懂...

            本文引用地址:http://www.biyoush.com/article/201611/321714.htm

            說起來做linux也很久了,Makefile和shell腳本都接觸過,但真的都是略懂而已.因?yàn)楣镜腗akefile和shell簡單的一眼望的對穿,很初級的寫法,簡單的應(yīng)用.再隨便在網(wǎng)上下個老外的開源代碼,那個Makefile和shell復(fù)雜啊.一不留神想起來了qt的qmake根據(jù)工程文件生成的Makefile也是很簡單,但qmake是人家老外寫的.不說其他語言了,只看Makefile和shell,中外的差距就在那了.

            這次準(zhǔn)備移植u-boot到tq2440上,選用的u-boot版本是u-boot-2012.07.

            下面是我對u-boot配置和編譯的makefile mkconfig config.mk等文件的解讀,有些解讀我是在源檔上添加文字注釋的,有些是另外寫的,解讀難免有誤,若有讀者發(fā)現(xiàn)了,希望能夠指出,在下感激不盡!

            在編譯u-boot的過程,就是make xxx_config和make兩步

            以make smdk2410_config為例:

            當(dāng)以smdk2410_config為目標(biāo)時,makefile中前面一些變量的定義和其他文件的引用也是有的,這個在原檔中添加了有關(guān)注釋:

            在makefile中有:

            [cpp]view plaincopy
            1. unconfig:
            2. @rm-f$(obj)include/config.h$(obj)include/config.mk
            3. $(obj)board/*/config.tmp$(obj)board/*/*/config.tmp
            4. $(obj)include/autoconf.mk$(obj)include/autoconf.mk.dep
            5. %_config::unconfig
            6. echo$@
            7. $(MKCONFIG)-A$(@:_config=)

            %是個通配符,make xxx_config都是這個目標(biāo).目標(biāo)的依賴是unconfig,unconfig的命令是刪除一些文件,而這些文件正是從make xxx_config過程中產(chǎn)生的.unconfig就是清理配置的.

            我們來看@$(MKCONFIG) -A $(@:_config=)
            其實(shí)執(zhí)行的是mkconfig -A smdk2410
            我們可以在該行上面添加一行:echo $@
            則會輸出smdk2410_config,因?yàn)?@就是指目標(biāo)
            $(@:_config=)是變量的替換引用
            格式為“$(VAR:A=B)”(或者“${VAR:A=B}”),意思是:替換變量“VAR”中所有“A”字符結(jié)尾的字為“B”結(jié)尾的字。
            所以smdk2410_config末尾的_config去除了.

            下面就是執(zhí)行mkconfig腳本了,mkconfig -A smdk2410

            給出添加注釋的mkconfig文件:

            [cpp]view plaincopy
            1. #!/bin/sh-e
            2. #Scripttocreateheaderfilesandlinkstoconfigure
            3. #U-Bootforaspecificboard.
            4. #
            5. #Parameters:TargetArchitectureCPUBoard[VENDOR][SOC]
            6. #
            7. #(C)2002-2010DENXSoftwareEngineering,WolfgangDenk
            8. #
            9. APPEND=no#Default:Createnewconfigfile
            10. BOARD_NAME=""#Nametoprintinmakeoutput
            11. TARGETS=""
            12. arch=""
            13. cpu=""
            14. board=""
            15. vendor=""
            16. soc=""
            17. options=""
            18. echo$#
            19. if[$#-eq2-a("$1"="-A")];then
            20. #Automaticmode
            21. line=`egrep-i"^[[:space:]]*${2}[[:space:]]"boards.cfg`||{
            22. echo"make:***Noruletomaketarget`$2_config.Stop.">&2
            23. exit1
            24. }
            25. set${line}
            26. echo${line}
            27. echo$#
            28. #adddefaultboardnameifneeded
            29. [$#=3]&&set${line}${1}
            30. #####################################
            31. #我們執(zhí)行腳本的命令是mkconfig-Asmdk2410,$#表示的是參數(shù)的個數(shù),$1表示的是第一個參數(shù)
            32. #line就是在boards.cfg文件中smdk2410的那行,而-i表示忽略大小寫
            33. #在boards.cfg文件中,有
            34. #TargetARCHCPUBoardnameVendorSoCOptions
            35. #smdk2410armarm920t-samsungs3c24x0
            36. #set${line}
            37. #set也可用于在腳本內(nèi)部給出其運(yùn)行參數(shù),所以這個時候參數(shù)就變?yōu)?smdk2410armarm920t-samsungs3c24x0"
            38. #這個時候參數(shù)個數(shù)就變成6個了
            39. ######################################
            40. elif["${MAKEFLAGS+set}${MAKELEVEL+set}"="setset"];then
            41. #onlywarnwhenusingaconfigtargetintheMakefile
            42. cat<<-EOF
            43. warning:Pleasemigratetoboards.cfg.Failuretodosowill
            44. meanremovalofyourboardinthenextrelease.
            45. EOF
            46. sleep5
            47. fi
            48. echo$1
            49. while[$#-gt0];do
            50. case"$1"in
            51. --)shift;break;;
            52. -a)shift;APPEND=yes;;
            53. -n)shift;BOARD_NAME="${1%_config}";shift;;
            54. -t)shift;TARGETS="`echo$1|seds:_::g`${TARGETS}";shift;;
            55. *)break;;
            56. esac
            57. done
            58. ################################################
            59. #因?yàn)?1的值為smdk2410,所以case找不到對應(yīng)的
            60. #################################################
            61. [$#-lt4]&&exit1
            62. [$#-gt7]&&exit1
            63. ##################################################
            64. #對參數(shù)個數(shù)做檢查,小于4個或大于7個就退出
            65. ##################################################
            66. #Stripalloptionsand/or_configsuffixes
            67. CONFIG_NAME="${1%_config}"
            68. ####################
            69. #CONFIG_NAME的值為smdk2410
            70. #########################
            71. echoconfig_
            72. echo${CONFIG_NAME}
            73. ["${BOARD_NAME}"]||BOARD_NAME="${1%_config}"
            74. echoboard
            75. echo${BOARD_NAME}
            76. ###########################################
            77. #如果BOARD_NAME在之前已經(jīng)被設(shè)定了,就不做任何動作;如果為空,就設(shè)定為smdk2410.這里設(shè)定為smdk2410
            78. ############################################
            79. arch="$2"
            80. cpu="$3"
            81. if["$4"="-"];then
            82. board=${BOARD_NAME}
            83. else
            84. board="$4"
            85. fi
            86. ######################################################
            87. #設(shè)定arch變量的值為arm
            88. #cpu變量的值為arm920t
            89. #因?yàn)榈谒膫€變量為"-",所以board變量的值為smdk2410
            90. #######################################################
            91. [$#-gt4]&&["$5"!="-"]&&vendor="$5"
            92. [$#-gt5]&&["$6"!="-"]&&soc="$6"
            93. #############################################################
            94. #設(shè)定verdor變量的值為samsung
            95. #設(shè)定soc變量的值為s3c24x0
            96. #############################################################
            97. [$#-gt6]&&["$7"!="-"]&&{
            98. #checkifwehaveaboardconfignameintheoptionsfield
            99. #theoptionsfieldmavehaveaboardconfignameandalist
            100. #ofoptions,bothseparatedbyacolon(:);theoptionsare
            101. #separatedbycommas(,).
            102. #
            103. #Checkforboardname
            104. tmp="${7%:*}"
            105. if["$tmp"];then
            106. CONFIG_NAME="$tmp"
            107. fi
            108. #Checkifweonlyhaveacolon...
            109. if["${tmp}"!="$7"];then
            110. options=${7#*:}
            111. TARGETS="`echo${options}|seds:,::g`${TARGETS}"
            112. fi
            113. }
            114. #################################################
            115. #因?yàn)槲覀兊淖兞總€數(shù)就是6個,這一段不執(zhí)行
            116. #################################################
            117. echo${ARCH}
            118. echo${arch}
            119. if["${ARCH}"-a"${ARCH}"!="${arch}"];then
            120. echo"Failed:$ARCH=${ARCH},shouldbe${arch}for${BOARD_NAME}"1>&2
            121. exit1
            122. fi
            123. ####################################################
            124. #ARCH是在頂層makefile中定義的,在此刻還是為空的。
            125. #如果ARCH已經(jīng)有值了,那么就檢測ARCH和arch是否匹配了.
            126. ####################################################
            127. if["$options"];then
            128. echo"Configuringfor${BOARD_NAME}-Board:${CONFIG_NAME},Options:${options}"
            129. else
            130. echo"Configuringfor${BOARD_NAME}board..."
            131. fi
            132. ###########################################################################
            133. #我們沒有定義options變量,所以輸出Configuringforsmdk2410board...
            134. ###########################################################################
            135. #
            136. #Createlinktoarchitecturespecificheaders
            137. #
            138. echo${SRCTREE}
            139. echo${OBJTREE}
            140. if["$SRCTREE"!="$OBJTREE"];then
            141. mkdir-p${OBJTREE}/include
            142. mkdir-p${OBJTREE}/include2
            143. cd${OBJTREE}/include2
            144. rm-fasm
            145. ln-s${SRCTREE}/arch/${arch}/include/asmasm
            146. LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/
            147. cd../include
            148. mkdir-pasm
            149. else
            150. cd./include
            151. rm-fasm
            152. ln-s../arch/${arch}/include/asmasm
            153. fi
            154. #############################################################################
            155. #在makefile中我們已經(jīng)知道SRCTREE和OBJTREE都是當(dāng)前目錄,所以這里執(zhí)行else
            156. #進(jìn)入./include目錄,刪除asm鏈接,并重新建立鏈接asm,指向arch/arm/include/asm
            157. #############################################################################
            158. rm-fasm/arch
            159. #########################################################################
            160. #刪除include目錄下的asm下的arch鏈接文件
            161. ########################################################################
            162. ss=
            163. echo${ss}
            164. if[-z"${ss}"];then
            165. echo"null"
            166. else
            167. echo"notnull"
            168. fi
            169. echo${LNPREFIX}
            170. if[-z"${soc}"];then
            171. ln-s${LNPREFIX}arch-${cpu}asm/arch
            172. else
            173. ln-s${LNPREFIX}arch-${soc}asm/arch
            174. fi
            175. ##########################################################
            176. #-z用來檢測字符串是否為空,為空返回真
            177. #這里我們的soc不為空,執(zhí)行else
            178. #將asm/arch鏈向arch-s3c24x0,看一下arch-s3c24x0目錄,里面都是s3c24x0相關(guān)的頭文件
            179. ##########################################################
            180. if["${arch}"="arm"];then
            181. rm-fasm/proc
            182. ln-s${LNPREFIX}proc-armvasm/proc
            183. fi
            184. ###########################################################
            185. #刪除asm/proc鏈接文件
            186. #將asm/proc鏈向proc-armv目錄,該目錄下是四個頭文件:domain.hprocessor.hptrace.hsystem.h
            187. #############################################################
            188. #
            189. #CreateincludefileforMake
            190. #
            191. echo"ARCH=${arch}">config.mk
            192. echo"CPU=${cpu}">>config.mk
            193. echo"BOARD=${board}">>config.mk
            194. ["${vendor}"]&&echo"VENDOR=${vendor}">>config.mk
            195. ["${soc}"]&&echo"SOC=${soc}">>config.mk
            196. ######################################################################
            197. #上面幾句的作用在注釋中描述的很清楚
            198. #include/config.mk的文件如下:
            199. #ARCH=arm
            200. #CPU=arm920t
            201. #BOARD=smdk2410
            202. #VENDOR=samsung
            203. #SOC=s3c24x0
            204. ######################################################################
            205. #AssignboarddirectorytoBOARDIRvariable
            206. if[-z"${vendor}"];then
            207. BOARDDIR=${board}
            208. else
            209. BOARDDIR=${vendor}/${board}
            210. fi
            211. echo${BOARDDIR}
            212. #######################################################################
            213. #因?yàn)関endor變量不為空,所以執(zhí)行else
            214. #BOARDDIR的值為samsung/s3c24x0
            215. ########################################################################
            216. #
            217. #Createboardspecificheaderfile
            218. #
            219. if["$APPEND"="yes"]#Appendtoexistingconfigfile
            220. then
            221. echo>>config.h
            222. else
            223. >config.h#Createnewconfigfile
            224. fi
            225. ########################################################################
            226. #在文件的最開頭可以看到APPEND為no,所以這里我們在include文件夾下建立config.h文件
            227. #######################################################################
            228. echo"/*Automaticallygenerated-donotedit*/">>config.h
            229. echo${TARGETS}
            230. foriin${TARGETS};do
            231. i="`echo${i}|sed/=/{s/=//;q;};{s/$/1/;}`"
            232. echo"#defineCONFIG_${i}">>config.h;
            233. done
            234. ###################################################
            235. #這里我們TARGETS為空,上面不執(zhí)行了
            236. ##################################################
            237. echo"#defineCONFIG_SYS_ARCH"${arch}"">>config.h
            238. echo"#defineCONFIG_SYS_CPU"${cpu}"">>config.h
            239. echo"#defineCONFIG_SYS_BOARD"${board}"">>config.h
            240. ["${vendor}"]&&echo"#defineCONFIG_SYS_VENDOR"${vendor}"">>config.h
            241. ["${soc}"]&&echo"#defineCONFIG_SYS_SOC"${soc}"">>config.h
            242. cat<>config.h
            243. #defineCONFIG_BOARDDIRboard/$BOARDDIR
            244. #include
            245. #include
            246. #include
            247. #include
            248. #include
            249. EOF
            250. ######################################################
            251. #生成config.h文件如下:
            252. #/*Automaticallygenerated-donotedit*/
            253. ##defineCONFIG_SYS_ARCH"arm"
            254. ##defineCONFIG_SYS_CPU"arm920t"
            255. ##defineCONFIG_SYS_BOARD"smdk2410"
            256. ##defineCONFIG_SYS_VENDOR"samsung"
            257. ##defineCONFIG_SYS_SOC"s3c24x0"
            258. ##defineCONFIG_BOARDDIRboard/samsung/smdk2410
            259. ##include
            260. ##include
            261. ##include
            262. ##include
            263. ##include
            264. #####################################################
            265. exit0

            make xxx_config后,主要的變化是多了幾個文件:

            1.include/asm --> arch/arm/include/arm

            2.include/asm/arch --> arch-s3c24x0

            3.include/asm/proc --> proc-armv
            4.在include目錄下新建了config.mk文件,文件內(nèi)容是ARCH CPU BOARD VENDOR SOC的定義

            5.在include目錄下新建了config.h文件

            接著看make:

            給出部分makefile中的注釋,主要是一些變量的定義:


            上一頁 1 2 3 4 下一頁

            關(guān)鍵詞: ARM匯編u-bootmakefilemkconfi

            評論


            技術(shù)專區(qū)

            關(guān)閉