OpenHarmony內核編程接口—介紹線程管理與通用等待功能案例
前言
本文介紹了內核編程接口之線程和等待
線程管理
線程的概念和狀態
thread指在一個進程(process)空間內,可以被操作系統單獨調度的運行單位,與同一進程的其他線程共享進程的地址空間和運行上下文。
ps: 在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位。
線程狀態大致分為五個狀態:RUNNING,READY,BLOCKED,TERMINATED,INACTIVE。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
RUNNING:當前正在運行的線程處于RUNNING狀態需要注意的是一次只能有一個線程處于此狀態。
READY:準備運行的線程處于READY狀態,一旦RUNNING線程終止或被BLOCKED,具有最高優先級的下一個READY線程將成為RUNNING線程。
BLOCKED:被延遲,等待事件發生或掛起的線程處于BLOCKED狀態。
TERMINATED:調用osThreadTerminate接口時,線程在資源尚未釋放的情況下被TERMINATED。
INACTIVE:未創建或已終止并釋放所有資源的線程處于INACTIVE狀態。
內核編程的intelliSense設置
ps:因為作者已經設置過includePath了,所以kernel\liteos_m\kal\cmsis\cmsis_os2.h下的頭文件沒有爆紅。
直接修改 .vscode\c_cpp_properties.json文件。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
輸入includePath即可,注意逗號。
"${workspaceFolder}/kernel/liteos_m/kal"
"${workspaceFolder}/kernel/liteos_m/kal/cmsis"
"${workspaceFolder}/device/hisilicon/hispark_pegasus/sdk_liteos/platform/os/Huawei_LiteOS/components/lib/libc/musl/arch/riscv32"
案例演示
準備好開發套件。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
ps:目前osThreadDetach,osThreadJoin,osThreadEnumerate接口暫未實現,案例沒有演示。
在源碼中查看接口詳細信息,根據路徑kernel\liteos_m\kal\cmsis\cmsis_os2.h 找到cmsis_os2.h文件。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
舉osThreadNew接口的例子,ctrl+f 輸入對你想要查看的接口名稱進行搜索,可快速定位。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
根據路徑,新建文件:
- applications\sample\wifi-iot\app\thread_demo\thread.c
- applications\sample\wifi-iot\app\thread_demo\BUILD.gn
首先是頭文件。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
創建線程,返回線程id,封裝成一個函數,便于調用。
osThreadId_t newThread(char *name, osThreadFunc_t func, void *arg)
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
創建一個線程測試函數。
線程名稱,狀態。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
創建主線程函數。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
線程的優先級。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
掛起,恢復線程。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
線程??臻g大小,未使用??臻g大小。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
活躍線程數,最后終止線程。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
定義此demo的入口函數,最后別忘了使用宏 APP_FEATURE_INIT 讓入口函數執行。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
修改腳本文件,注意文件路徑。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
編譯成功。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
燒錄成功。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
運行成功。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
通用等待功能
時間管理
時間管理指內核的時間管理模塊以系統時鐘為基礎,給應用程序提供所有和時間有關的服務。
系統時鐘:Tick或時標,由定時器或計數器產生的輸出脈沖觸發中斷產生的信號;OS會對Tick 計數,一般定義為整數或長整數;系統時鐘的絕對精度可達百萬分之50。
時鐘周期
時鐘周期指由定時器或計數器產生的輸出脈沖的周期,即兩個Tick間隔的時間長度。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
API接口介紹
osDelay,osDelayUntil,用到兩個內核信息與控制的API(osKernelGetTickCount,osKernelGetTickFreq),主要介紹 osDelay 接口。
osDelay 顧名思義就是等待指定的Ticks,線程執行完 osDelay 后,會從RUNNING狀態被LiteOS轉換為BLOCKED狀態,在指定的Ticks到達后,線程會被LiteOS轉換為READY狀態。此時如果線程擁有最高優先權,它將被LiteOS立即調度也就是立即進入RUNNING狀態。
osDelay(1) 等待下一個tick出現,一定是等待一個cycle嗎,所以需要分情況討論。
ps:1cycle=10ms
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
案例演示
根據路徑,自行建立源碼文件和腳本文件:
- applications\sample\wifi-iot\app\delay_demo\delay.c
- applications\sample\wifi-iot\app\delay_demo\BUILD.gn
添加頭文件。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
創建主線程函數。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
創建入口函數。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
最后別忘了定義宏 APP_FEATURE_INIT運行入口函數。
APP_FEATURE_INIT(DelayTestTask);
修改編譯腳本文件,注意編譯腳本路徑。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
編譯成功。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
燒錄成功。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區
運行成功。
【OpenHarmony內核編程接口】介紹線程管理與通用等待功能案例-開源基礎軟件社區