熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

"); //-->

博客專欄

EEPW首頁 > 博客 > 分享一個OTA升級相關的應用實踐?。?)

分享一個OTA升級相關的應用實踐!(1)

發(fā)布人:魚鷹談單片機 時間:2023-04-23 來源:工程師 發(fā)布文章

大家好,我是雜燴君。

本次與大家分享一個ota升級相關的應用實踐。

應用場景

某項目中,有三塊控制板協(xié)同工作,WiFi模塊掛在其中一塊板上:

圖片


其中,三塊板子都有升級的需求。即board1需要從云端下載各板子的升級文件之后通過串口分發(fā)給另外兩塊板子。

思路及一些縮減代碼

作為board1的開發(fā)者,除了處理好給board2、board3分包分發(fā)升級文件之外,還需要處理好整個升級過程的可視化反饋,即需要在手機APP上顯示出當前的升級進度。

為了顯示這個升級進度,可能需要考慮如下情況:

1、下載升級包的過程與傳輸升級包(以下我稱為安裝)的進度需不需要分開?

這里我們選擇分開,即手機APP觸發(fā)升級,下載過程,手機APP顯示下載進度,下載進度走完100之后,顯示安裝進度。

圖片圖片

一方面比較方便地能看出當前處于升級的那個過程,對于研發(fā)而言可以方便定位分析問題,對于用戶體驗上也不會給用戶增加更多的使用成本。

此處,下載升級包的過程其實不受我們控制的,這一塊阿里的SDK已經(jīng)給我們做好,但有些云平臺的設備SDK可能沒有沒有做這個固件下載的過程,可能只提供了固件所在文件服務器的http鏈接,需要我們自行進行下載,固件下載過程可參照這篇文章:C語言實現(xiàn)http下載器(附代碼)

我們要處理的其實就是下載完升級包之后的事情,如解壓升級包、安裝。

2、每次升級可能不是升級所有的板子,如何處理?

啟動安裝的時候,通過比對各板子升級文件的md5值與本地保存的md5值確認是否是新的固件,并且通過這個比對我們就知道了當前升級包中的需要升級哪些板子。

三塊板子組合的升級情況全部列舉如下:

左右滑動查看全部代碼>>>

// OTA升級情況
#define DEV_NON_SELECTED      0   // 設備沒有被選中
#define BOARD1_DEV_SELECTED   1   // board1設備被選中
#define BOARD2_DEV_SELECTED   2   // board2設備被選中
#define BOARD3_DEV_SELECTED   4   // board3設備被選中
typedef enum _ota_update_case
{
    UPDATE_SELECTED_NULL         = -1,                                                              // 初始值
    UPDATE_NON_DEV               = 0,                                                               // 沒有設備要升級
    UPDATE_BOARD1_DEV            = BOARD1_DEV_SELECTED,                                             // 只升級board1設備
    UPDATE_BOARD2_DEV            = BOARD2_DEV_SELECTED,                                             // 只升級board2設備
    UPDATE_BOARD3_DEV            = BOARD3_DEV_SELECTED,                                             // 只升級board3設備
    UPDATE_BOARD1_AND_BOARD2_DEV = BOARD1_DEV_SELECTED + BOARD2_DEV_SELECTED,                       // 升級board1與board2設備
    UPDATE_BOARD1_AND_BOARD3_DEV = BOARD1_DEV_SELECTED + BOARD3_DEV_SELECTED,                       // 升級board1與board3設備
    UPDATE_BOARD2_AND_BOARD3_DEV = BOARD2_DEV_SELECTED + BOARD3_DEV_SELECTED,                       // 升級board2與board3設備
    UPDATE_ALL_DEV               = BOARD1_DEV_SELECTED + BOARD2_DEV_SELECTED + BOARD3_DEV_SELECTED, // 升級所有設備
}ota_update_case_e;

獲取當前升級包屬于哪一種升級情況:

左右滑動查看全部代碼>>>

// 獲取升級情況
static ota_update_case_e get_ota_update_case(void)
{
    md5sum_t calc_board1_img_md5 = {0};
    md5sum_t calc_board2_img_md5 = {0};
    md5sum_t calc_board3_img_md5 = {0};
    ota_update_case_e ota_update_case = UPDATE_SELECTED_NULL;
    ota_update_case_e board1_update_case = UPDATE_SELECTED_NULL;
    ota_update_case_e board2_update_case = UPDATE_SELECTED_NULL;
    ota_update_case_e board3_update_case = UPDATE_SELECTED_NULL;

    // 讀取升級文件md5參數(shù)表
    bzero(&s_flash_ota_file_md5_list, sizeof(s_flash_ota_file_md5_list));
    read_ota_md5_list_from_file(&s_flash_ota_file_md5_list, sizeof(s_flash_ota_file_md5_list)); 

    // 計算各升級文件的md5值
    calc_file_md5(OTA_BOARD1_DEV_IMG_FILE, &calc_board1_img_md5);
    calc_file_md5(OTA_BOARD2_DEV_IMG_FILE, &calc_board2_img_md5);
    calc_file_md5(OTA_BOARD3_DEV_IMG_FILE, &calc_board3_img_md5);

    // 檢測是否選中board1設備
    if (0 == access(OTA_BOARD1_DEV_IMG_FILE, F_OK) && 
        FALSE == check_md5_equal(&calc_board1_img_md5, &s_flash_ota_file_md5_list[OTA_IMG_INDEX_BOARD1_DEV]))
    {
        LOG_D("BOARD1_DEV_SELECTED");
        board1_update_case = BOARD1_DEV_SELECTED;
    }
    else
    {
        LOG_D("board1 install file not exist or unchanged, not install");
        board1_update_case = DEV_NON_SELECTED;
    }

    // 檢測是否選中board2設備
    if (0 == access(OTA_BOARD2_DEV_IMG_FILE, F_OK) && 
        FALSE == check_md5_equal(&calc_board2_img_md5, &s_flash_ota_file_md5_list[OTA_IMG_INDEX_BOARD2_DEV]))
    {
        LOG_D("BOARD2_DEV_SELECTED");
        board2_update_case = BOARD2_DEV_SELECTED;
    }
    else
    {
        LOG_D("board2 install file not exist or unchanged, not install");
        board2_update_case = DEV_NON_SELECTED;
    }

    // 檢測是否選中board3設備
    if (0 == access(OTA_BOARD3_DEV_IMG_FILE, F_OK) && 
        FALSE == check_md5_equal(&calc_board3_img_md5, &s_flash_ota_file_md5_list[OTA_IMG_INDEX_BOARD3_DEV]))
    {
        LOG_D("BOARD3_DEV_SELECTED");
        board3_update_case = BOARD3_DEV_SELECTED;
    }
    else
    {
        LOG_D("board3 install file not exist or unchanged, not install");
        board3_update_case = DEV_NON_SELECTED;
    }

    // 升級的情況
    ota_update_case = board1_update_case + board2_update_case + board3_update_case;
    LOG_D("ota_update_case = %d", ota_update_case);

    return ota_update_case;
}
3、各種不同升級包情況,如何處理?

因為WiFi掛在board1上,所以整個升級過程,如果board1需要升級的話,board1需要放在最后升級,因為board1升級的過程中會與手機APP斷連。

三塊板的固件安裝:

static void start_board1_ota_install(void)
static void start_board2_ota_install(void);
static void start_board3_ota_install(void);
  • start_board1_ota_install為安裝board1固件的過程。安裝board1固件的過程很簡單,可以看做一次板子重啟,升級安裝命令如:
#define OTA_BOARD1_DEV_IMG_FILE   OTA_FIREWARE_EXTRACT_FILE_PATH "board1_update.img"         // board1固件
#define SHELL_CMD_START_BOARD1_DEV_OTA_INSTALL    "updateEngine --image_url=" OTA_BOARD1_DEV_IMG_FILE " --misc=update --savepath=" OTA_BOARD1_DEV_IMG_FILE " --reboot"
  • start_board2_ota_install為安裝board2固件的過程。安裝board2固件的過程即board1往board2發(fā)送board2固件的過程,整個過程通過數(shù)據(jù)傳輸量占總數(shù)據(jù)量的大小可表明安裝進度。
  • start_board3_ota_install安裝board3固件的過程,安裝board3固件的過程即board1往board3發(fā)送board3固件的過程,整個過程通過數(shù)據(jù)傳輸量占總數(shù)據(jù)量的大小可表明安裝進度。


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



關鍵詞: 單片機

相關推薦

技術專區(qū)

關閉