女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

第三十章 MDK的編譯過程及文件類型

W55MH32 ? 來源:W55MH32 ? 作者:W55MH32 ? 2025-05-26 08:44 ? 次閱讀

單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網單片機

W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。

在封裝規格上,W55MH32 提供了兩種選擇:QFN100和QFN68。

W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復雜工控場景設計。它擁有66個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、5個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN、1個USB2.0以及1個SDIO接口。如此豐富的外設資源,能夠輕松應對工業控制中多樣化的連接需求,無論是與各類傳感器、執行器的通信,還是對復雜工業協議的支持,都能游刃有余,成為復雜工控領域的理想選擇。 同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網關模組等場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。

此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網絡通信安全再添保障。

為助力開發者快速上手與深入開發,基于W55MH32L這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。

若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。

wKgZPGgbOfaANhwzACodXd3sVzg463.png

第三十章 MDK的編譯過程及文件類型

相信您已經非常熟練地使用MDK創建應用程序了,平時使用MDK編寫源代碼,然后編譯生成機器碼,再把機器碼下載到STM32芯片上運行, 但是這個編譯、下載的過程MDK究竟做了什么工作?它編譯后生成的各種文件又有什么作用?本章節將對這些過程進行講解, 了解編譯及下載過程有助于理解芯片的工作原理,這些知識對制作IAP(bootloader)以及讀寫控制器內部FLASH的應用時非常重要。

1 編譯過程

首先我們簡單了解下MDK的編譯過程,它與其它編譯器的工作過程是類似的, 該過程見下圖:

wKgZPGgxLFmAQ3_bAALPmXrEsBU415.png

編譯過程生成的不同文件將在后面的小節詳細說明,此處先抓住主要流程來理解。

(1) 編譯,MDK軟件使用的編譯器是armcc和armasm, 它們根據每個c/c++匯編源文件編譯成對應的以“.o”為后綴名的對象文件(Object Code,也稱目標文件), 其內容主要是從源文件編譯得到的機器碼,包含了代碼、數據以及調試使用的信息;

(2) 鏈接, 鏈接器armlink把各個.o文件及庫文件鏈接成一個映像文件“.axf”或“.elf”;

(3) 格式轉換,一般來說Windows或Linux系統使用鏈接器直接生成可執行映像文件elf后,內核根據該文件的信息加載后, 就可以運行程序了,但在單片機平臺上,需要把該文件的內容加載到芯片上, 所以還需要對鏈接器生成的elf映像文件利用格式轉換器fromelf轉換成“.bin”或“.hex”文件,交給下載器下載到芯片的FLASH或ROM中。

2 程序的組成、存儲與運行

2.1 CODE、RO、RW、ZI Data域及堆棧空間

在工程的編譯提示輸出信息中有一個語句“Program Size:Code=xx RO-data=xx RW-data=xx ZI-data=xx”, 它說明了程序各個域的大小,編譯后,應用程序中所有具有同一性質的數據(包括代碼)被歸到一個域,程序在存儲或運行的時候, 不同的域會呈現不同的狀態,這些域的意義如下:

Code:即代碼域,它指的是編譯器生成的機器指令,這些內容被存儲到ROM區。

RO-data:Read Only data,即只讀數據域,它指程序中用到的只讀數據,這些數據被存儲在ROM區,因而程序不能修改其內容。 例如C語言中const關鍵字定義的變量就是典型的RO-data。

RW-data:Read Write data,即可讀寫數據域,它指初始化為“非0值”的可讀寫數據,程序剛運行時,這些數據具有非0的初始值, 且運行的時候它們會常駐在RAM區,因而應用程序可以修改其內容。例如C語言中使用定義的全局變量,且定義時賦予“非0值”給該變量進行初始化。

ZI-data:Zero Initialie data,即0初始化數據,它指初始化為“0值”的可讀寫數據域, 它與RW-data的區別是程序剛運行時這些數據初始值全都為0, 而后續運行過程與RW-data的性質一樣,它們也常駐在RAM區,因而應用程序可以更改其內容。例如C語言中使用定義的全局變量, 且定義時賦予“0值”給該變量進行初始化(若定義該變量時沒有賦予初始值,編譯器會把它當ZI-data來對待,初始化為0);

ZI-data的棧空間(Stack)及堆空間(Heap):在C語言中,函數內部定義的局部變量屬于棧空間,進入函數的時候從向棧空間申請內存給局部變量, 退出時釋放局部變量,歸還內存空間。而使用malloc動態分配的變量屬于堆空間。在程序中的棧空間和堆空間都是屬于ZI-data區域的, 這些空間都會被初始值化為0值。編譯器給出的ZI-data占用的空間值中包含了堆棧的大小(經實際測試,若程序中完全沒有使用malloc動態申請堆空間, 編譯器會優化,不把堆空間計算在內)。

綜上所述,以程序的組成構件為例,它們所屬的區域類別見下表:

程序組件 所屬類別
機器代碼指令 Code
常量 RO-data
初值非 0 的全局變量 RW-data
初值為 0 的全局變量 ZI-data
局部變量 ZI-data 棧空間
使用 malloc 動態分配的空間 ZI-data 堆空間

2.2 程序的存儲與運行

RW-data和ZI-data它們僅僅是初始值不一樣而已,為什么編譯器非要把它們區分開?這就涉及到程序的存儲狀態了,應用程序具有靜止狀態和運行狀態。 靜止態的程序被存儲在非易失存儲器中,如STM32的內部FLASH,因而系統掉電后也能正常保存。但是當程序在運行狀態的時候,程序常常需要修改一些暫存數據, 由于運行速度的要求,這些數據往往存放在內存中(RAM),掉電后這些數據會丟失。因此,程序在靜止與運行的時候它在存儲器中的表現是不一樣的, 見下圖:

wKgZO2gxLFmASwcEAAPGdXAbht4862.png

圖中的左側是應用程序的存儲狀態,右側是運行狀態,而上方是RAM存儲器區域,下方是ROM存儲器區域。

程序在存儲狀態時,RO節(RO section)及RW節都被保存在ROM區。當程序開始運行時,內核直接從ROM中讀取代碼,并且在執行主體代碼前, 會先執行一段加載代碼,它把RW節數據從ROM復制到RAM, 并且在RAM加入ZI節,ZI節的數據都被初始化為0。加載完后RAM區準備完畢,正式開始執行主體程序。

編譯生成的RW-data的數據屬于圖中的RW節,ZI-data的數據屬于圖中的ZI節。是否需要掉電保存,這就是把RW-data與ZI-data區別開來的原因, 因為在RAM創建數據的時候,默認值為0,但如果有的數據要求初值非0,那就需要使用ROM記錄該初始值,運行時再復制到RAM。

STM32的RO區域不需要加載到SRAM,內核直接從FLASH讀取指令運行。計算機系統的應用程序運行過程很類似,不過計算機系統的程序在存儲狀態時位于硬盤, 執行的時候甚至會把上述的RO區域(代碼、只讀數據)加載到內存,加快運行速度,還有虛擬內存管理單元(MMU)輔助加載數據, 使得可以運行比物理內存還大的應用程序。而STM32沒有MMU,所以無法支持Linux和Windows系統。

當程序存儲到STM32芯片的內部FLASH時(即ROM區),它占用的空間是Code、RO-data及RW-data的總和,所以如果這些內容比STM32芯片的FLASH空間大, 程序就無法被正常保存了。當程序在執行的時候,需要占用內部SRAM空間(即RAM區),占用的空間包括RW-data和ZI-data。 應用程序在各個狀態時各區域的組成見下表:

程序狀態與區域 組成
程序執行時的只讀區域 (RO) Code + RO data
程序執行時的可讀寫區域 (RW) RW data + ZI data
程序存儲時占用的 ROM 區 Code + RO data + RW data

在MDK中,我們建立的工程一般會選擇芯片型號,選擇后就有確定的FLASH及SRAM大小,若代碼超出了芯片的存儲器的極限, 編譯器會提示錯誤,這時就需要裁剪程序了,裁剪時可針對超出的區域來優化。

2.3編譯工具鏈

在前面編譯過程中,MDK調用了各種編譯工具,平時我們直接配置MDK,不需要學習如何使用它們,但了解它們是非常有好處的。例如, 若希望使用MDK編譯生成bin文件的,需要在MDK中輸入指令控制fromelf工具;在本章后面講解AXF及O文件的時候,需要利用fromelf工具查看其文件信息, 這都是無法直接通過MDK做到的。關于這些工具鏈的說明,在MDK的幫助手冊《ARM Development Tools》都有詳細講解, 點擊MDK界面的“help->uVision Help”菜單可打開該文件。

2.3.1armcc

armcc用于把c/c++文件編譯成ARM指令代碼,編譯后會輸出ELF格式的O文件(對象、目標文件),在命令行中輸入“armcc”回車可調用該工具, 它會打印幫助說明,見下圖,armcc的幫助提示:

wKgZO2gxLFiAPvQVAACllyC8K-o495.png

幫助提示中分三部分,第一部分是armcc版本信息,第二部分是命令的用法,第三部分是主要命令選項。

根據命令用法: armcc [options] file1 file2 …filen , 在[option]位置可輸入下面的“–arm”、“–cpu list”選項, 若選項帶文件輸入,則把文件名填充在file1 file2…的位置,這些文件一般是c/c++文件。

例如根據它的幫助說明,“–cpu list”可列出編譯器支持的所有cpu,我們在命令行中輸入“armcc –cpu list”, 可查看圖中的cpu列表:

wKgZPGgxLFiAHfO9AABwTqSdhRc236.png

打開MDK的Options for Targe->c/c++菜單,可看到MDK對編譯器的控制命令, 見下圖,MDK的ARMCC編譯選項:

wKgZO2gxLFiAT7ZIAABjFZ4fPWg446.png

從該圖中的命令可看到,它調用了-c、-cpu –D –g –O1等編譯選項,當我們修改MDK的編譯配置時,可看到該控制命令也會有相應的變化。 然而我們無法在該編譯選項框中輸入命令,只能通過MDK提供的選項修改。

了解這些,我們就可以查詢具體的MDK編譯選項的具體信息了,如c/c++選項中的“Optimization:Leve 1(-O1)”是什么功能呢? 首先可了解到它是“-O”命令,命令后還帶個數字,查看MDK的幫助手冊,在armcc編譯器說明章節, 可詳細了解,如下圖,編譯器選項說明:

wKgZPGgxLFiAeTuVAAEnjsGxrxs294.png

利用MDK,我們一般不需要自己調用armcc工具,但經過這樣的過程我們就會對MDK有更深入的認識,面對它的各種編譯選項,就不會那么頭疼了。

2.3.2 armasm

armasm是匯編器,它把匯編文件編譯成O文件。與armcc類似, MDK對armasm的調用選項可在“Option for Target->Asm”頁面進行配置, 見下圖,armasm與MDK的編譯選項:

wKgZO2gxLFiAAtiJAABWioCqcsk136.pngwKgZO2gxLFiAT7ZIAABjFZ4fPWg446.png

2.3.3 armlink

armlink是鏈接器,它把各個O文件鏈接組合在一起生成ELF格式的AXF文件,AXF文件是可執行的,下載器把該文件中的指令代碼下載到芯片后, 該芯片就能運行程序了;利用armlink還可以控制程序存儲到指定的ROM或RAM地址。 在MDK中可在“Option for Target->Linker”頁面配置armlink選項, 見下圖,armlink與MDK的配置選項:

wKgZO2gxLFiARut8AABgSyqMDkc481.pngwKgZPGgxLFiADMGJAABg50w07Z0450.png

鏈接器默認是根據芯片類型的存儲器分布來生成程序的,該存儲器分布被記錄在工程里的sct后綴的文件中,有特殊需要的話可自行編輯該文件, 改變鏈接器的鏈接方式,具體后面我們會詳細講解。

2.3.4 armar、fromelf及用戶指令

armar工具用于把工程打包成庫文件,fromelf可根據axf文件生成hex、bin文件,hex和bin文件是大多數下載器支持的下載文件格式。

在MDK中,針對armar和fromelf工具的選項幾乎沒有,僅集成了生成HEX或Lib的選項, 見下圖,控制fromelf生成hex及控制armar生成lib的配置:

wKgZPGgxLFiARPx2AABMa4UVCSc909.png

例如如果我們想利用fromelf生成bin文件,可以在MDK的“Option for Target->User”頁中添加調用fromelf的指令, 見下圖,在MDK中添加指令:

wKgZPGgxLFiAejvXAAB2h0wx6Xk163.png

在User配置頁面中,提供了三種類型的用戶指令輸入框,在不同組的框輸入指令, 可控制指令的執行時間,分別是編譯前(Before Compile c/c++ file)、 構建前(Before Build/Rebuild)及構建后(AfterBuild/Rebuild)執行。 這些指令并沒有限制必須是arm的編譯工具鏈,例如如果您自己編寫了python腳本, 也可以在這里輸入用戶指令執行該腳本。

圖中的生成bin文件指令調用了fromelf工具,緊跟后面的是工具的選項及輸出文件名、輸入文件名。由于fromelf是根據axf文件生成bin的, 而axf文件又是構建(build)工程后才生成,所以我們把該指令放到“After Build/Rebuild”一欄。

3.MDK工程的文件類型

除了上述編譯過程生成的文件,MDK工程中還包含了各種各樣的文件,下面我們統一介紹, MDK工程的常見文件類型見下表,MDK常見的文件類型:

后綴 說明
*.uvguix MDK5 工程的窗口布局文件,在 MDK4 中 *.UVGUI 后綴的文件功能相同
*.uvprojx MDK5 的工程文件,它使用了 XML 格式記錄了工程結構,雙擊它可以打開整個工程,在 MDK4 中 *.UVPROJ 后綴的文件功能相同
*.uvoptx MDK5 的工程配置選項,包含 debugger、trace configuration、breakpooints 以及當前打開的文件,在 MDK4 中 *.UVOPT 后綴的文件功能相同
*.ini 某些下載器的配置記錄文件
*.c C 語言源文件
*.cpp C++ 語言源文件
*.h C/C++ 的頭文件
*.s 匯編語言的源文件
*.inc 匯編語言的頭文件 (使用 “$include” 來包含)
*.lib 庫文件
*.dep 整個工程的依賴文件
*.d 描述了對應.o 的依賴的文件
*.crf 交叉引用文件,包含了瀏覽信息 (定義、引用及標識符)
*.o 可重定位的對象文件 (目標文件)
*.bin 二進制格式的映像文件,是純粹的 FLASH 映像,不含任何額外信息
*.hex Intel Hex 格式的映像文件,可理解為帶存儲地址描述格式的 bin 文件
*.elf 由 GCC 編譯生成的文件,功能跟 axf 文件一樣,該文件不可重定位
*.axf 由 ARMCC 編譯生成的可執行對象文件,可用于調試,該文件不可重定位
*.sct 鏈接器控制文件 (分散加載)
*.scr 鏈接器產生的分散加載文件
*.lnp MDK 生成的鏈接輸入文件,用于調用鏈接器時的命令輸入
*.htm 鏈接器生成的靜態調用圖文件
*.build_log.htm 構建工程的日志記錄文件
*.lst C 及匯編編譯器產生的列表文件
*.map 鏈接器生成的列表文件,包含存儲器映像分布
*.ini 仿真、下載器的腳本文件

這些文件主要分為MDK相關文件、源文件以及編譯、鏈接器生成的文件。我們以“多彩流水燈”工程為例講解各種文件的功能。

4 源文件

源文件是工程中我們最熟悉的內容了,它們就是我們編寫的各種源代碼,MDK支持c、cpp、h、s、inc類型的源代碼文件, 其中c、cpp分別是c/c++語言的源代碼,h是它們的頭文件,s是匯編文件,inc是匯編文件的頭文件,可使用“$include”語法包含。 編譯器根據工程中的源文件最終生成機器碼。

4.1 Output目錄下生成的文件

點擊MDK中的編譯按鈕,它會根據工程的配置及工程中的源文件輸出各種對象和列表文件, 在工程的“Options for Targe->Output->Select Folder for Objects”和 “Options for Targe->Listing->Select Folder for Listings”選項配置它們的輸出路徑, 見下圖,設置Output輸出路徑 和圖 設置Listing輸出路徑:

wKgZO2gzuLWANwrDAACJ7kNUX74251.pngwKgZO2gxLFiABnsBAACSbb5WxDQ677.png

4.2 lib庫文件

在某些場合下我們希望提供給第三方一個可用的代碼庫,但不希望對方看到源碼,這個時候我們就可以把工程生成lib文件(Library file)提供給對方, 在MDK中可配置“Options for Target->Create Library”選項把工程編譯成庫文件, 見下圖,生成庫文件或可執行文件:

wKgZO2gxLFiAWGsJAABQiVt2zbI772.png

工程中生成可執行文件或庫文件只能二選一,默認編譯是生成可執行文件的,可執行文件即我們下載到芯片上直接運行的機器碼。

得到生成的*.lib文件后,可把它像C文件一樣添加到其它工程中,并在該工程調用lib提供的函數接口, 除了不能看到*.lib文件的源碼,在應用方面它跟C源文件沒有區別。

4.3 dep、d依賴文件

*.dep和*.d文件(Dependency file)記錄的是工程或其它文件的依賴,主要記錄了引用的頭文件路徑,其中*.dep是整個工程的依賴, 它以工程名命名,而*.d是單個源文件的依賴,它們以對應的源文件名命名。這些記錄使用文本格式存儲,我們可直接使用記事本打開, 見下兩圖,工程的dep文件內容和bsp文件的內容:

wKgZO2gxLFiANnaiAADX0WYFgfI140.pngwKgZPGgxLFiAf8MFAAC-n3xUqo8121.png

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6063

    文章

    44915

    瀏覽量

    646778
  • 機器碼
    +關注

    關注

    0

    文章

    13

    瀏覽量

    8416
  • MDK
    MDK
    +關注

    關注

    4

    文章

    211

    瀏覽量

    32503
  • 編譯
    +關注

    關注

    0

    文章

    676

    瀏覽量

    33742
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Linux操作系統下常見文件類型分析

    Linux操作系統下常見文件類型分析,壓縮和打包文件,普通文件格式,系統文件
    發表于 01-06 17:00 ?1050次閱讀

    嵌入式Linux入門(二、Linux文件系統、文件類型及權限管理)

    嵌入式 Linux入 門第二課, linux 文件系統、文件類型及權限管理。 ...... 矜辰所致
    的頭像 發表于 06-20 11:44 ?2556次閱讀
    嵌入式Linux入門(二、Linux<b class='flag-5'>文件</b>系統、<b class='flag-5'>文件類型</b>及權限管理)

    詳解Linux的文件類型

    普通文件類型Linux中最多的一種文件類型, 包括 純文本文件(ASCII);二進制文件(binary);數據格式的文件(data);各種壓
    發表于 07-17 07:32

    「正點原子Linux連載」第三十章U-Boot使用實驗(一)

    本帖最后由 正點原子運營官 于 2020-3-9 14:41 編輯 「正點原子Linux連載」第三十章U-Boot使用實驗(一) 正點原子 2020-03-09 12:531)實驗平臺:正點
    發表于 03-09 14:39

    「正點原子NANO STM32F103開發板資料連載」第三十章 串口 IAP 實驗

    1)實驗平臺:【正點原子】 NANO STM32F103 開發板2)摘自《正點原子STM32 F1 開發指南(NANO 板-HAL 庫版)》關注官方微信號公眾號,獲取更多資料:正點原子第三十章 串口
    發表于 05-06 15:28

    Linux快速入門之文件類型文件屬性

    《嵌入式Linux應用程序開發詳解》第一 Linux 快速入門1.3.1 文件類型文件屬性1.文件類型1)普通文件2)目錄
    發表于 12-17 07:58

    第三十講 半導體存儲器

    第三十講 半導體存儲器 第9 半導體存儲器9.1 概述 9.2 只讀存儲器9.2.1固定ROM的結構和工作原理一
    發表于 03-30 16:36 ?1263次閱讀
    <b class='flag-5'>第三十</b>講 半導體存儲器

    模擬電路網絡課件 第三十節:反饋的基本概念

    模擬電路網絡課件 第三十節:反饋的基本概念 7.1 反饋的基本概念 一、什么是反饋 前面各章討
    發表于 09-17 11:47 ?915次閱讀

    C#教程之獲取文件類型

    C#教程之獲取文件類型,很好的C#資料,快來學習吧。
    發表于 04-20 09:59 ?4次下載

    詳解嵌入式linux文件類型

    學習嵌入式linux系統開發,對于linux文件類型需要有很深的理解。Linux文件類型常見的有普通文件、目錄文件、符號鏈接文件、管道
    發表于 06-11 16:29 ?1112次閱讀
    詳解嵌入式linux<b class='flag-5'>文件類型</b>

    學習嵌入式linux系統開發,文件類型一定要分清

    學習嵌入式linux系統開發,對于linux文件類型需要有很深的理解。Linux文件類型常見的有普通文件、目錄文件、符號鏈接文件、管道
    發表于 07-05 07:01 ?1020次閱讀

    Allegro中的文件類型后綴匯總

    Allegro根據不同性質功能的文件類型保存不同的文件后綴 allegro安裝后自帶的庫文件路徑是:C:/Cadence/SPB_15.5/share/PCB/PCB_lib/symbols(我
    發表于 04-25 15:44 ?7253次閱讀
    Allegro中的<b class='flag-5'>文件類型</b>后綴匯總

    嵌入式linux系統開發幾大文件類型

      同學們學習嵌入式linux系統開發的熱情日益旺盛,而對于linux文件類型需要有很深的理解。Linux文件類型有很多,常見的有普通文件、目錄文件、符號鏈接
    發表于 08-06 16:28 ?412次閱讀

    Linux中有哪些常見的文件類型

    本文檔的主要內容詳細介紹的是Linux中有哪些常見的文件類型
    發表于 10-12 18:02 ?0次下載

    你知道嵌入式linux文件類型

    學習嵌入式linux系統開發,對于linux文件類型需要有很深的理解。Linux文件類型常見的有普通文件、目錄文件、符號鏈接文件、管道
    發表于 05-04 17:09 ?852次閱讀
    你知道嵌入式linux<b class='flag-5'>文件類型</b>?