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