天天看點

#夏日挑戰賽# 基于LiteOS Studio零成本學習LiteOS物聯網作業系統

「本文正在參加星光計劃3.0–夏日挑戰賽」

大家在學習物聯網作業系統開發的時候,都不得不準備一套開發闆和仿真器,也是一筆不小的投資。LiteOS社群現在對外開放了對Qemu模拟器的适配工程,在不使用開發闆的情況下,也可以搭建LiteOS開發環境,做到零成本,非常友善初學者學習。

1、Qemu簡介

Qemu是一套由FabriceBellard編寫的以GPL許可證的模拟處理器,在GNU/Linux平台上使用廣泛,也支援在X86環境上運作。有關Qemu的介紹可參考其github社群内容。LiteOS Stduio使用Qemu realview-pbx-a9開發闆來模拟運作LiteOS開源工程。本文主要介紹Windows下基于Qemu運作LiteOS。

2、安裝Qemu

在Windows上安裝Qemu。下載下傳qemu-w64-setup-20201124.exe,預設安裝即可,不再贅述。如下圖:

HUAWEI LiteOS Studio 是以VisualStudio Code社群開源代碼為基礎,根據LiteOS嵌入式系統軟體開發語言、業務場景等特點開發的一款輕量級定制內建開發環境解決方案。對于熟悉Visual Studio Code的開發者,非常容易上手。

通路LiteOS Studio官網,下載下傳LiteOS Studio安裝軟體,安裝過程非常簡單,直接看官網資料即可,不贅述。安裝完畢之後,需要參考官網文檔,搭建windows開發環境(如下圖)。

注意,建立工程時,需要git用戶端工具,請確定本地已安裝git for windows工具并添加環境變量。

3、建立Qemu仿真工程

點選建立工程圖示,打開建立工程界面。在使用LiteOS Studio建立工程時,確定網絡暢通,可以通路LiteOS開源社群站點https://gitee.com/LiteOS/LiteOS。

  • 工程名稱:填入自定義的工程名
  • 工程目錄:填入或選擇工程存儲路徑
  • SDK版本号:選擇Gitee-LiteOS-Master
  • 開發闆清單:選擇Qemureakview-pbx-a9開發闆

點選确認,背景将下載下傳并儲存所選目标闆的SDK,下載下傳完成後自動打開建立的工程。

4、編譯Qemu仿真工程

點選工具欄上的編譯圖示, 開始編譯。編譯成功後,在控制台輸出如下資訊:

在編譯完畢,打開工程設定,在燒錄器Burner和調測器Debugger設定裡,分别設定需要燒錄的bin檔案和調測使用的elf可執行檔案,分别如下圖:

燒錄器Burner配置:

#夏日挑戰賽# 基于LiteOS Studio零成本學習LiteOS物聯網作業系統

調試器Debugger配置:

#夏日挑戰賽# 基于LiteOS Studio零成本學習LiteOS物聯網作業系統

除了燒錄器、調試器,LiteOS Studio工程設定還支援對開發闆、編譯器、元件管理、序列槽等進行設定,大家可以自行檢視相應的設定。本文使用預設設定即可,設定完畢後,點選确認Comfirm儲存。

5、運作Qemu仿真工程

對于真實開發闆,需要把鏡像bin或者hex檔案燒錄到開發闆,才能運作。使用Qemu模拟器好處是并不需要真實燒錄,啟動Qemu傳入鏡像參數即可。我們複用燒錄功能,點選工具欄上的圖示進行燒錄,啟動Qemu模拟器運作編譯的LiteOS工程。

運作成功的截圖如下:

#夏日挑戰賽# 基于LiteOS Studio零成本學習LiteOS物聯網作業系統

預設的配置時,輸出啟動資訊後,就進入shell模式,我們可以輸入task,檢視運作中的任務的資訊。更多LiteOS shell指令,請參考 https://gitee.com/LiteOS/LiteOS/tree/master/shell 。Shell指令輸出示例如下:

#夏日挑戰賽# 基于LiteOS Studio零成本學習LiteOS物聯網作業系統

如果想退出Qemu運作,在Terminal終端視窗同時按Ctrl + A,然後按X鍵即可退出。

6、配置Qemu仿真工程運作Kernel Demo

LiteOS是高度可配置的系統,除了預設設定,我們可以在工程設定--元件管理中對系統元件配置進行定制。這裡示範下如何開啟Kernel Demo在Qemu模拟器上運作。

#夏日挑戰賽# 基于LiteOS Studio零成本學習LiteOS物聯網作業系統

開啟的這個Kernel Task DemoDemo代碼執行入口如下:

UINT32 Example_TskCaseEntry(VOID)
{
    UINT32 ret;
    TSK_INIT_PARAM_S stInitParam;

    /* lock task shcedue */
    printf("\nKernel task demo begin.\n");
    LOS_TaskLock();

    printf("LOS_TaskLock() ok.\n");

    stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskHi;
    stInitParam.usTaskPrio = TSK_PRIOR_HI;
    stInitParam.pcName = "HIGH_NAME";
    stInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
    /* create high prio task */
    ret = LOS_TaskCreate(&g_demoTaskHiId, &stInitParam);
    if (ret != LOS_OK) {
        LOS_TaskUnlock();

        printf("Example_TaskHi failed.\n");
        return LOS_NOK;
    }

    printf("Create Example_TaskHi ok.\n");

    stInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_TaskLo;
    stInitParam.usTaskPrio = TSK_PRIOR_LO;
    stInitParam.pcName = "LOW_NAME";
    stInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
    /* create low prio task */
    ret = LOS_TaskCreate(&g_demoTaskLoId, &stInitParam);
    if (ret != LOS_OK) {
        /* delete high prio task */
        if (LOS_OK != LOS_TaskDelete(g_demoTaskHiId)) {
            printf("Delete TaskHi failed.\n");
        }

        LOS_TaskUnlock();

        printf("Create Example_TaskLo failed.\n");

        return LOS_NOK;
    }

    printf("Create Example_TaskLo ok.\n");

    /* unlock task schedue */
    LOS_TaskUnlock();
    LOS_TaskDelay(40);
    
    return ret;
}
           

示例代碼先後建立了2個任務,一個名為HIGH_NAME、一個名為LOW_NAME。在兩個任務裡,示範了Task相關的接口LOS_TaskSuspend、LOS_TaskResume、LOS_TaskDelay、LOS_TaskDelete的使用。更完整的示例請通路https://gitee.com/LiteOS/LiteOS/blob/master/demos/kernel/api/los_api_task.c。

了解到Demo代碼後,重新編譯一下。編譯成功後,點選燒錄按鈕運作,即可看到如下輸出:

#夏日挑戰賽# 基于LiteOS Studio零成本學習LiteOS物聯網作業系統

看到實際運作的效果後,建議讀者們好好閱讀下相關的Demo代碼,包含任務、記憶體管理、中斷、IPC通信、時間管理、雙向連結清單、任務同步等。請參考:https://gitee.com/LiteOS/LiteOS/tree/master/demos/kernel

7、調測Qemu仿真工程

HUAWEI LiteOS Studio 調測非常簡單易用,點選工具欄上的調測按鈕即可開啟GDB圖形化調測。對于我們的Qemu工程,開始調測後的界面如下:

#夏日挑戰賽# 基于LiteOS Studio零成本學習LiteOS物聯網作業系統

對界面上的區域進行介紹下:

  • 變量Variable

    展示局部變量、全局變量、靜态變量的值。

  • 監視Watch

    監視指定的表達式,可以輸入變量名稱或者表達式,實時計算結果。

  • 調用堆棧Call Stack

    展示目前運作狀态和暫停狀态的任務調用堆棧。

  • 斷點Breakpoints

    展示設定的斷點。

  • 寄存器Registers

    檢視各個寄存器的數值,支援複制數值操作。

  • 源代碼視窗

    高亮顯示目前執行的源代碼行。

  • 反彙編視窗

    對應目前源代碼檔案行所在的反彙編代碼。

  • 輸出Output

    展示GDB用戶端的輸出日志。

  • 調試控制台Debug Console

    展示GDB Server的輸出日志。

    讀者們可以繼續嘗試,繼續、單步、跳入、調測、停止等調測動作。更加詳細的調測介紹,請參考 ---調試器-執行調試。

本文示範了如何準備LiteOS Studio環境,如何建立Qemu工程,如何編譯、燒錄、如何元件配置Kernel Demo、如何GDB調測。

LiteOS Studio工具還是容易上手的,非常适合學習物聯網開發的。特别是對于初學者,不需要購買開發闆,即可以學習、體驗LiteOS物聯網作業系統開發。通過對LiteOS開源社群提供的Kernel Demo的學習、實際上手練習,,會對LiteOS作業系統核心會有個更深入的了解。

8、附資料:

LiteOS Studio社群資料:https://liteos.gitee.io/liteos_studio/#/

LieOS開源代碼:https://gitee.com/liteos

Qemu介紹: https://github.com/qemu/qemu

QEMU Binaries for Windows (64 bit)下載下傳:https://qemu.weilnetz.de/w64/

Linux環境基于Qemu運作LiteOS,請參考:https://gitee.com/LiteOS/LiteOS/blob/master/targets/realview-pbx-a9/README_CN.md