友堅光盤djyos的simakefile文件說明_第1頁
友堅光盤djyos的simakefile文件說明_第2頁
友堅光盤djyos的simakefile文件說明_第3頁
友堅光盤djyos的simakefile文件說明_第4頁
友堅光盤djyos的simakefile文件說明_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

本文件適用djyosV0.4.1及以后版本。2、自動化程度高,任何下增加刪除改名文件或子,只需修改該下的makefile文件即可,不但總控makefile在內的所有其他makefile都不用修改,就連連接.ld文件也自3、應用程序增減源程序文件和時,當前下的makefile需修改的部分也很少??赡芤牡闹挥?行,實際上可能只有1行需要改。makefile的功makemakefile文件就是定義了一系列制作目標的規(guī)則。make的目的,就makefile中描寫的規(guī)則的指引下,生成最終所需要的目標,什么是最終目標呢?最終目標是執(zhí)行make命令時從命令行輸入的:makerm- *.ldrm命令成功執(zhí)行,clean目標就算完成了。make$(sub_make)-fmake_ld$(sub_make)-fmake_ld編譯生成的文件說明 編譯命令和目標說明boot_rom.bin文件,這個文件只包含啟動代碼,然后就進入死循環(huán)。當需要用硬件仿真器調試操作系統(tǒng)時,就應該先編譯boot_rom.bin并燒錄到0地址的norflash中。2makedebug編譯產生產生用于調試的debug.elf文件,編譯器的優(yōu)化級別是0,且含gdwarf-2格式的調試信息,由調試軟件比如realview2.2或gdb直接加載到內存中調試。3makerun_inram0norflashrun_inram.bin,由于經過會自動把代碼copy到ram中,自動執(zhí)行內存操作,然后跳轉到ram中執(zhí)行,si版本的djyos沒有獨立的bootloader,可近似理解為si版本內含bootloader的部分功能。本命令產生run_inflash.bin文件,與run_inram命令相似,唯一不同的是,本生成的可執(zhí)行文件不把代碼copyram中,而是直接在flash中運行,適合于在ram很少的單片機中使用。5makeclean何時應該使用make不會重編譯。比如兩次編譯間,a.ca.ca.oa.o就不會被重新編譯,但有時候,我們不希望這種“查新”機制起作用,就要用makeclean命令把目標文件刪掉,強制重新編譯。原理上講,如果依賴關系做得好,頭文件也成為.o文件的依賴文件的話,頭文件修改后,編譯c源文件的依賴關系很復雜,并且在編程過程中會有調整,要完全描述這種依賴關系變得很,且makefile會很復雜難讀。因此,djyos的makefile不描述頭文件和C文件的依賴關系,故在修改頭文件后,需要執(zhí)行makeclean命令刪掉所有.o文件,強迫重新生成所有.o文件。makedebug編譯調試版本makerun_inramdebug時,已經產生了.o文件,而.c文件又沒有修會重是直debug時產生的.o文件重run_inramdebug的發(fā)布源代碼時,實際上只希望發(fā)布源代碼文件和.binmakeclean刪掉其他編譯產------------------------如果你只是想知道如何編 djyos,到此為止--------------------------修改總控makefile在工程下,比如工程是myprj,則myprj下的makefile文件就是總控makefile文件了。djyos被移植到新的cpu,或者改變指令集(由ARM改為thumb),或者改變器大小端時,makefilemakefile中這些內容都用變量表示,makefile總共只有幾十行,絕大部分在移植時是無需修改的,即使上述幾個方面同時需要調整,需要修改的也不超過10行。一般情況下只需要修改:CPUarm7tdmi \trom :org= len=\tram :org= len= 添加和修改子工程中添加子或者源程序文件時,就需要添加子makefile,當改名、刪除子或者源程subdir=rom_init=preload=sysload=critical=雙引號,行末也沒有分號或其他符號,比如在driver下有兩個包含源程序文件的子:uart、和flash_chip,則driver下的makefile中subdir的值就這樣描述:subdir=uart subdir=uartflash_chiptty下也要添加makefile,只要從其他copy一個過來,再修改前述幾個變量的值添加和刪除以及改名源文件的方法相當簡單,就是修改相應下的makefile中的boot_rom、rom_init、preload、sysload、critical中的一個或幾個變量。---------------如果你不打算分析djyos的makefile實現方法,就此止步吧makefile在工程下,比如工程是myprj,則myprj下的makefile文件就makefilemakefilemakefilemake_ld文件,為什么要分成兩個呢?是為了實現自動化生成連接文件,待介紹make_ld文件的時候再仔細說明。下面開始介紹makefile的各部分代碼,斜體部分是從makefile文件中copy的代碼。變Cmakefile的變量。其實這兩者的差別非常之大,C語言的變量是一個地址makefile的變量就是字由空格分開的連續(xù)的字符構成一個單詞。makefile有許多方法處理變量,實際上處理的是字符串。makefile中,這些字符串不需要用雙引號。1exporttopdir=$(s 路徑名字符串。exporttopdir=$(spwd)的含義是,利用操作系統(tǒng)的s命令取當 ,由于總控makefile在工程根 的路徑名,賦值給topdir。export的含義是使topdir在子makefile中可見,注意,在子makefile中,topdir的值仍然是工程根目2MCUarm7tdmi3sub_makeexportsub_make=@make--no-print-@的含義是不在屏幕上輸出本行命令,--no-print-directory是不輸出進入和離開某子 這兩者的使用使得屏幕輸出比較簡潔,當調試makefile時,可打開這兩類輸出,幫助定位錯誤。45、其他變量 AS:匯編器名,gcc中匯編器和c編譯器都使用arm-elf-gcc。 生成目1rm_obj_list刪除編譯子中產生的ld_obj_list文件,這是一個臨時文件,如果上一次的編譯過程成功完2、 中間目顧名思義,這個目標是進入子,執(zhí)行子下的編譯任務,在子的makefile中,又以同樣令執(zhí)行子子的編譯任務,就這樣一級級嵌套,直到所有子下的變異任務全部完成。$(subdir)$(sub_make)-C$@ 命令,$(subdir)subdir變量展開,$@makefile中比較晦澀難懂的符號,意思是$(subdir)$(sub_make)-C$@$(sub_make)–Capp$(MAKECMDGOALS)$(sub_make–Cdjyos$(MAKECMDGOALS)3、最終目標debug\run_inram\run_inflashboot_rom:rm_obj_list$(sub_make)-fmake_ld自動生成連接ld文編譯產生的是可重定位的目標文件,目標文件中不包含地址信息,需要經過連接后才能生成真正可執(zhí)行的文件。連接文件就是告訴器如何連接目標文件的文件,不同的編譯系統(tǒng)對1、器描述,描寫系統(tǒng)中的器配置,比如44b0版本的ld文件的器描述如下:{rom(rx) :org=0, len=2Mram :org= len=}norflash;第二塊是可讀寫和執(zhí)行的,起始地址為0xc000000,長度8M,對應sdram。3、輸出可供連接器識別的符號,比如djyos的器管理模塊就需要cfg_heap_topmakefile中,用這幾個變量:boot_rom、rom_init、preload、sysload、critical表示具體文件成方法和變量含義參見子makefile的說明。rom_init_obj+=preload_obj+=際上是makefile文件的一部分,由make_ld文件用:ifneq($(target),)包含進來的,5debug、run_inram、run_inflash、boot_rom5個*.mld文件,該文件對應5個用于描述5個最終目標的連接文件。*.mld文件非常簡單,就是用1條s內置函數printf生成*.ld文件,并把輸出轉向保存到*.ld文件中。連接生成可執(zhí)行文件$(sub_make)-fmake_ld$(sub_make)-fmake_ldincludeld_obj_listifneq($(target),)includeld_obj_listifneq($(target),)debug$(objcopy)$(target).elfrm-fld_obj_list$(objcopy)$(objcopy)$(target).elfrm-fld_obj_list$(CC)$(LDFLAGS)$(rom_init_obj)$(preload_obj)$(critical_obj)$(sysload_obj)-o-$(objcopy)$(target).elfrm-fld_obj_list$(CC)$(LDFLAGS)$(rom_init_obj)$(preload_obj)$(critical_obj)$(sysload_obj)-o-$(objcopy)$(target).elfrm-fld_obj_listmake_ld$(sub_make)-fmake_ld$(CC)本文件,除了一個目標后連續(xù)出現令是按順序執(zhí)行的外,其他的一切,比如變量,include等,a= c=c= a=$(sub_make)-C$@時自動就要確保實includeld_obj_list必須在生成$(subdir)makefile和而現在的做法,最終目標依賴$(subdir),可以確保在完成$(subdir)目標之后$(sub_make)-fmake_ld 所有子makefile文件中,第10行開始是雷同的,本想在工程根 下用mksubinc文件描述雷同部分,然后在子makefile中用:includemakefile:11:/cygdrive/g/siyf/mksubinc:Nosuchfileor源文件和下 描 currentdir=$(spwd)subdir=appdjyosrom_init=preload=sysload=critical=12 下,有app和 ,而 3 4rom初始化部分代碼,這些代碼在復位后在rom中執(zhí)行,除非你打算利用MMU重映射ram5些代碼由rom_init中的預加載器copyram中,然后把控制權交給預加載器。67生成中間變量ifneqboot_rom_asm=$(filter%.s,$(boot_rom))boot_rom_asmobj=$(patsubst boot_rom_c=$(filter%.c,$(boot_rom)) boot_rom_obj=$(patsubst 推導出boot_rom_asmobj、boot_rom_cobj、boot_rom_obj三個中間目標變量,boot_rom_asmobjrom_init、preload、sysload、critical這5個變量。填寫ld_obj_list文件@printf"rom_init_obj+=$(rom_init_obj)\n\boot_rom_obj+=$(boot_rom_obj)\n\criti

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論