當(dāng)前位置:首頁 > 公眾號精選 > 痞子衡嵌入式
[導(dǎo)讀]程序函數(shù)庫是一個包含已經(jīng)編譯好代碼和數(shù)據(jù)的函數(shù)集合,這個庫文件里的函數(shù)可以供其他程序調(diào)用。被放進庫文件里的代碼通常具有一定通用性,是經(jīng)過高度抽象的,這樣可以避免重復(fù)造輪子。程序函數(shù)庫設(shè)計可以使得程序的開發(fā)工作更加模塊化,更容易重新編譯,也更方便升級。


大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下將源碼制作成Lib庫方法及其與IAR,MDK差異

程序函數(shù)庫是一個包含已經(jīng)編譯好代碼和數(shù)據(jù)的函數(shù)集合,這個庫文件里的函數(shù)可以供其他程序調(diào)用。被放進庫文件里的代碼通常具有一定通用性,是經(jīng)過高度抽象的,這樣可以避免重復(fù)造輪子。程序函數(shù)庫設(shè)計可以使得程序的開發(fā)工作更加模塊化,更容易重新編譯,也更方便升級。

嵌入式開發(fā)里有時候也會需要涉及函數(shù)庫文件,除了模塊化開發(fā)以及方便升級特點外,有時候也是為了對源代碼進行保密,畢竟庫文件是編譯后的文件。今天痞子衡就跟大家聊聊 MCUXpresso IDE 下生成 Lib 庫文件的方法及其與 IAR, MDK 有何差異。

  • Note: 痞子衡測試的MCUXpresso IDE版本是v11.4.0_6224。

一、其它IDE下制作Lib庫的方法

我們先來看看其它 IDE 下是如何生成和使用 Lib 庫文件的。我們以 \SDK_2.10.0_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\hello_world\cm7 目錄下的工程文件為例。這個 hello_world 例程主要就是利用 LPUART 外設(shè)驅(qū)動( fsl_lpuart.c )實現(xiàn)串口打印功能,這里我們就嘗試將 fsl_lpuart.c 文件制作成 Lib 庫(這里特指靜態(tài)鏈接庫 - Static Library)。

1.1 IAR EWARM下

使用 IAR 打開 hello_world_demo_cm7.eww 文件,編譯默認工程可以得到工程可執(zhí)行文件和鏡像文件,這是經(jīng)過編譯和鏈接之后的可直接執(zhí)行的純機器碼數(shù)據(jù)。由于我們只需要將 fsl_lpuart.c 文件制作成 Lib 庫,所以要對工程進行一些改動:

1. 將工程里除 fsl_lpuart.c 之外的其它 .c 文件全部移除,并且僅需保留 fsl_lpuart.c 所依賴的相關(guān)頭文件。
2. 在工程選項 General Options / Output / Output file 里切換到 Library。
3. 在工程選項 Library Builder / Output / Output file 里命名生成的庫文件(比如 lpuart_drv.a )。

這時候重新編譯工程便可以得到我們想要的 lpuart_drv.a 庫文件,如果要使用這個庫文件的話,也非常簡單,只要在原始的 hello_world 工程里將 fsl_lpuart.c 文件替換成 lpuart_drv.a 即可。

1.2 Keil MDK下

MDK 下制作和使用 Lib 庫方法與 IAR 差不多,就是工程設(shè)置差異。使用 MDK 打開 hello_world_demo_cm7.uvprojx 文件,同樣對工程進行一些改動:

1. 將工程里除 fsl_lpuart.c 之外的其它 .c 文件全部移除,并且僅需保留 fsl_lpuart.c 所依賴的相關(guān)頭文件。
2. 在工程選項 Output / 里切換到 Create Library。
3. 在工程選項 Output / Name of Executable 里命名生成的庫文件(比如 lpuart_drv.lib )。

二、MCUXpresso IDE下制作Lib庫的方法

了解了 IAR, MDK 下制作和使用 Lib 庫方法,我們再來看本文的主角 MCUXpresso IDE 下制作 Lib 庫的方法。首先是按照 《MCUXpresso IDE下SDK工程導(dǎo)入與workspace管理機制》 一文導(dǎo)入一個 hello_world 工程,在導(dǎo)入向?qū)Ы缑?,我們能看?SDK 里的例程類型是 C Project,旁邊雖然有 C Static Library 選項,但是不可設(shè)置。

我們先使用 SDK 包里導(dǎo)出的默認工程(C Project),按照之前 IAR, MDK 上的經(jīng)驗,在這個工程里做如下改動。重新編譯工程,發(fā)現(xiàn)生成的文件似乎跟原始工程生成的可執(zhí)行文件(Artifact Type 為 Executable )差不多,顯然  Shared Library 并不是我們想要的靜態(tài) Lib 庫。

1. 將工程里除 fsl_lpuart.c 之外的其它 .c 文件全部移除,并且僅需保留 fsl_lpuart.c 所依賴的相關(guān)頭文件。
2. 在工程選項 C/C++ Build / Settings / Build Artifact / Artifact Type 里切換到 Shared Library。
3. 在工程選項 C/C++ Build / Settings / Tool Settings / MCU Linker / Shared Library Settings 里 Shared 選項勾選上。

那么 MCUXpresso IDE 下如何生成靜態(tài) Lib 庫呢?很遺憾,你必須在新建工程之初就確定工程類型為 C Static Library,工程類型確定之后無法僅通過工程選項來切換 C Project 和 C Static Library (這是和 IAR, MDK 不一樣的第一個地方)。在創(chuàng)建 C Static Library 時盡量在向?qū)Ю飳⒍嘤嗟脑次募x項全部去掉,僅保留我們感興趣的 lpuart 驅(qū)動。

新建了 C Static Library 工程后發(fā)現(xiàn)工程里還是殘留了多余的 .c 文件(Debug Console 和 device 初始化相關(guān)文件),這時候再手動移除這些 .c 文件,然后打開工程選項 C/C++ Build / Settings / Build Artifact / Artifact Type,此時僅有 Static Library 一種選擇。編譯工程可得到 liblpuart_drv.a 文件(MCUXpresso IDE 特意在用戶設(shè)置的庫名加了 lib 前綴,這是刻意設(shè)計的,后面使用該庫文件時會用到這個設(shè)計),即是我們需要的靜態(tài) Lib 庫文件。

回到官方 SDK 包里原始的 hello world 例程里,此時我們嘗試使用這個 liblpuart_drv.a 文件,我們將工程目錄下的 fsl_lpuart.c 文件替換成 liblpuart_drv.a 文件,直接編譯發(fā)現(xiàn)報錯,無法找到 LPUART 相關(guān)驅(qū)動,顯然工程并沒有直接識別庫文件(這是跟 IAR, MDK 不一樣的第二個地方),這時候需要更新下工程選項,在 C/C++ Build / Settings / Tool Settings / MCU Linker / Libraries 里添加 liblpuart_drv.a 庫(包括名字和路徑),這里特別注意庫名字僅需要填 lpuart_drv,不需要 lib 前綴(這就是前面所說的 MCUXpresso IDE 特意設(shè)計)。此時再編譯工程,就一切正常了。

三、靜態(tài)鏈接庫和共享鏈接庫差異

在 MCUXpresso IDE 下我們接觸到了兩種庫 Static Library 和 Shared Library,最后再簡單介紹下它倆的差異。

靜態(tài)庫是一些 .o 目標(biāo)文件的集合,一般以 .a/.lib 形式結(jié)尾。靜態(tài)庫在程序鏈接階段使用,鏈接器將程序要用到的函數(shù)從庫中提取出來,并整合到程序中,程序運行不再使用靜態(tài)庫了。由于每個程序要用到函數(shù)都從庫提取并整合在一起,所以可執(zhí)行文件會比較大。

共享庫即動態(tài)鏈接庫,在 Linux 中以 .so(share object) 為后綴,在 Windows 中以 .dll 為后綴。程序開始啟動運行時,加載所需的函數(shù),程序運行時也需要共享庫的支持。共享庫鏈接出來的文件比靜態(tài)庫要小得多。

所以這其實就是鏈接方式的差異,鏈接(Link)是程序被裝載到內(nèi)存運行之前需要完成的一個步驟。鏈接本身分為靜態(tài)鏈接(Static Link)和動態(tài)鏈接(Dynamic Link)兩種方式。而在嵌入式 MCU 世界里,我們通常都是用靜態(tài)鏈接這種方式。

至此,MCUXpresso IDE下將源碼制作成Lib庫方法及其與IAR,MDK差異痞子衡便介紹完畢了,掌聲在哪里~~~


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉