項(xiàng)目背景
Agile Upgrade: 用于快速構(gòu)建 bootloader 的中間件。
-
example
文件夾提供 PC 上的示例
特性
-
AES256
-
fastlz
-
quicklz
-
原生適配
file
及fal
操作接口 -
移植簡(jiǎn)單,實(shí)現(xiàn)自定義的后端只需適配幾個(gè)操作接口
-
使用簡(jiǎn)單,幾行代碼即可實(shí)現(xiàn)固件升級(jí)
-
全過(guò)程日志輸出
-
提供過(guò)程回調(diào),可將過(guò)程及進(jìn)度顯示在自定義硬件上
-
基于
RT-Thread 4.1.0
版本 -
基于正點(diǎn)原子探索者開發(fā)板
代碼地址:
https://github.com/loogg/agile_upgrade_mcu_demos
https://github.com/loogg/agile_upgrade
(請(qǐng)復(fù)制至外部瀏覽器打開)
-
目錄結(jié)構(gòu)
2、Bootloader
一般Bootloader
實(shí)現(xiàn)的邏輯如下:
這種方式適合于簡(jiǎn)單的裸機(jī)程序或可控的 OS 程序(即所有外設(shè)硬件都可把控),在準(zhǔn)備環(huán)境的時(shí)候?qū)⑵淙筷P(guān)閉。
但對(duì)于一些復(fù)雜的或者 OS 中輪子已造好的程序,有一些因素不花時(shí)間研究無(wú)法把控,在準(zhǔn)備環(huán)境時(shí)很可能就會(huì)遺漏一些未關(guān)閉導(dǎo)致出各種各樣的問(wèn)題。
這里提供一種萬(wàn)能方法:
- 利用芯片中的不受軟件復(fù)位影響的可供用戶使用的寄存器 (如 STM32 中的備份寄存器)。
- 在需要跳入 APP 運(yùn)行時(shí)將該寄存器賦值然后軟件復(fù)位。
- 在 OS 還沒(méi)初始化時(shí)判斷該寄存器值,如果需要跳轉(zhuǎn)只需要簡(jiǎn)單的準(zhǔn)備環(huán)境即可跳轉(zhuǎn)。
該方法可以使Bootloader
就作為一個(gè) OS 應(yīng)用程序開發(fā),需要跳轉(zhuǎn)的時(shí)候就操作一下寄存器并軟件復(fù)位即可。
該倉(cāng)庫(kù)下所有的Bootloader
例子均使用此方法。
以正點(diǎn)原子探索者開發(fā)板的STM32F4
為例,將system_stm32f4xx.c
文件的SystemInit
函數(shù)修改:
1voidboot_start_application(void);
2voidSystemInit(void)
3{
4boot_start_application();
5
6...
7}
boot_start_application
的實(shí)現(xiàn)為:
1typedefvoid(*boot_app_func)(void);
2voidboot_start_application(void){
3__HAL_RCC_PWR_CLK_ENABLE();
4HAL_PWR_EnableBkUpAccess();
5
6RTC_HandleTypeDefRTC_Handler={0};
7RTC_Handler.Instance=RTC;
8uint32_tbkp_data=HAL_RTCEx_BKUPRead(&RTC_Handler,BOOT_BKP);
9HAL_RTCEx_BKUPWrite(&RTC_Handler,BOOT_BKP,0);
10
11if(bkp_data!=0xA5A5)return;
12
13boot_app_funcapp_func=NULL;
14uint32_tapp_addr=BOOT_APP_ADDR;
15if(((*(__IOuint32_t*)(app_addr+4))&0xff000000)!=0x08000000)return;
16
17/*棧頂?shù)刂吩?28KRAM間*/
18if(((*(__IOuint32_t*)app_addr)-0x20000000)>=(STM32_SRAM_SIZE*1024))return;
19
20app_func=(boot_app_func)*(__IOuint32_t*)(app_addr+4);
21/*Configuremainstack*/
22__set_MSP(*(__IOuint32_t*)app_addr);
23/*jumptoapplication*/
24app_func();
25}
設(shè)置寄存器并軟件復(fù)位的實(shí)現(xiàn)為:
1staticvoidboot_app_enable(void){
2__disable_irq();
3RTC_HandleTypeDefRTC_Handler={0};
4RTC_Handler.Instance=RTC;
5HAL_RTCEx_BKUPWrite(&RTC_Handler,BOOT_BKP,0xA5A5);
6HAL_NVIC_SystemReset();
7}
3、RT-Thread 完整版、RT-Thread Nano 及裸機(jī)對(duì)比
3.1、RTOS 與裸機(jī)
很多人都會(huì)覺(jué)得裸機(jī)開發(fā)比 RTOS 簡(jiǎn)單并且編譯出來(lái)的空間小的多,但以我的開發(fā)經(jīng)驗(yàn)來(lái)說(shuō)并非如此。
-
開發(fā)難易程度
-
裸機(jī)
裸機(jī)開發(fā)經(jīng)常使用的是前后臺(tái)框架,一個(gè)有多步執(zhí)行操作的
task
基本上都是使用switch case
方式。一級(jí)延時(shí)很好處理只需要改變
task
的再一次進(jìn)入時(shí)間即可。嵌套延時(shí)則需要加狀態(tài)位并在函數(shù)中嵌套
switch case
,程序非常臃腫。 -
RTOS
RTOS 中多步操作只需按順序調(diào)用函數(shù)即可,掛起也只需調(diào)用系統(tǒng)提供的 API ,代碼精簡(jiǎn)且邏輯清晰。
-
資源占用
以
RT-Thread Nano
舉例,官方給出的數(shù)據(jù)如下:
1在運(yùn)行兩個(gè)線程(main 線程+ idle 線程)情況下,ROM 和 RAM 依然保持著極小的尺寸。
2以下是基于CortexM3的MDK工程編譯結(jié)果(優(yōu)化等級(jí)3)
3
4TotalROSize(Code+ROData)4000(3.91kB)
5TotalRWSize(RWData+ZIData)1168(1.14kB)
6TotalROMSize(Code+ROData+RWData)4092(4.00kB)
7
從數(shù)據(jù)中可以得知資源占用并沒(méi)有相差非常大。
3.2、RT-Thread 完整版與 RT-Thread Nano
許多人對(duì)于這兩個(gè)的爭(zhēng)議在于:RT-Thread 完整版
資源占用太大,小芯片用不了等等。
這里我就用事實(shí)來(lái)證明并非如此,完全可以裁剪到Nano
一樣的大小,并且RT-Thread 完整版
還支持menuconfig
不需要自己添加代碼文件,真香。
同時(shí)RT-Thread
還有許多純 C 語(yǔ)言的不涉及硬件的軟件包,使用menuconfig
拿來(lái)即用,真香。
這里我以正點(diǎn)原子探索者開發(fā)板bsp
為例,基于RT-Thread v4.1.0
版本,具體工程查看 RTT_Template。
-
CubeMX
生成的 MDK 工程編譯結(jié)果 (優(yōu)化等級(jí) 0)
1TotalROSize(Code+ROData)8120(7.93kB)
2TotalRWSize(RWData+ZIData)1832(1.79kB)
3TotalROMSize(Code+ROData+RWData)8136(7.95kB)
4
-
在運(yùn)行兩個(gè)線程 (main 線程 + idle 線程) 情況下的 MDK 工程編譯結(jié)果 (優(yōu)化等級(jí) 0), 適配了
rt_hw_console_output
1TotalROSize(Code+ROData)13256(12.95kB)
2TotalRWSize(RWData+ZIData)3136(3.06kB)
3TotalROMSize(Code+ROData+RWData)13396(13.08kB)
4
-
兩者比較差值
1TotalROSize(Code+ROData)5136(5.02kB)
2TotalRWSize(RWData+ZIData)1304(1.28kB)
3TotalROMSize(Code+ROData+RWData)5260(5.14kB)
4
從上述數(shù)據(jù)可以得出結(jié)論:RT-Thread 完整版
通過(guò)裁剪可以完全媲美RT-Thread Nano
,所以首選RT-Thread 完整版
。
4、Bootloader 工程使用
tools文件夾下包含了固件打包工具和應(yīng)用層固件app.bin
,起始地址為0x08080000
。
應(yīng)用層分區(qū)如下:
在應(yīng)用程序中下載固件需要使用ymodem_ota -p [dst]
命令,[dst]
為目標(biāo)分區(qū)download_w25q
或download_onchip
。
以下工程編譯結(jié)果都是基于優(yōu)化等級(jí) 0
。
4.1、MinimalistBoot 使用
該工程下提供 3 個(gè)配置文件,通過(guò)ENV
工具的menuconfig
Load
配置并save
為.config
后執(zhí)行scons --target=mdk5 -s
即可生成工程。
該工程未使用動(dòng)態(tài)內(nèi)存分配,故編譯結(jié)果即為真實(shí)內(nèi)存使用。
配置文件分別為:.config.minimal
、.config.w25q_qlz
和.config.shell_qlz
。
-
.config.minimal
極簡(jiǎn)Bootloader
,不支持壓縮和加密類型固件,下載分區(qū)為download_onchip
。
-
.config.w25q_qlz
支持quicklz
方式壓縮的固件,下載分區(qū)為download_w25q
。
-
.config.shell_qlz
支持quicklz
方式壓縮的固件,升級(jí)失敗可通過(guò)敲擊鍵盤Enter
鍵進(jìn)入Shell
,下載分區(qū)為download_onchip
。
4.2、FalBoot 使用
該工程基于FAL
組件,提供 4 個(gè)配置文件,通過(guò)ENV
工具的menuconfig
Load
配置并save
為.config
后執(zhí)行scons --target=mdk5 -s
即可生成工程。
配置文件分別為:.config.minimal
、.config.dev_qlz
、.config.w25q_dev_qlz
和.config.shell_dev_qlz
。
-
.config.minimal
不支持壓縮和加密類型固件,下載分區(qū)為download_onchip
。
-
.config.dev_qlz
使用了設(shè)備框架,支持quicklz
方式壓縮的固件,下載分區(qū)為download_onchip
。
-
.config.w25q_dev_qlz
使用了設(shè)備框架,支持quicklz
方式壓縮的固件,下載分區(qū)為download_w25q
。
-
.config.shell_dev_qlz
使用了設(shè)備框架,支持quicklz
方式壓縮的固件,升級(jí)失敗可通過(guò)敲擊鍵盤Enter
鍵進(jìn)入Shell
,下載分區(qū)為download_onchip
。
———————End———————
你可以添加微信:rtthread2020 為好友,注明:公司+姓名,拉進(jìn)RT-Thread官方微信交流群!
↓點(diǎn)擊閱讀原文報(bào)名
愛(ài)我就請(qǐng)給我在看
原文標(biāo)題:基于RT-Thread完整版搭建的極簡(jiǎn)Bootloader
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
RT-Thread
+關(guān)注
關(guān)注
31文章
1300瀏覽量
40264
原文標(biāo)題:基于RT-Thread完整版搭建的極簡(jiǎn)Bootloader
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論