視頻配套的和程序匯總里寫代碼都放在這里mdk6htm_第1頁
視頻配套的和程序匯總里寫代碼都放在這里mdk6htm_第2頁
視頻配套的和程序匯總里寫代碼都放在這里mdk6htm_第3頁
視頻配套的和程序匯總里寫代碼都放在這里mdk6htm_第4頁
視頻配套的和程序匯總里寫代碼都放在這里mdk6htm_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、MDK的編譯過程及文件類型全解零死角玩轉STM32淘寶: 論壇: 掃描進入淘寶店鋪主講內容01編譯過程03編譯工具鏈04MDK工程的文件類型02程序的組成、存儲與運行05實驗:自動分配變量到外部SRAM06實驗:優先使用內部SRAM并 分配堆到外部SRAMMDK的編譯過程及文件類型全解5.hex文件及bin文件若編譯過程無誤,即可把工程生成前面對應的*.axf文件,而在MDK中使用下載器(DAP/JLINK/ULINK等)下載程序或仿真的時候,MDK調用的就是*.axf文件,它解釋該文件,然后控制下載器把*.axf中的代碼內容下載到STM32芯片對應的存儲空間,然后復位后芯片就開始執行代碼了。

2、然而,脫離了MDK或IAR等工具,下載器就無法直接使用*.axf文件下載代碼了,它們一般僅支持hex和bin格式的代碼數據文件。默認情況下MDK都不會生成hex及bin文件,需要配置工程選項或使用fromelf命令。MDK的編譯過程及文件類型全解生成hex文件生成hex文件的配置比較簡單,在“Options for Target-Output-Create Hex File”中勾選該選項,然后編譯工程即可:MDK的編譯過程及文件類型全解生成bin文件使用MDK生成bin文件需要使用fromelf命令,在MDK的“Options For Target-Users”中加入命令:“fromelf -

3、bin -output .Output多彩流水燈.bin .Output多彩流水燈.axf”MDK的編譯過程及文件類型全解生成bin文件該指令是根據本機及工程的配置而寫的,在不同的系統環境或不同的工程中,指令內容都不一樣,需要理解它,才能為自己的工程定制指令,首先看看fromelf的幫助:MDK的編譯過程及文件類型全解生成bin文件fromelf需要根據工程的*.axf文件輸入來轉換得到bin文件,所以在命令的輸入文件參數中要選擇本工程對應的*.axf文件,在MDK命令輸入欄中,我們把fromelf指令放置在“After Build/Rebuild”(工程構建完成后執行)一欄也是基于這個考慮,

4、這樣設置后,工程構建完成生成了最新的*.axf文件,MDK再執行fromelf指令,從而得到最新的bin文件。置完成生成hex的選項或添加了生成bin的用戶指令后,點擊工程的編譯(build)按鈕,重新編譯工程,成功后可看到如下輸出,打開相應的目錄即可找到文件。MDK的編譯過程及文件類型全解hex文件格式hex是Intel公司制定的一種使用ASCII文本記錄機器碼或常量數據的文件格式,這種文件常常用來記錄將要存儲到ROM中的數據,絕大多數下載器支持該格式。一個hex文件由多條記錄組成,而每條記錄由五個部分組成,格式形如“:llaaaattddcc”,例如本“多彩流水燈”工程生成的hex文件前幾

5、條記錄:MDK的編譯過程及文件類型全解hex文件格式記錄的各個部分介紹如下:“:” :每條記錄的開頭都使用冒號來表示一條記錄的開始;ll :以16進制數表示這條記錄的主體數據區的長度(即后面dd的長度);aaaa:表示這條記錄中的內容應存放到FLASH中的起始地址;tt:表示這條記錄的類型,它包含中的各種類型;tt的值代表的類型00數據記錄01本文件結束記錄02擴展地址記錄04擴展線性地址記錄(表示后面的記錄按個這地址遞增)05表示一個線性地址記錄的起始(只適用于ARM)MDK的編譯過程及文件類型全解hex文件格式dd:表示一個字節的數據,一條記錄中可以有多個字節數據,ll區表示了它有多少個字

6、節的數據;cc:表示本條記錄的校驗和,它是前面所有16進制數據 (除冒號外,兩個為一組)的和對256取模運算的結果的補碼。MDK的編譯過程及文件類型全解hex文件格式 : F202:表示這條記錄數據區的長度為2字節;0000:表示這條記錄要存儲到的地址;04:表示這是一條擴展線性地址記錄;0800:由于這是一條擴展線性地址記錄,所以這部分表示地址的高16位,與前面的“0000”結合在一起,表示要擴展的線性地址為“0 x0800 0000”,這正好是STM32內部FLASH的首地址;F2:表示校驗和,它的值為(0 x02+0 x00+0 x00+0 x04+0 x08+0 x00)%256的值再

7、取補碼。再來看第二條記錄: : 01000829030008BF0200088110:表示這條記錄數據區的長度為16字節;0000:表示這條記錄所在的地址,與前面的擴展記錄結合,表示這條記錄要存儲的FLASH首地址為(0 x0800 0000+0 x0000);00:表示這是一條數據記錄,數據區的是地址;000 008BF020008:這是要按地址存儲的數據;81:校驗和MDK的編譯過程及文件類型全解hex、bin及axf文件的區別與聯系bin、hex及axf文件都包含了指令代碼,但它們的信息豐富程度是不一樣的。bin文件是最直接的代碼映像,它記錄的內容就是要存儲到FLASH的二進制數據(機器

8、碼本質上就是二進制數據),在FLASH中是什么形式它就是什么形式,沒有任何輔助信息,包括大小端格式也沒有,因此下載器需要有針對芯片FLASH平臺的輔助文件才能正常下載(一般下載器程序會有匹配的這些信息);hex文件是一種使用十六進制符號表示的代碼記錄,記錄了代碼應該存儲到FLASH的哪個地址,下載器可以根據這些信息輔助下載;axf文件在前文已經解釋,它不僅包含代碼數據,還包含了工程的各種信息,因此它也是三個文件中最大的。MDK的編譯過程及文件類型全解hex、bin及axf文件的區別與聯系在“多彩流水燈_axf_elfInfo_c.txt”文件中不僅可以看到代碼數據,還有具體的標號、地址以及反匯

9、編得到的代碼,雖然它不是*.axf文件的原始內容,但因為它是通過*.axf文件fromelf工具生成的,我們可認為*.axf文件本身記錄了大量這些信息,它的內容非常豐富,熟悉匯編語言的人可輕松閱讀。在hex文件中包含了地址信息以及地址中的內容,而在bin文件中僅包含了內容,連存儲的地址信息都沒有。觀察可知,bin、hex及axf文件中的數據內容都是相同的,它們存儲的都是機器碼。這就是它們三都之間的區別與聯系。MDK的編譯過程及文件類型全解hex、bin及axf文件的區別與聯系根據axf文件的GPIO_Init函數的機器碼,在bin及hex中找到的對應位置。所以經驗豐富的人是有可能從bin或he

10、x文件中恢復出匯編代碼的,只是成本較高,但不是不可能。MDK的編譯過程及文件類型全解hex、bin及axf文件的區別與聯系如果芯片沒有做任何加密措施,使用下載器可以直接從芯片讀回它存儲在FLASH中的數據,從而得到bin映像文件,根據芯片型號還原出部分代碼即可進行修改,甚至不用修改代碼,直接根據目標產品的硬件PCB,抄出一樣的板子,再把bin映像下載芯片,直接山寨出目標產品,所以在實際的生產中,一定要注意做好加密措施。由于axf文件中含有大量的信息,且直接使用fromelf即可反匯編代碼,所以更不要隨便泄露axf文件。lib文件也能反使用fromelf文件反匯編代碼,不過它不能還原出C代碼,由于lib文件的主要目的是為了保護C源代碼,也算是達到了它的要求。MDK的編譯過程及文件類型全解6.htm靜態調用圖文件在Output目錄下,有一個以工程文件命名的后綴為*.bulid_log.htm及*.htm文件,如“多彩流水燈.bulid_log.htm”及“多彩流

溫馨提示

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

評論

0/150

提交評論