91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

3天內不再提示

一種有趣的 OTA 升級思路(基于 LoRa 通信的 OTA 固件升級的調試記錄)

RTThread物聯網操作系統 ? 來源:未知 ? 2023-08-09 19:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 概述


采用 LoRa 技術進行無線通訊,考慮到產品的實際需求,增加了產品的 OTA 固件升級的功能。因為 LoRa 通訊速度較慢,合理的減小 APP 區域固件的大小加快固件升級的速度變的尤為重要,于是就開啟了優化調整 APP 區域固件大小之旅。

代碼中使用到了 STM32_Cryptographic_Library、STM32_Std_Library 和 LoRa 驅動庫,這些庫編譯之后的體積較大,猜想能不能將所有的這些庫文件放在 Bootload 進行固化,然后封裝好接口供 APP 調用,順著這個思路開啟了優化之路。

2 調試之路

2.1 想法

常見的固件升級是將片內 Flash 分為 Bootload 區域和 APP 區域(如下圖所示),由 APP 區域接收新固件存儲在片內或者片外 Flash,然后置升級的標志位并跳轉到 Bootload,在 Bootload 完成新固件的更新工作。這樣實現比較常規,但是由于 APP 中包含了多種庫導致目標文件比較大,LoRa 通訊速率又不高會使整個升級時間很長。

7e2f60e4-36a5-11ee-9e74-dac502259ad0.png

為了減小 APP 的大小,考慮將使用到庫文件都固化在 Bootload 內,將片內 Flash 分為三個區域(如下圖所示),增加一個共有函數區域,用于存放 Bootload 中封裝好的接口。在函數調用時,如果 APP 調用的是共有函數,那么首先去共有函數區域找到函數在 Flash 中的地址,然后到 Bootload 中的對應位置執行相應的代碼,再講執行結果返回給 APP 區域,整個調用過程如下所示。

7e49896a-36a5-11ee-9e74-dac502259ad0.png

2.2 函數和變量定義在絕對地址的實現

有了上面的想法,首先需要驗證的是如何將函數和變量放置在 Flash 的固定位置處,這樣每次在調用固定位置處的接口就能找到 Bootload 中固化的代碼接口。查閱相關資料,了解到 IAR 中的具體實現如下:

2.2.1 IAR的擴展關鍵字

??@ 用于函數變量的絕對地址定位,將函數變量等放到指定的 section

??__no_init禁止系統啟動時初始化變量

??__root 保證沒有使用的函數或者變量也能夠包含在目標代碼中

2.2.2 函數的絕對定位

要將函數定義在絕對位置,需要在函數定義時后面加上

1voidfun1(inta,intb)@".MY_SECTION"
2{
3...//函數內容
4}

然后在鏈接文件 .icf 中添加如下內容。其中 0x08010000 表示在 Flash 中的地址,.MY_SECTION 必須與函數 @ 后面雙引號中內容一致

1placeataddressmem:0x08010000{readonlysection.MY_SECTION};

2.2.3 變量的絕對定位

示例如下,變量絕對定位,無須修改 .icf 鏈接文件,直接指定具體位置即可。

1__no_initchararray1[100]@0x2000B000;

2.2.4 常量的絕對定位

常量的絕對定位示例如下:

1__rootconstintstr1[4]@".MYSEG"={1,2,3,4};

常量絕對定位,需要改.icf文件,示例如下:

1placeataddressmem:0x08018500{readonlysection.MYSEG};

2.2.4 .c文件的絕對定位

要將 test.c 文件定位到 Flash 的絕對地址,那么在 .icf文件中應該按照如下格式添加:

1placeataddressmem:0x08018000{section.textobjecttest.o};

編譯完成后整個 test.c 文件的所有函數,都在 0x08018000 之后。

2.3 Bootload 共有函數的實現

考慮到在初期編寫代碼時共有函數是可能發生變化的,如果按照上述的方法一個一個將函數放在固定的位置不是很方便,因此采用數組的方式將所有的共有函數放置在一起,如下所示:

1__rootconstuint32_tfunc_table[]@".COMMON_FUNC_SEG"={
2
3(uint32_t)&fun1,/**00*/
4
5(uint32_t)&fun2,/**01*/
6
7(uint32_t)&fun3,/**02*/
8
9}

按照上面數組的方式將所有共有函數集合在一起,然后再 .icf 鏈接文件中將該數組放置在固定位置處,這樣在 0x08010000 位置處依次就能找到定義的所有共有函數(每個成員是函數對象的地址,占 4 個字節)。

1/**將數組放置在固定位置*/
2
3placeataddressmem:0x08010000{readonlysection.COMMON_FUNC_SEG};

2.4 APP 共有函數的使用

按照上述的方法可以將所有的庫函數封裝好并固化在 Bootload 中,并且實現了將所有的共有函數接口放置在固定的位置,在 APP 區可以使用函數指針的方式進行訪問,示例如下:

 1/**1.聲明*/
 2
 3typedefint(*app_fun1)(inta,intb);
 4
 5typedefvoid(*app_fun2)(void);
 6
 7typedefchar*(*app_fun3)(char*p);
 8
 9/**2.定義函數指針類型的變量*/
10
11app_fun1fun1;
12
13app_fun2fun2;
14
15app_fun1fun3;
16
17/**3.共有函數的重定義*/
18
19#defineFUNC_TABLE_ADDR(0x08010000)/**共有函數的首地址*/
20
21voidredefine_common_function(void)
22
23{
24
25uint32_t*func_table_addr=(uint32_t*)FUNC_TABLE_ADDR;
26
27fun1=(app_fun1)func_table_addr[0];/*00*/
28
29fun2=(app_fun2)func_table_addr[1];/*01*/
30
31fun3=(app_fun3)func_table_addr[2];/*02*/
32
33}

通過上面的方式就能在 APP 區域調用 Bootload 中固化的接口了,不過要注意這種方式調試起來不是很方便,需要前期驗證好 Bootload 中封裝的接口有沒有問題。

3 注意事項


按照上述的方法操作時有一些注意事項如下:

1. 固件更新區的絕對定位的函數,不能隨意調用其他庫函數,那些被調用的函數也必須是絕對定位的。

2. 絕對定位的函數,如果要使用常量,那么被使用的常量也必須是絕對定位的。

3. 絕對定位的函數,如果要使用全局變量,那么被使用的常量也必須是絕對定位的,而局部變量則不受此限制。

4 調試坎坷之路

上面的想法很有新意,在調試時自己封裝的接口文件也經過了驗證,但是在 APP 調用共有函數時程序還是跑飛了,經過不斷的分析現實線現象,找到了問題的根源所在。STM32 標準庫在進行時鐘配置時定義了兩個全局的數組如下,由于開始沒有注意到這兩個全局數組,而這兩個全局數組是在 Bootload 區域定義的,跳轉到 APP 區域后會對棧空間重新初始化,原本放這兩個數組的位置就被初始化其他數值了,到時時鐘配置出錯。

1/**stm32f10x_rcc.c*/
2
3static__Iuint8_tAPBAHBPrescTable[16]={0,0,0,0,1,2,3,4,1,2,3,4,6,7,8,9};
4
5static__Iuint8_tADCPrescTable[4]={2,4,6,8};

分析后的解決辦法如下,因為這兩個全局數據需要在 Bootload 區域中使用,而 Bootload 需要進行固化,所以需要將這兩個數組放置固定的位置,這樣每次使用到該數組時就回去固定的位置找,就不會出現被誤修改的情況了。修改方式如下:

1__rootconstuint8_tAPBAHBPrescTable[16]@".AHBAPB_PRESC_TABLE"={0,0,0,0,1,2,3,4,1,2,3,4,6,7,8,9};
2
3__rootconstuint8_tADCPrescTable[4]@".ADC_PRESC_TABLE"={2,4,6,8};
4
5/**對應的修改.icf文件*/
6
7placeataddressmem:0x08010000{readonlysection.AHBAPB_PRESC_TABLE};
8
9placeataddressmem:0x08010010{readonlysection.ADC_PRESC_TABLE};

5 補充

上述講解了在 Bootload 和 APP 中共有函數的定義和使用,怎么驗證是不是將其定義在絕對地址了呢?我們可以查看編譯后生成的 map 文件,如下所示,可以看到在 map 文件中可以找到定義的 section。

7e7afa18-36a5-11ee-9e74-dac502259ad0.png

————————————————

版權聲明:本文為RT-Thread論壇用戶「crystal266」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://club.rt-thread.org/ask/article/fa68bea40877eec3.html


點擊閱讀原文進入官網


原文標題:一種有趣的 OTA 升級思路(基于 LoRa 通信的 OTA 固件升級的調試記錄)

文章出處:【微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

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

    關注

    32

    文章

    1402

    瀏覽量

    41875

原文標題:一種有趣的 OTA 升級思路(基于 LoRa 通信的 OTA 固件升級的調試記錄)

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    東風日產N7開啟首次OTA升級

    近日,東風日產舉辦“NI好 N7首次OTA升級發布會”,并宣布OTA升級即日開啟推送。
    的頭像 發表于 07-05 13:57 ?378次閱讀

    詳解藍牙空中升級(OTA)原理與步驟

    如何實現Bluetooth LE OTA?什么叫DFU?如何通過UART實現固件升級?又如何通過USB實現固件升級?怎么保證
    的頭像 發表于 07-04 09:56 ?422次閱讀
    詳解藍牙空中<b class='flag-5'>升級</b>(<b class='flag-5'>OTA</b>)原理與步驟

    瑞薩電子MCU無感OTA升級功能介紹

    在工業控制、電機驅動乃至物聯網邊緣節點中,固件在線升級OTA)已成為產品生命周期管理的標配。然而傳統OTA往往伴隨停機、風險與低效。瑞薩電子MCU中的Dual?Bank閃存架構為工程
    的頭像 發表于 05-15 14:36 ?683次閱讀
    瑞薩電子MCU無感<b class='flag-5'>OTA</b><b class='flag-5'>升級</b>功能介紹

    RK3568開發板OTA升級

    OTA(Over-The-Air)升級作為一種無損失的系統升級方式,能夠遠程將新功能部署到產品上,極大地提高了設備的可維護性和可擴展性。除了通過網絡直接下載
    的頭像 發表于 04-21 14:32 ?729次閱讀
    RK3568開發板<b class='flag-5'>OTA</b><b class='flag-5'>升級</b>

    文解鎖OTA遠程升級方案!基于RK3562全國產平臺

    在設備維護成本高、用戶體驗難提升的雙重難題下,OTA(Over-the-Air)空間下載技術的出現,無疑成為破解困境的“金鑰匙”,它是一種通過無線網絡實現設備遠程升級的技術,全程數據無損。OT
    的頭像 發表于 04-07 10:15 ?391次閱讀
    <b class='flag-5'>一</b>文解鎖<b class='flag-5'>OTA</b>遠程<b class='flag-5'>升級</b>方案!基于RK3562全國產平臺

    淺談車規MCU (MGEQ1C064) OTA升級

    OTA升級。 OTA升級方式 為了實現OTA升級,我們通常需要將MCU FLASH分為兩部
    發表于 03-04 12:52

    OTA軟件升級管理系統

    OTA(Over-the-Air Technology,空中下載技術)是通過空中下載的方式對車輛中的軟件進行遠程升級。經緯恒潤OTA軟件升級管理系統基于軟件架構、應用架構、業務架構和技
    的頭像 發表于 01-13 09:39 ?730次閱讀
    <b class='flag-5'>OTA</b>軟件<b class='flag-5'>升級</b>管理系統

    OTA升級】無需數據線,條命令即可完成固件升級

    OTA無線升級過程視頻演示:OTA介紹OTA(Over-The-Air,空中升級)是一種通過無線
    的頭像 發表于 12-11 01:00 ?3750次閱讀
    【<b class='flag-5'>OTA</b><b class='flag-5'>升級</b>】無需數據線,<b class='flag-5'>一</b>條命令即可完成<b class='flag-5'>固件</b><b class='flag-5'>升級</b>!

    OTA無線更新技術:升級系統,隨時暢享FLIR最新技術!

    站在FLIR技術前沿,享受最新功能帶來的便捷與高效! 1先進的OTA技術 OTA(Over-the-Air)技術能讓您的FLIR熱像儀無線接收最新功能和固件更新。只需連接Wi-Fi,熱像儀就能自動查找并安裝新功能、安全補丁和
    的頭像 發表于 12-03 15:34 ?694次閱讀
    <b class='flag-5'>OTA</b>無線更新技術:<b class='flag-5'>一</b>鍵<b class='flag-5'>升級</b>系統,隨時暢享FLIR最新技術!

    【xG24 Matter開發套件試用體驗】BLE OTA調試

    最近學習和調試了FR32xG24 Explorer Kit 開發套件的藍牙OTA功能,記錄一下調試過程。 基于Blinky demo程序進行調試
    發表于 08-29 18:26

    ESP8266 OTA升級錯誤的原因?

    ,所以臨時調換了下 以下是程序打印的LOG Code: Select all [OTA]READ: EA040001 4001040 0 F0370300 A4180040 B4180040
    發表于 07-19 07:35

    S3N8R16工程代碼里面只要調用了wifi、藍牙、mqtt等相關接口,編譯出來的固件拿去ota升級升級不了,為什么?

    碰到個很奇怪的現象,我的工程代碼里面只要調用了wifi、藍牙、mqtt等相關接口,編譯出來的固件拿去ota升級升級不了,沒有調用就能正常升級
    發表于 07-19 07:31

    在增強模式下引導加載程序時,OTA升級失敗了,為什么?

    userbin number!n\"); return; } ...然后獲取文件并執行升級... 此外,我沒有找到一種方法來退出增強模式以正常運行引導加載程序,即使在再次刷新固件和引導加載程序后
    發表于 07-18 07:12

    OTA升級后重啟,printf日志錯誤的原因?

    OTA升級后重啟,printf日志錯誤。
    發表于 07-18 06:26

    請問使用ymodem_ota時如何更換串口?

    現在使用串口1可以正常使用ymodem_ota進行固件升級,但是現在項目需要使用串口1來進行其他作用,求怎么把串口1更改為串口2進行ota升級
    發表于 07-15 06:09
    主站蜘蛛池模板: 丁香五月缴情综合网 | 欧美肉到失禁高h视频在线 欧美三级成人 | 最近在线观看免费完整视频 | 国产精品高清一区二区三区不卡 | aaaa级日本片免费视频 | 又潮又黄的叫床视频 | 丁香六月婷婷七月激情 | 日韩一级视频免费观看 | 男人的天堂色偷偷之色偷偷 | 欧美高清免费一级在线 | 黄色的视频在线免费观看 | 天天舔天天摸 | avtt加勒比手机版天堂网 | 六月婷婷导航福利在线 | 亚洲一区二区三区免费 | 国产成人精品曰本亚洲77美色 | 欧美日韩高清一本大道免费 | 99久久精品费精品国产一区二 | 国产一级特黄aa大片免费 | 日本大片成人免费播放 | 久久黄视频 | 欧美日韩性猛交xxxxx免费看 | 色欧美在线 | 欧美一区亚洲二区 | 国产精品特黄毛片 | 夜夜网站| 美女扒开尿口给男的桶个爽 | 国产香蕉98碰碰久久人人 | 四虎最新地址 | 欧美一级欧美三级在线观看 | 人人搞人人干 | 免费观看一区二区 | 国产免费午夜高清 | 狠狠狠操| h免费在线观看 | 日本国产高清色www视频在线 | 日本美女黄视频 | 亚洲 美腿 欧美 偷拍 | 中文字幕在线视频第一页 | 国产午夜精品久久久久免费视小说 | 亚洲最大成人综合网 |