痞子衡嵌入式:MCUXpresso IDE下將源碼製作成Lib庫方法及其與IAR,MDK差異

来源:https://www.cnblogs.com/henjay724/archive/2022/07/24/16515742.html
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下將源碼製作成Lib庫方法及其與IAR,MDK差異。 程式函數庫是一個包含已經編譯好代碼和數據的函數集合,這個庫文件里的函數可以供其他程式調用。被放進庫文件里的代碼通常具有一定通用性,是經過高度抽象的,這樣可 ...



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

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

  嵌入式開發里有時候也會需要涉及函數庫文件,除了模塊化開發以及方便升級特點外,有時候也是為了對源代碼進行保密,畢竟庫文件是編譯後的文件。今天痞子衡就跟大家聊聊 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 外設驅動( fsl_lpuart.c )實現串口列印功能,這裡我們就嘗試將 fsl_lpuart.c 文件製作成 Lib 庫(這裡特指靜態鏈接庫 - Static Library)。

1.1 IAR EWARM下

  使用 IAR 打開 hello_world_demo_cm7.eww 文件,編譯預設工程可以得到工程可執行文件和鏡像文件,這是經過編譯和鏈接之後的可直接執行的純機器碼數據。由於我們只需要將 fsl_lpuart.c 文件製作成 Lib 庫,所以要對工程進行一些改動:

1. 將工程里除 fsl_lpuart.c 之外的其它 .c 文件全部移除,並且僅需保留 fsl_lpuart.c 所依賴的相關頭文件。
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 差不多,就是工程設置差異。使用 MDK 打開 hello_world_demo_cm7.uvprojx 文件,同樣對工程進行一些改動:

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

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

  瞭解了 IAR, MDK 下製作和使用 Lib 庫方法,我們再來看本文的主角 MCUXpresso IDE 下製作 Lib 庫的方法。首先是按照 《MCUXpresso IDE下SDK工程導入與workspace管理機制》 一文導入一個 hello_world 工程,在導入嚮導界面,我們能看到 SDK 里的常式類型是 C Project,旁邊雖然有 C Static Library 選項,但是不可設置。

  我們先使用 SDK 包里導出的預設工程(C Project),按照之前 IAR, MDK 上的經驗,在這個工程里做如下改動。重新編譯工程,發現生成的文件似乎跟原始工程生成的可執行文件(Artifact Type 為 Executable )差不多,顯然 Shared Library 並不是我們想要的靜態 Lib 庫。

1. 將工程里除 fsl_lpuart.c 之外的其它 .c 文件全部移除,並且僅需保留 fsl_lpuart.c 所依賴的相關頭文件。
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 下如何生成靜態 Lib 庫呢?很遺憾,你必須在新建工程之初就確定工程類型為 C Static Library,工程類型確定之後無法僅通過工程選項來切換 C Project 和 C Static Library (這是和 IAR, MDK 不一樣的第一個地方)。在創建 C Static Library 時儘量在嚮導里將多餘的源文件選項全部去掉,僅保留我們感興趣的 lpuart 驅動。

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

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

三、靜態鏈接庫和共用鏈接庫差異

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

  靜態庫是一些 .o 目標文件的集合,一般以 .a/.lib 形式結尾。靜態庫在程式鏈接階段使用,鏈接器將程式要用到的函數從庫中提取出來,並整合到程式中,程式運行不再使用靜態庫了。由於每個程式要用到函數都從庫提取並整合在一起,所以可執行文件會比較大。

  共用庫即動態鏈接庫,在 Linux 中以 .so(share object) 為尾碼,在 Windows 中以 .dll 為尾碼。程式開始啟動運行時,載入所需的函數,程式運行時也需要共用庫的支持。共用庫鏈接出來的文件比靜態庫要小得多。

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

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

歡迎訂閱

文章會同時發佈到我的 博客園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下麵二維碼,就可以在手機上第一時間看了哦。

  最後歡迎關註痞子衡個人微信公眾號【痞子衡嵌入式】,一個專註嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。

痞子衡嵌入式-微信二維碼 痞子衡嵌入式-微信收款二維碼 痞子衡嵌入式-支付寶收款二維碼

  衡傑(痞子衡),目前就職於恩智浦MCU系統部門,擔任嵌入式系統應用工程師。

  專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]

  可以關註痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。

  關於專欄文章有任何疑問請直接在博客下麵留言,痞子衡會及時回覆免費(劃重點)答疑。

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 消息分區策略 這裡不是說Kafka的主題為什麼要分區,而是說在分區的結構下,如何讓具有某種特點的消息發送到特定分區。 這裡有一個很明顯的問題,就是主題分區,那麼生產者發送的消息到底被髮送到了哪個分區呢?一般我們都知道有輪詢機制或者是隨機機制,這兩種機制都比較好理解。而且Kafka也都支持,在新版本中 ...
  • 主題、分區與副本 基本概念 主題、分區和副本的關係 主題是一個邏輯概念,代表了一類消息,實際工作中我們使用主題來區分業務,而主題之下並不是消息,而是分區,分區是一個物理概念,它是磁碟上的一個目錄,目錄中是保存消息的日誌段文件。分區的目的是為了提高吞吐量,實現主題的負載均衡,一個主題至少有一個分區;而 ...
  • 每天一句小詩詞 陽明四句:無善無噁心之體,有善有惡意之動,知善知惡是良知,為善去惡是格物。 今天教大家用Python做一個英漢翻譯小字典,輸入英文,返回對應中文。 二、知識點 文件讀寫 基礎語法 異常處理 迴圈語句 字元串處理 三、代碼展示 導入模塊 import platform # 我還給大家準 ...
  • Python Json使用 本篇主要介紹一下 python 中 json的使用 如何把 dict轉成json 、object 轉成json 、以及json轉成對象 等等。。 json是非常常用的一種數據格式,比如在前後端分離的 web開發中,返回給前端 通常都會使用json ,那麼來看看 pytho ...
  • C++語言中有一些多義詞,例如表示靜態的關鍵字static,將static應用在變數、函數或類成員等不同場合,它所表達的含義不一樣。源程式中相同的程式元素可能會具有不同的語法解釋,C++語言稱這些程式元素具有多態性。C++語言有多種不同的多態形式,常見的有關鍵字多態、重載函數多態、運算符多態、對象多 ...
  • WPF佈局使用的是Panel族佈局控制項,它們均派生自Panel抽象類,主要用於控制UI佈局。 ...
  • 環境: vm 16.2 Windows 7 SP1 (來源i tell you) 在網上搜索了眾多帖子的解決辦法都無效後,我找到了官方的終極解決辦法 https://packages.vmware.com/tools/releases/index.html 訪問並下載,安裝 結束 如果是Linux ...
  • echo命令是Linux中最基礎和最常用的命令,特別是在Shell腳本經常用來列印輸出調試信息等,功能比較豐富,現來總結一下,方便後續查看。 1.基本語法 echo [參數] 字元串 主要參數解釋如下所示: | 參數 | 功能 | | | | | -e | 激活轉義字元 | | -n | 輸出不進行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...