色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:未知 ? 2023-08-09 19:25 ? 次閱讀

1 概述


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

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

2 調(diào)試之路

2.1 想法

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

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

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

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

2.2 函數(shù)和變量定義在絕對地址的實現(xiàn)

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

2.2.1 IAR的擴展關(guān)鍵字

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

??__no_init禁止系統(tǒng)啟動時初始化變量

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

2.2.2 函數(shù)的絕對定位

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

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

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

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文件中應(yīng)該按照如下格式添加:

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

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

2.3 Bootload 共有函數(shù)的實現(xiàn)

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

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}

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

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

2.4 APP 共有函數(shù)的使用

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

 1/**1.聲明*/
 2
 3typedefint(*app_fun1)(inta,intb);
 4
 5typedefvoid(*app_fun2)(void);
 6
 7typedefchar*(*app_fun3)(char*p);
 8
 9/**2.定義函數(shù)指針類型的變量*/
10
11app_fun1fun1;
12
13app_fun2fun2;
14
15app_fun1fun3;
16
17/**3.共有函數(shù)的重定義*/
18
19#defineFUNC_TABLE_ADDR(0x08010000)/**共有函數(shù)的首地址*/
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 區(qū)域調(diào)用 Bootload 中固化的接口了,不過要注意這種方式調(diào)試起來不是很方便,需要前期驗證好 Bootload 中封裝的接口有沒有問題。

3 注意事項


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

1. 固件更新區(qū)的絕對定位的函數(shù),不能隨意調(diào)用其他庫函數(shù),那些被調(diào)用的函數(shù)也必須是絕對定位的。

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

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

4 調(diào)試坎坷之路

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

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};

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

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/**對應(yīng)的修改.icf文件*/
6
7placeataddressmem:0x08010000{readonlysection.AHBAPB_PRESC_TABLE};
8
9placeataddressmem:0x08010010{readonlysection.ADC_PRESC_TABLE};

5 補充

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

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

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

版權(quán)聲明:本文為RT-Thread論壇用戶「crystal266」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

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


點擊閱讀原文進入官網(wǎng)


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

文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

    關(guān)注

    31

    文章

    1296

    瀏覽量

    40241

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

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    OTA升級】無需數(shù)據(jù)線,條命令即可完成固件升級

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

    【xG24 Matter開發(fā)套件試用體驗】BLE OTA調(diào)試

    最近學(xué)習(xí)和調(diào)試了FR32xG24 Explorer Kit 開發(fā)套件的藍牙OTA功能,記錄一下調(diào)試過程。 基于Blinky demo程序進行調(diào)試
    發(fā)表于 08-29 18:26

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

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

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

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

    ESP8266 OTA升級不成功的原因?

    我正在使用最新的 RTOS SDK 版本 1.5 ESP8266。我使用自定義服務(wù)器進行OTA升級。 有時 OTA 升級成功,有時即使閃爍了正確的圖像,
    發(fā)表于 07-10 06:14

    esp32-s3 ota固件升級報錯怎么解決?

    a new connection E (118466) HTTP_CLIENT: Connection failed, sock < 0 連上wifi后,通過ESP HTTPS OTA進行固件升級報錯,希望能得到解決,感
    發(fā)表于 06-17 08:30

    請問esp32 ota升級如何獲取更新進度?

    所用的是esp32-s2 idf:4.4調(diào)用esp_https_ota API進行固件升級,想獲取更新進度,但不知道怎么實現(xiàn),有人做過或者有思路指點
    發(fā)表于 06-14 07:20

    ESP-IDF4.4 OTA升級失敗的原因?

    ESP-IDF4.4 OTA 功能,在啟動OTA功能后下載固件過程中出現(xiàn)wifi無Internet訪問,然后很快網(wǎng)絡(luò)恢復(fù),需要等待很久后OTA升級
    發(fā)表于 06-06 08:19

    ZDP1440系列小技巧—如何OTA差分升級顯示素材?

    ZDP1440是款基于開源GUI引擎的圖像顯示專用驅(qū)動芯片,支持U盤、SD卡本地升級UI固件,同時也支持通過UART/SPI方式進行OTA升級
    的頭像 發(fā)表于 05-06 14:01 ?928次閱讀
    ZDP1440系列小技巧—如何<b class='flag-5'>OTA</b>差分<b class='flag-5'>升級</b>顯示素材?

    技術(shù)帖 | RK3568開發(fā)板的OTA升級教程

    說起OTA我們應(yīng)該都不陌生,它是一種可以為設(shè)備無損失升級系統(tǒng)的方式,能將新功能遠程部署到產(chǎn)品上。我們不僅可以通過網(wǎng)絡(luò)下載OTA升級包,也可以
    的頭像 發(fā)表于 04-20 08:01 ?1687次閱讀
    技術(shù)帖 | RK3568開發(fā)板的<b class='flag-5'>OTA</b><b class='flag-5'>升級</b>教程

    請問BlueNRG ota升級ota_sw_activation變量上電是隨機值嗎?

    最近在看BlueNRG ota升級代碼時有個疑惑,ota_sw_activation變量是個未初始化的值,按照ram特性上電應(yīng)該是
    發(fā)表于 03-13 08:29

    stm32l071cbt6如何升級串口BC28的OTA

    關(guān)于stm32l071cbt6,串口BC28 的OTA升級,有沒有操作過的?沒有思路
    發(fā)表于 03-08 08:05

    汽車ota升級有什么用 汽車ota功能有必要嗎

    汽車OTA(Over-The-Air)升級是指通過無線網(wǎng)絡(luò)進行汽車軟件系統(tǒng)的遠程更新和升級。傳統(tǒng)上,汽車的軟件系統(tǒng)需要通過專門的設(shè)備或者到車輛所在的服務(wù)中心來進行升級,非常不便捷。而
    的頭像 發(fā)表于 02-18 14:39 ?1368次閱讀

    ota升級是什么意思 ota升級有什么用

    OTA(Over-the-Air)升級是指通過無線網(wǎng)絡(luò),將軟件、固件或系統(tǒng)的新版本傳輸?shù)街С值脑O(shè)備上進行更新和安裝的過程。這技術(shù)廣泛應(yīng)用于手機、智能電視、汽車等各類智能設(shè)備中。本文將
    的頭像 發(fā)表于 02-02 10:25 ?5591次閱讀

    深入了解物聯(lián)網(wǎng)設(shè)備的OTA升級機制

    OTA(Over-The-Air,空中下載技術(shù))是一種無線傳輸技術(shù),用于在物聯(lián)網(wǎng)設(shè)備之間進行遠程更新和配置。OTA指的是通過無線通信網(wǎng)絡(luò)來遠程更新或
    發(fā)表于 01-21 10:03 ?1979次閱讀
    深入了解物聯(lián)網(wǎng)設(shè)備的<b class='flag-5'>OTA</b><b class='flag-5'>升級</b>機制
    主站蜘蛛池模板: 国产精品久久久久精品A片软件| www.日本 高清.com| 青青草原伊人| 老汉老太bbbbbxxxxx| 国内精品自线在拍2020不卡 | 高清国语自产拍免费| hdxxxx58丝袜连裤袜| 97人妻AV天天澡夜夜爽| 在线欧美精品一区二区三区| 亚洲三级黄色| 亚洲一区电影在线观看| 亚洲免费视频在线观看| 亚洲色欲H网在线观看| 亚洲色婷婷久久精品AV蜜桃久久| 亚洲精品线在线观看| 亚洲无遮挡无码A片在线| 亚洲综合日韩中文字幕v在线| 亚洲欭美日韩颜射在线二| 亚洲欧美一区二区久久| 伊人影院蕉久| 91亚洲精品| 办公室中文BD| 国产白色视频在线观看w| 日韩中文无线码在线视频| 欧美日韩亚洲一区视频二区| 欧洲人交xxx69| 日韩一级精品久久久久| 网友自拍区视频精品| 亚洲精品日韩在线观看视频| 亚洲视频在线观看免费| 中文视频在线观看| 99久视频只有精品2019| 动漫美女被h动态图| 国产亚洲美女精品久久久2020| 好好的曰com久久| 久久伊人电影| 秋霞伦理电影在线看| 我半夜摸妺妺的奶C了她软件| 亚洲精品卡2卡3卡4卡5卡区| 最近最新中文字幕MV高清在线| abp-146|