在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

分享一種適用于嵌入式單片機的差分升級通用庫

電子工程師筆記 ? 來源:CSDN-風吹花中花吹風 ? 2023-09-15 09:46 ? 次閱讀

1. 什么是差分/增量升級?

借用網上的介紹:適合嵌入式的差分升級又叫增量升級,顧名思義就是通過差分算法將源版本與目標版本之間差異的部分提取出來制作成差分包,然后在設備通過還原算法將差異部分在源版本上進行還原從而升級成目標版本的過程。

差分升級方案不僅可以節省MCU內部的資源空間、還可以節省下載流程及下載和升級過程中的功耗。

也就是說,差分升級是拿以前舊設備內的bin,和當前新版本的bin用某種算法算出他們的差異部分,然后在借助壓縮算法,生產一個極其小的差分包,然后將這個差分包下載到設備中,設備在根據解壓算法、差分還原算法,生產一個完整的新版本bin,然后將這個新版本bin刷到執行區執行代碼。

差分升級一般來說,可以極大的減少下載量,特別是對于嵌入式STM32單片機來說,可以極大的減少維護成本,因為嵌入式設備的升級維護一般都是空中ota升級,比如藍牙紅外等,下載速度受到波特率、包長等限制,更新固件包非常的慢,而差分升級可以讓下載的過程極大的縮小。

正常的維護版本,即使改的再多,生成的差分包bin理論上在原bin的5%左右,比如一個300k的bin,改的很多的情況下差分包也不過15k左右,而我實際測試,版本維護平均都在5~10k左右。

2. 差分升級實現原理

差分升級過程:

1、使用舊版本bin文件和新版本bin文件制作差分包

2、將差分包下載到設備內

3、設備使用差分算法還原出新版本bin

4、設備將新版本bin進行crc驗證后刷到代碼執行區

5、設備重啟并以新版本運行

在過程中有2個關鍵點:

第一:如何使用舊版本bin文件和新版本bin文件制作差分包?

該過程我們使用穩定的開源差分算法bsdiff+lzma生成差分包,該算法被大量使用,穩定安全,并且我們已在項目中批量使用,經過長時間的驗證無任何問題。一般來說,該過程都是使用上位機來完成,嵌入式設備無需關心,我們已經做好了上位機軟件,可以供大家隨意使用,稍后會進行介紹。

第二:設備收到差分包后如何還原出新版本的bin文件?

該過程就是我們要講解的重點過程,相對應的,嵌入式設備中,我們依然使用開源差分算法bsdiff+lzma來還原新版本文件,代碼全開源,并且我已做成了庫、抽象出了極簡的接口,移植起來費不了多少功夫。

基本是市場上所有的單片機如stm32、瑞薩、華大、復旦微等都可以使用,但是有內存限制,要求ram至少要10k以上,然后是該庫本身的消耗大概是5k的rom

3. 關鍵點一:差分包制作過程

對于差分包的制作,我已經開發好了上位機軟件,界面如下圖所示:

fe15f436-52f6-11ee-a25d-92fbcf53809c.png

上位機這邊主要實現使用開源算法bsdiff制作舊版本bin和新版本bin的差分包,然后在使用lzma壓縮算法來壓縮差分包,最終生成一個差分bin,使用方法上位機界面提示的很清楚,最終效果如下圖所示:

fe65ae18-52f6-11ee-a25d-92fbcf53809c.png

4. 關鍵點二:嵌入式設備中差分算法庫的移植(還原差分包)

4.1. 移植開關算法庫代碼

代碼已開源,地址:

https://gitee.com/qq791314247/mcu_bsdiff_upgrade

整體代碼如下圖所示:

feb4e30c-52f6-11ee-a25d-92fbcf53809c.png

如上圖所示,99%的代碼用戶都不用去關心,用戶只需要提供一個flash寫入接口即可,也就是該庫給定用戶flash地址、數據內容指針、數據內容長度,用戶將該段數據寫入到flash即可,移植起來特別簡單,花不了幾分鐘的功夫,這也是我花大力氣抽象接口的原因。

4.2. 使用該庫的流程

4.2.1. 使用庫的接口

對于整個庫的代碼,我們只需要關心一個接口iap_patch,iap_patch在文件”user_interface.h”中。

ff01d32e-52f6-11ee-a25d-92fbcf53809c.png

該接口介紹也比較清晰,差分包的還原,只需要調用這一個接口即可。

/**
*@brief用戶使用差分升級時唯一需要關心的接口
*
*@paramold設備中執行區代碼所在的地址,用戶可指定flash執行區的地址,方便算法讀出來當前
*運行中的代碼
*@paramoldsize設備中執行區代碼的長度,用戶可在差分包bin頭獲取
*@parampatch設備中已經下載的差分包所在的flash地址,或者ram地址,只要能讓算法讀出來即可
*注意,下載的差分包自帶image_header_t格式的文件頭,真正的差分包需要偏
*移sizeof(image_header_t)的長度
*@parampatchsize設備中已經下載的差分包的長度,用戶可在差分包bin頭獲取
*@paramnewfile新文件的大小,用戶需填入新版本bin的長度,用戶亦可以差分包bin頭獲取
*@returnint然后錯誤碼,0成功,1失敗
*/
externintiap_patch(constuint8_t*old,uint32_toldsize,constuint8_t*patch,
uint32_tpatchsize,uint32_tnewfile);

另外,使用該接口還原時所需要的一些信息可以在差分包文件頭中獲取,上位機在制作差分包時,會自動在差分包的bin頭加上64字節的文件頭,以便于告訴嵌入式設備舊/新版本bin文件的CRC校驗、長度等信息。所以用戶在收到差分包頭時,偏移掉這64個字節的文件頭的地址才是需要給到iap_patch接口的真正的bin文件。

文件頭格式如下代碼,用戶只需要關心中文注釋的部分,其余的都是預留的信息。

/*差分包制作時自帶的文件頭信息,用戶只需要關心中文注釋的部分*/
typedefstructimage_header
{
uint32_tih_magic;/*ImageHeaderMagicNumber*/
uint32_tih_hcrc;/*ImageHeaderCRCChecksum差分包包頭校驗*/
uint32_tih_time;/*ImageCreationTimestamp*/
uint32_tih_size;/*ImageDataSize差分包的大小*/
uint32_tih_load;/*DataLoadAddress上一版本舊文件的大小*/
uint32_tih_ep;/*EntryPointAddress要升級的新文件的大小*/
uint32_tih_dcrc;/*ImageDataCRCChecksum新文件的CRC*/
uint8_tih_os;/*OperatingSystem*/
uint8_tih_arch;/*CPUarchitecture*/
uint8_tih_type;/*ImageType*/
uint8_tih_comp;/*CompressionType*/
uint8_tih_name[IH_NMLEN];/*ImageName*/
uint32_tih_ocrc;/*OldImageDataCRCChecksum上一版本舊文件的CRC*/
}image_header_t;
/*差分包制作時自帶的文件頭信息,用戶只需要關心中文注釋的部分*/

4.2.2. 接口使用例子

我截取一段我工程中的代碼來講解如何使用該接口還原出新版本bin文件:

#ifdefBSDIFF_UPGRADE
image_header_trecv_head;
uint32_trecv_hcrc;/*接收到的文件頭CRC*/
uint32_tcalculation_crc;/*計算出來的文件頭CRC*/
uint32_tspi_flash_addr=UPGRADE_PROGRAM_ADDR;

memcpy(&recv_head,(uint8_t*)APPLICATION_A,sizeof(image_header_t));
recv_hcrc=BigtoLittle32(recv_head.ih_hcrc);
recv_head.ih_hcrc=0;
calculation_crc=crc32((uint8_t*)&recv_head,sizeof(image_header_t));

if(recv_hcrc==calculation_crc)
{
recv_head.ih_hcrc=recv_hcrc;
recv_head.ih_time=BigtoLittle32(recv_head.ih_time);
recv_head.ih_size=BigtoLittle32(recv_head.ih_size);
recv_head.ih_dcrc=BigtoLittle32(recv_head.ih_dcrc);
recv_head.ih_ocrc=BigtoLittle32(recv_head.ih_ocrc);
/*差分升級包*/
recv_head.ih_hcrc=calculation_crc;
if(crc32((uint8_t*)APPLICATION_RUN,recv_head.ih_load)!=recv_head.ih_ocrc)
{
APP_ERR_PRINT("fileoldcrcerr,calcrc:0X%08X,ih_oldbin_crc:0X%08X,",
crc32((uint8_t*)APPLICATION_RUN,
recv_head.ih_load),recv_head.ih_ocrc);
gotobsdiff_out;
}
RTOS_LOCK();
disable_task_monitoring(ALL_TASK_RUNFLAG_BIT,true);
//flash_erase_sector(UPGRADE_PROGRAM_ADDR,UPGRADE_PROGRAM_PAGE);
recv_hcrc=iap_patch((uint8_t*)APPLICATION_RUN,recv_head.ih_load,
(uint8_t*)(APPLICATION_A+sizeof(image_header_t)),
recv_head.ih_size,UPGRADE_PROGRAM_ADDR);
if(recv_hcrc!=recv_head.ih_ep)
{
APP_ERR_PRINT("iap_patchlenerr.");
APP_ERR_PRINT("iap_patchlen:%lu,new_len:%lu",recv_hcrc,recv_head.ih_ep);
gotobsdiff_out;
}
if(erase_program(APPLICATION_A))
{
APP_ERR_PRINT("Ieraseprogramfailed.");
gotobsdiff_out;
}

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

    關注

    6061

    文章

    44875

    瀏覽量

    646132
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17806

    瀏覽量

    359683
  • 嵌入式
    +關注

    關注

    5133

    文章

    19502

    瀏覽量

    314324
  • STM32
    +關注

    關注

    2288

    文章

    10999

    瀏覽量

    362002

原文標題:適用于嵌入式的差分升級通用庫!

文章出處:【微信號:電子工程師筆記,微信公眾號:電子工程師筆記】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    一種基于單片機的搶占實時嵌入式操作系統設計

    一種基于單片機的搶占實時嵌入式操作系統設計
    發表于 04-22 12:59

    單片機嵌入式系統的區別 單片機嵌入式linux區別

    `在如今高速發展的社會下,電子信息技術的更新迭代相當迅速,想要不被社會淘汰,就要不斷更新自己的技術水平。本文簡單分析了單片機嵌入式系統的聯系、組成結構對比等基礎知識,并列舉了幾種適用于PIC18F
    發表于 03-16 16:22

    到底什么是嵌入式?什么是單片機

    系統、定時器/計數器等功能,塞進塊硅片上,變成個超小型的計算機。這么說來,單片機不就是嵌入式系統?別急,我們往下看。“
    發表于 05-08 10:35

    什么是嵌入式?什么是單片機

    、定時器/計數器等功能,塞進塊硅片上,變成個超小型的計算機。這么說來,單片機不就是嵌入式系統?別急,我們往下看。“
    發表于 05-19 14:25

    如何去實現基于單片機分升級

    分算法有開源的bsdiff,壓縮算法也有開源的單片機就能用的,把這兩個結合起來放單片機里就可以實現分升級。由于上位
    發表于 11-19 06:14

    一種適用于嵌入式系統的模塊動態加載技術

    嵌入式系統中的模塊動態加載技術摘要提出一種適用于嵌入式系統的模塊動態加載技術,設計實現簡單,占用資源少,開銷小,并且成功運用于DeltaOS
    發表于 12-20 06:32

    一種適用于嵌入式數據的新索引機制

    由于嵌入式系統具有內存資源極為有限和處理器速度不高等特點,因此適用于嵌入式數據的索引機制應在盡量減少內存占用量的基礎上進步提高數據操作的
    發表于 12-22 10:57 ?23次下載

    單片機嵌入式鍵盤接口技術

    本文介紹一種超小尺寸、防水措施良好的單片機嵌入式鍵盤,作為PC/104CPU模塊專用輸入設備。其工作原理不僅適用于鍵盤輸入系統,同時也適用于
    發表于 03-25 11:22 ?16次下載

    什么是嵌入式單片機?嵌入式單片機詳情匯總

    嵌入式單片機,即嵌入式微控制器,指以微控制器為核心控制單元的嵌入到對象體系中的專用計算機系統,是應用十分廣泛的一種
    發表于 11-13 09:39 ?6259次閱讀

    嵌入式單片機的關系

    單片機是眾多嵌入式處理器的一種,目前通用的理解是,嵌入式主要是指ARM\DSP等處理器.而嵌入式
    發表于 10-06 09:59 ?6505次閱讀

    單片機or嵌入式linux

    和RTOS經驗,之前面試也拿過些做單片機stm32開發的offer,所以今天分享些關于單片機是否要轉嵌入式Linux的
    發表于 11-01 16:26 ?17次下載
    <b class='flag-5'>單片機</b>or<b class='flag-5'>嵌入式</b>linux

    基于單片機分升級

    分算法有開源的bsdiff,壓縮算法也有開源的單片機就能用的,把這兩個結合起來放單片機里就可以實現分升級。由于上位
    發表于 11-12 21:06 ?11次下載
    基于<b class='flag-5'>單片機</b>的<b class='flag-5'>差</b><b class='flag-5'>分升級</b>

    單片機嵌入式的區別

    ,價格低,應用領域大多為小家電,終端設備。 嵌入式片上資源豐富,價格高,應用領域廣泛,基本可以適用于任何領域。開發模式 單片機般都是裸機開發,程序規模較小,只有在比較高端的芯
    發表于 11-15 12:36 ?15次下載
    <b class='flag-5'>單片機</b>和<b class='flag-5'>嵌入式</b>的區別

    自編適用于嵌入式單片機Json封包與解析的程序

    @[TOC]**自編適用于嵌入式單片機Json封包與解析的程序**說明:由于網上提供的標準JSON,對向單片機這類的小設備占用資源過多,很
    發表于 12-05 16:51 ?17次下載
    自編<b class='flag-5'>適用于</b><b class='flag-5'>嵌入式</b><b class='flag-5'>單片機</b>Json封包與解析的程序

    "單片機分升級算法(STM32,M0,M3,M4等芯片都適用)"

    "單片機分升級算法(STM32,M0,M3,M4等芯片都適用)"
    發表于 12-07 14:06 ?26次下載
    "<b class='flag-5'>單片機</b><b class='flag-5'>差</b><b class='flag-5'>分升級</b>算法(STM32,M0,M3,M4等芯片都<b class='flag-5'>適用</b>)"
    主站蜘蛛池模板: 欧美综合在线视频 | 97影院理论片手机在线观看 | 日本在线网址 | 一级做a爰片久久毛片美女图片 | 手机在线看片国产 | 起碰免费视频 | 天天摸夜夜添夜夜添国产 | 边做饭边被躁欧美三级小说 | 中国胖女人一级毛片aaaaa | 亚洲福利午夜 | 性做久久久久久久 | 色色色色网站 | 美女扒开尿口让男生添 漫画 | 中文字幕在线看视频一区二区三区 | 国产亚洲综合一区 柠檬导航 | 亚洲天天做夜夜做天天欢人人 | 四虎影视精品 | 亚洲欧美卡通 动漫 丝袜 | 国产真实灌醉美女疯狂弄 | 日本在线不卡一区 | 成人综合网站 | 日本一区视频在线观看 | 天天综合亚洲国产色 | 新版天堂资源中文在线 | 在线视频综合网 | 国产精品天天在线 | 国产在线高清精品二区色五郎 | 欧美综合久久 | 1v1高h肉爽文bl | 欧美视频图片 | 色综合久久五月 | 成人a级特黄毛片 | 日本福利网址 | 亚洲国产精品自在现线让你爽 | 欧美资源在线 | 97久久综合区小说区图片专区 | 男同小黄文 | 天天在线天天在线天天影视 | 亚洲黄网免费 | 久久怡红院国产精品 | 欧美一区二区三区不卡视频 |