精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

在MCU上怎樣完成動態庫的制作和加載

strongerHuang ? 來源:工程師的廢紙簍 ? 作者:Tony Yang ? 2022-03-09 17:02 ? 次閱讀

作為一個嵌入式軟件攻城獅,提起庫首先會想到靜態庫和動態庫。靜態庫一般以.a為后綴,動態庫以.so為后綴(Win系統.DLL)。

poYBAGIobn6AO9DjAAA6pPX499U371.png

而作為一個單片機軟件攻城獅,也會經常用到各種靜態庫,常見的C庫有stdio,stdlib,string,time等,第三方庫也有CMSIS_DSP_Library,mbedtls,60730等等。為什么要使用這些庫呢?個人認為可能有以下幾個原因:

系統解耦,可以減少軟件模塊之間的耦合,使軟件結構更清晰。

加速編譯,有些庫源碼有非常多的源文件,如果使用源碼編譯會大大增加編譯時間。

保護知識產權,限定產品的使用范圍。比如NXP提供的電機算法庫rtcesl當然希望它運行在自己品牌MCU

MCU從產品實用角度上看,也是有動態庫的需求,比如下面幾種場景:

有些產品形態要求MCU的固件分為安全域和非安全域,安全域的邏輯一旦經過認證就無法進行升級,而非安全域的邏輯可以通過bootloader進行遠程或本地的升級。比如新規電表,計量部分屬于安全域不可更新,而其他固件則可以進行更新

90d538d8-9b7c-11ec-952b-dac502259ad0.jpg

有些軟件/算法公司并不提供實際的硬件產品,和終端客戶的合作模式如果按件收費,除非每個產品必須聯網認證,就像我們所用的Windows系統激活,否則很難把控。比較好的做法是,將算法編譯成二進制燒入芯片中,向終端客戶提供芯片。

90ebbe50-9b7c-11ec-952b-dac502259ad0.jpg

有些產品經常需要更新固件,受限于通訊速率,Flash大小的問題,希望可更新的固件越小越好。比如內置藍牙的MCU,其協議棧往往在100KB左右,如果通過源碼或者靜態庫的方式編譯,則升級的時候就必須將協議棧也一并升級,即使協議棧本身沒有任何修改,由于升級的固件比較大,所需要的更新時間也會非常長。如果通過動態庫的方式提供協議棧,就沒有這個問題。同時,如果客戶要求產品的固件能回退,則Flash必須能放兩份固件,如果應用代碼超過20K,則最終固件很容易超過128K(APP+BLE),如果使用靜態庫,則選型時必須使用超過256K的產品(APP+BLE)x2,而動態庫則可以使用256K以內的產品(APPx2+BLE)。用過Nordic藍牙MCU的應該都懂。

90fd66f0-9b7c-11ec-952b-dac502259ad0.jpg

今天我們就專門研究下如何在MCU上實現動態庫的制作和加載。

制作動態庫

首先我們先回憶下如何制作靜態庫,第三方的或者自己寫的靜態庫,一般由三部分組成:

poYBAGIobnGATYg5AAAtswS9XVo508.png

在MCU中制作的動態庫則需要如下幾部分內容:

pYYBAGIobmmAdntvAAAoV8Oe-rw421.png

至于具體如何實現,現在以之前介紹的開源PLC為例:

規劃內存,將MCU內部的Flash/RAM分出一部分留給庫,具體做法需要修改鏈接文件中的相關地址

pYYBAGIobl-AD6b-AAA22syThwQ328.png

定義函數指針列表結構體,用于提供給用戶程序調用:

poYBAGIobk2ACD9JAABMOVMhLJM686.png

初始化結構體,并實現函數原型:

pYYBAGIobkSAap75AAAy-2UA9f0984.png

poYBAGIobjiAB4rYAAAOoFGwU0M126.png

poYBAGIobiyAQNJ8AAAhcKh8-wk838.png

修改鏈接文件,將函數指針列表放到固定地址

poYBAGIobiGAS4_bAAAK9LZxTz8464.png

編譯并下載到MCU中

加載動態庫

生成動態庫后,用戶只需要知道函數指針列表的地址和結構體列表即可。使用過程如下:

在用戶工程中定義相同的結構體,并從固定地址中加載到

poYBAGIobhiAeBJlAAARIhl1CsU766.png

通過函數指針執行相應代碼即可

pYYBAGIobguAPUZ6AAAM3MhCJW4415.png

擴展知識

針對動態庫的應用場景2,簡單的賣芯片也只是防君子不防小人,因為終端客戶可以通過JTAG/SWD把動態庫讀出來,有些芯片雖然支持禁用JTAG/SWD使能ISP的方式下載,但用戶還是可以通過指針+地址的方式將庫從芯片中讀取出來,之后找芯片原廠克隆,針對這種攻擊,普通的MCU往往是無力應付的,大部分的軟件/算法公司是通過綁定加密芯片的方式來進行保護,但是除非加密芯片中有算法邏輯,否則這種保護也是徒勞的,因為不管是動態庫,還是靜態庫,攻擊者都可以通過反匯編看到關鍵的跳轉點,從而bypass驗證過程。

難道真的就沒有更好的防守么?目前知道有兩種方案:

NXP Kinetis系列產品在Flash中添加了FAC(Flash Access Control)功能,可以保證在可配置區域內只能被執行,而無法通過指針方式,DMA,JTAG/SWD,Ezport等接口獲取

910c7f6e-9b7c-11ec-952b-dac502259ad0.png

ARM Cortex-M33內核以及支持了TrustZone,可以將動態庫放置在Secure區域,并設置NSC訪問接口,具體做法和FAC類似

9121e8cc-9b7c-11ec-952b-dac502259ad0.png


審核編輯:郭婷

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

    關注

    146

    文章

    16667

    瀏覽量

    347805
  • 嵌入式
    +關注

    關注

    5046

    文章

    18821

    瀏覽量

    298586
收藏 人收藏

    評論

    相關推薦

    Qt創建動態給C#調用,通過回調完成交互

    windows下做應用開發時,經常需要多種不同的語言混合編程。比如:利用Qt開發一個動態,給C#調用。 當前的需求是: 利用Qt開發一個工具,給C#調用,來
    的頭像 發表于 09-09 11:37 ?4317次閱讀
    Qt創建<b class='flag-5'>動態</b><b class='flag-5'>庫</b>給C#調用,通過回調<b class='flag-5'>完成</b>交互

    單片機上實現動態加載功能

    本項目是一個單片機(如:STM32)實現動態加載功能的函數,與Windows中的dll,Linux中的so類似,可以將代碼
    發表于 05-30 11:04 ?1671次閱讀

    Linux下動態和靜態制作及使用

    不必從零開始,我們要做的只是恰當的位置調用合適的庫函數去實現相應的功能,充分利用前人的勞動成果,就是“站在巨人的肩膀”。本文主要簡述Linux下制作以及使用方法。一、什么是
    發表于 11-18 17:05

    linux Qt 動態制作以及使用方法

    一、Qt動態制作 (1)、新建 選擇目錄選擇需要的模塊,如果需要界面則選擇QtGui等。(2)、編寫簡單代碼以及編譯編寫簡單的打印代碼,然后點擊運行,之后彈出如下窗口:點擊“取消”,之后可在工程
    發表于 07-05 08:01

    labview由于缺少依賴項或動態依賴,動態加載失敗問題

    `設備是有光譜和電機,激光共同工作的一個程序,別人電腦可以無報錯打開,自己電腦說丟失外部符號或依賴關系,或出現無效的文件格式,因此無法加載動態
    發表于 05-21 15:21

    Linux下靜態動態制作與使用

    什么是靜態函數?動態函數庫又是什么?linux靜態函數怎樣創建并使用的?動態函數庫怎樣
    發表于 04-26 06:45

    動態模塊加載的調試經驗分享

    cache 沒能同步導致的。問題二目前動態模塊加載功能還有如下待完善的地方:初始化全局指針的時候,不能將其設置為某個全局變量的地址,因為全局變量的地址是
    發表于 03-22 14:53

    有沒有辦法讓我看到保存的項目PC和加載MCU中的項目之間的程序差異?

    有沒有辦法讓我看到保存的項目(PC)和加載MCU 中的項目之間的程序差異?我正在使用 System Workbench IDE 對 stm32f405rgt6 進行編程。MCU集成
    發表于 12-23 07:10

    制作和使用自定義C文件

    制作和使用自定義C文件 目標 1.制作一個文件libGetMax.a ,其中包含一個外部函數GetMax ?!『瘮礕etMax的作用是判斷
    發表于 01-16 11:58 ?1265次閱讀

    Linux下靜態動態(共享)的制作與使用

    Linux下靜態動態(共享)的制作與使用Linux
    發表于 07-09 14:39 ?1115次閱讀

    Linux下的靜態、動態動態加載

    動態必須在編譯時對編譯器可見,但編譯器卻不將此種編譯進可執行文件; b) 在運行期間,動態加載和卸載的
    發表于 04-02 14:32 ?671次閱讀

    動態和靜態制作步驟

    是一種可執行的二進制文件,是編譯好的代碼。使用可以提高開發效率。 Linux 下有靜態動態
    的頭像 發表于 07-27 11:00 ?698次閱讀

    車規MCU的啟動加載程序是什么

    加載程序負責MCU啟動和加載應用程序。它通過讀取存儲器中的引導加載代碼,并將其
    的頭像 發表于 10-27 17:26 ?1378次閱讀

    單片機上實現動態加載功能的函數介紹

    本項目是一個單片機(如:STM32)實現動態加載功能的函數,與Windows中的dll,Linux中的so類似,可以將代碼
    的頭像 發表于 11-09 10:55 ?1223次閱讀

    MATLAB中如何保存和加載消息

    保存和加載消息 您可以保存消息并存儲內容以供以后使用。 例如從訂閱者獲取一條新消息。 posedata = receive(posesub, 10 ) 然后使用MATLAB的保存函數將姿態數據保存
    的頭像 發表于 11-15 15:17 ?308次閱讀