0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在MCU上怎樣完成動(dòng)態(tài)庫(kù)的制作和加載

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

作為一個(gè)嵌入式軟件攻城獅,提起庫(kù)首先會(huì)想到靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。靜態(tài)庫(kù)一般以.a為后綴,動(dòng)態(tài)庫(kù)以.so為后綴(Win系統(tǒng).DLL)。

poYBAGIobn6AO9DjAAA6pPX499U371.png

而作為一個(gè)單片機(jī)軟件攻城獅,也會(huì)經(jīng)常用到各種靜態(tài)庫(kù),常見(jiàn)的C庫(kù)有stdio,stdlib,string,time等,第三方庫(kù)也有CMSIS_DSP_Library,mbedtls,60730等等。為什么要使用這些庫(kù)呢?個(gè)人認(rèn)為可能有以下幾個(gè)原因:

系統(tǒng)解耦,可以減少軟件模塊之間的耦合,使軟件結(jié)構(gòu)更清晰。

加速編譯,有些庫(kù)源碼有非常多的源文件,如果使用源碼編譯會(huì)大大增加編譯時(shí)間。

保護(hù)知識(shí)產(chǎn)權(quán),限定產(chǎn)品的使用范圍。比如NXP提供的電機(jī)算法庫(kù)rtcesl當(dāng)然希望它運(yùn)行在自己品牌MCU

MCU從產(chǎn)品實(shí)用角度上看,也是有動(dòng)態(tài)庫(kù)的需求,比如下面幾種場(chǎng)景:

有些產(chǎn)品形態(tài)要求MCU的固件分為安全域和非安全域,安全域的邏輯一旦經(jīng)過(guò)認(rèn)證就無(wú)法進(jìn)行升級(jí),而非安全域的邏輯可以通過(guò)bootloader進(jìn)行遠(yuǎn)程或本地的升級(jí)。比如新規(guī)電表,計(jì)量部分屬于安全域不可更新,而其他固件則可以進(jìn)行更新

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

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

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

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

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

今天我們就專門(mén)研究下如何在MCU上實(shí)現(xiàn)動(dòng)態(tài)庫(kù)的制作和加載。

制作動(dòng)態(tài)庫(kù)

首先我們先回憶下如何制作靜態(tài)庫(kù),第三方的或者自己寫(xiě)的靜態(tài)庫(kù),一般由三部分組成:

poYBAGIobnGATYg5AAAtswS9XVo508.png

在MCU中制作的動(dòng)態(tài)庫(kù)則需要如下幾部分內(nèi)容:

pYYBAGIobmmAdntvAAAoV8Oe-rw421.png

至于具體如何實(shí)現(xiàn),現(xiàn)在以之前介紹的開(kāi)源PLC為例:

規(guī)劃內(nèi)存,將MCU內(nèi)部的Flash/RAM分出一部分留給庫(kù),具體做法需要修改鏈接文件中的相關(guān)地址

pYYBAGIobl-AD6b-AAA22syThwQ328.png

定義函數(shù)指針列表結(jié)構(gòu)體,用于提供給用戶程序調(diào)用:

poYBAGIobk2ACD9JAABMOVMhLJM686.png

初始化結(jié)構(gòu)體,并實(shí)現(xiàn)函數(shù)原型:

pYYBAGIobkSAap75AAAy-2UA9f0984.png

poYBAGIobjiAB4rYAAAOoFGwU0M126.png

poYBAGIobiyAQNJ8AAAhcKh8-wk838.png

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

poYBAGIobiGAS4_bAAAK9LZxTz8464.png

編譯并下載到MCU中

加載動(dòng)態(tài)庫(kù)

生成動(dòng)態(tài)庫(kù)后,用戶只需要知道函數(shù)指針列表的地址和結(jié)構(gòu)體列表即可。使用過(guò)程如下:

在用戶工程中定義相同的結(jié)構(gòu)體,并從固定地址中加載到

poYBAGIobhiAeBJlAAARIhl1CsU766.png

通過(guò)函數(shù)指針執(zhí)行相應(yīng)代碼即可

pYYBAGIobguAPUZ6AAAM3MhCJW4415.png

擴(kuò)展知識(shí)

針對(duì)動(dòng)態(tài)庫(kù)的應(yīng)用場(chǎng)景2,簡(jiǎn)單的賣(mài)芯片也只是防君子不防小人,因?yàn)榻K端客戶可以通過(guò)JTAG/SWD把動(dòng)態(tài)庫(kù)讀出來(lái),有些芯片雖然支持禁用JTAG/SWD使能ISP的方式下載,但用戶還是可以通過(guò)指針+地址的方式將庫(kù)從芯片中讀取出來(lái),之后找芯片原廠克隆,針對(duì)這種攻擊,普通的MCU往往是無(wú)力應(yīng)付的,大部分的軟件/算法公司是通過(guò)綁定加密芯片的方式來(lái)進(jìn)行保護(hù),但是除非加密芯片中有算法邏輯,否則這種保護(hù)也是徒勞的,因?yàn)椴还苁莿?dòng)態(tài)庫(kù),還是靜態(tài)庫(kù),攻擊者都可以通過(guò)反匯編看到關(guān)鍵的跳轉(zhuǎn)點(diǎn),從而bypass驗(yàn)證過(guò)程。

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

NXP Kinetis系列產(chǎn)品在Flash中添加了FAC(Flash Access Control)功能,可以保證在可配置區(qū)域內(nèi)只能被執(zhí)行,而無(wú)法通過(guò)指針?lè)绞剑?a href="http://www.ttokpm.com/tags/dma/" target="_blank">DMA,JTAG/SWD,Ezport等接口獲取

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

ARM Cortex-M33內(nèi)核以及支持了TrustZone,可以將動(dòng)態(tài)庫(kù)放置在Secure區(qū)域,并設(shè)置NSC訪問(wèn)接口,具體做法和FAC類(lèi)似

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


審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16667

    瀏覽量

    347784
  • 嵌入式
    +關(guān)注

    關(guān)注

    5046

    文章

    18817

    瀏覽量

    298555
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Qt創(chuàng)建動(dòng)態(tài)庫(kù)給C#調(diào)用,通過(guò)回調(diào)完成交互

    windows下做應(yīng)用開(kāi)發(fā)時(shí),經(jīng)常需要多種不同的語(yǔ)言混合編程。比如:利用Qt開(kāi)發(fā)一個(gè)動(dòng)態(tài)庫(kù),給C#調(diào)用。 當(dāng)前的需求是: 利用Qt開(kāi)發(fā)一個(gè)工具庫(kù),給C#調(diào)用,來(lái)
    的頭像 發(fā)表于 09-09 11:37 ?4316次閱讀
    Qt創(chuàng)建<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>庫(kù)</b>給C#調(diào)用,通過(guò)回調(diào)<b class='flag-5'>完成</b>交互

    單片機(jī)上實(shí)現(xiàn)動(dòng)態(tài)加載功能

    本項(xiàng)目是一個(gè)單片機(jī)(如:STM32)實(shí)現(xiàn)動(dòng)態(tài)加載功能的函數(shù)庫(kù),與Windows中的dll,Linux中的so類(lèi)似,可以將代碼
    發(fā)表于 05-30 11:04 ?1671次閱讀

    Linux下動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)制作及使用

    不必從零開(kāi)始,我們要做的只是恰當(dāng)?shù)奈恢谜{(diào)用合適的庫(kù)函數(shù)去實(shí)現(xiàn)相應(yīng)的功能,充分利用前人的勞動(dòng)成果,就是“站在巨人的肩膀”。本文主要簡(jiǎn)述Linux下庫(kù)制作以及使用方法。一、什么是
    發(fā)表于 11-18 17:05

    linux Qt 動(dòng)態(tài)庫(kù)制作以及使用方法

    一、Qt動(dòng)態(tài)庫(kù)制作 (1)、新建 選擇目錄選擇需要的模塊,如果需要界面則選擇QtGui等。(2)、編寫(xiě)簡(jiǎn)單代碼以及編譯編寫(xiě)簡(jiǎn)單的打印代碼,然后點(diǎn)擊運(yùn)行,之后彈出如下窗口:點(diǎn)擊“取消”,之后可在工程
    發(fā)表于 07-05 08:01

    labview由于缺少依賴項(xiàng)或動(dòng)態(tài)依賴,動(dòng)態(tài)庫(kù)加載失敗問(wèn)題

    `設(shè)備是有光譜和電機(jī),激光共同工作的一個(gè)程序,別人電腦可以無(wú)報(bào)錯(cuò)打開(kāi),自己電腦說(shuō)丟失外部符號(hào)或依賴關(guān)系,或出現(xiàn)無(wú)效的文件格式,因此無(wú)法加載動(dòng)態(tài)
    發(fā)表于 05-21 15:21

    Linux下靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)制作與使用

    什么是靜態(tài)函數(shù)庫(kù)動(dòng)態(tài)函數(shù)庫(kù)又是什么?linux靜態(tài)函數(shù)庫(kù)怎樣創(chuàng)建并使用的?動(dòng)態(tài)函數(shù)庫(kù)怎樣創(chuàng)
    發(fā)表于 04-26 06:45

    動(dòng)態(tài)模塊加載的調(diào)試經(jīng)驗(yàn)分享

    cache 沒(méi)能同步導(dǎo)致的。問(wèn)題二目前動(dòng)態(tài)模塊加載功能還有如下待完善的地方:初始化全局指針的時(shí)候,不能將其設(shè)置為某個(gè)全局變量的地址,因?yàn)槿肿兞康牡刂肥?b class='flag-5'>在
    發(fā)表于 03-22 14:53

    有沒(méi)有辦法讓我看到保存的項(xiàng)目PC和加載MCU中的項(xiàng)目之間的程序差異?

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

    制作和使用自定義C庫(kù)文件

    制作和使用自定義C庫(kù)文件 目標(biāo) 1.制作一個(gè)庫(kù)文件libGetMax.a ,其中包含一個(gè)外部函數(shù)GetMax ?!『瘮?shù)GetMax的作用是判斷
    發(fā)表于 01-16 11:58 ?1265次閱讀

    Linux下靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)(共享庫(kù))的制作與使用

    Linux下靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)(共享庫(kù))的制作與使用Linux
    發(fā)表于 07-09 14:39 ?1114次閱讀

    Linux下的靜態(tài)庫(kù)、動(dòng)態(tài)庫(kù)動(dòng)態(tài)加載庫(kù)

    動(dòng)態(tài)庫(kù)必須在編譯時(shí)對(duì)編譯器可見(jiàn),但編譯器卻不將此種庫(kù)編譯進(jìn)可執(zhí)行文件; b) 在運(yùn)行期間,動(dòng)態(tài)加載和卸載的
    發(fā)表于 04-02 14:32 ?671次閱讀

    動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)制作步驟

    庫(kù)是一種可執(zhí)行的二進(jìn)制文件,是編譯好的代碼。使用庫(kù)可以提高開(kāi)發(fā)效率。 Linux 下有靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)
    的頭像 發(fā)表于 07-27 11:00 ?698次閱讀

    車(chē)規(guī)MCU的啟動(dòng)加載程序是什么

    加載程序負(fù)責(zé)MCU啟動(dòng)和加載應(yīng)用程序。它通過(guò)讀取存儲(chǔ)器中的引導(dǎo)加載代碼,并將其
    的頭像 發(fā)表于 10-27 17:26 ?1376次閱讀

    單片機(jī)上實(shí)現(xiàn)動(dòng)態(tài)加載功能的函數(shù)庫(kù)介紹

    本項(xiàng)目是一個(gè)單片機(jī)(如:STM32)實(shí)現(xiàn)動(dòng)態(tài)加載功能的函數(shù)庫(kù),與Windows中的dll,Linux中的so類(lèi)似,可以將代碼
    的頭像 發(fā)表于 11-09 10:55 ?1221次閱讀

    MATLAB中如何保存和加載消息

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