OH操作系統(tǒng)基礎(chǔ):Thread多線程_第1頁
OH操作系統(tǒng)基礎(chǔ):Thread多線程_第2頁
OH操作系統(tǒng)基礎(chǔ):Thread多線程_第3頁
OH操作系統(tǒng)基礎(chǔ):Thread多線程_第4頁
OH操作系統(tǒng)基礎(chǔ):Thread多線程_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、OH操作系統(tǒng)基礎(chǔ):Thread多線程未來已來 遠(yuǎn)方不遠(yuǎn)2021年12月本示例將演示如何在Niobe WiFi IoT開發(fā)板上使用cmsis 2.0 接口進(jìn)行多線程開發(fā)。簡介CMSIS是Cortex微控制器軟件接口標(biāo)準(zhǔn)(Cortex Microcontroller Software Interface Standard)是ARM和一些編譯器廠家以及半導(dǎo)體廠家共同遵循的一套標(biāo)準(zhǔn),是由ARM專門針對Cortex-M系列提出的標(biāo)準(zhǔn)。在該標(biāo)準(zhǔn)的約定下,ARM和芯片廠商會提供一些通用的API接口來訪問Cortex內(nèi)核以及一些專用外設(shè),以減少更換芯片以及開發(fā)工具等移植工作所帶來的金錢以及時間上的消耗。CMS

2、IS-RTOS2(CMSIS-RTOS API Version 2)是Arm Cortex-M 處理器的通用的RTOS接口。為需要RTOS功能的軟件組件提供了標(biāo)準(zhǔn)化的API。CMSIS-RTOS2是一個通用的API,它與底層的RTOS內(nèi)核無關(guān),寫應(yīng)用程序的程序員在用戶代碼中調(diào)用CMSIS RTOS2 API函數(shù),可以更方便地將應(yīng)用程序從一個RTOS到另一個RTOS,使用CMSIS-RTOS2 API的中間件也可以避免很多不必要的移植工作。鴻蒙在CMSIS-RTOS2接口中封裝了LiteOS-m的內(nèi)核代碼cmsis 2.0接口 1. 線程的基本概念2. 線程的狀態(tài)3. 創(chuàng)建線程目錄從系統(tǒng)角度看,

3、線程是競爭系統(tǒng)資源的最小運(yùn)行單元。線程可以使用或等待CPU、使用內(nèi)存空間等系統(tǒng)資源,并獨立于其它線程運(yùn)行。OpenHarmony LiteOS可以給用戶提供多個線程,實現(xiàn)線程間的切換,幫助用戶管理業(yè)務(wù)程序流程。具有如下特性:支持多線程。一個線程代表一個任務(wù)搶占式調(diào)度機(jī)制,高優(yōu)先級的線程可打斷低優(yōu)先級線程,低優(yōu)先級線程必須在高優(yōu)先級線程阻塞或結(jié)束后才能得到調(diào)度。相同優(yōu)先級線程支持時間片輪轉(zhuǎn)調(diào)度方式。共有32個優(yōu)先級0-31,最高優(yōu)先級為0,最低優(yōu)先級為31。用戶進(jìn)程可配置的優(yōu)先級有22個 (1031)?;靖拍罹€程有多種運(yùn)行狀態(tài)。系統(tǒng)初始化完成后,創(chuàng)建的線程就可以在系統(tǒng)中競爭一定的資源,由內(nèi)核進(jìn)

4、行調(diào)度。線程狀態(tài)通常分為以下四種:就緒(Ready):該線程在就緒隊列中,只等待CPU。運(yùn)行(Running):該線程正在執(zhí)行。阻塞(Blocked):該線程不在就緒隊列中。包含線程被掛起(suspend狀態(tài))、線程被延時(delay狀態(tài))、線程正在等待信號量、讀寫隊列或者等待事件等。退出態(tài)(Dead):該線程運(yùn)行結(jié)束,等待系統(tǒng)回收資源。線程狀態(tài)就緒態(tài)運(yùn)行態(tài): 任務(wù)創(chuàng)建后進(jìn)入就緒態(tài),發(fā)生任務(wù)切換時,就緒隊列中最高優(yōu)先級的任務(wù)被執(zhí)行,從而進(jìn)入運(yùn)行態(tài),同時該任務(wù)從就緒隊列中移出。運(yùn)行態(tài)阻塞態(tài) :正在運(yùn)行的任務(wù)發(fā)生阻塞(掛起、延時、讀信號量等)時,將該任務(wù)插入到對應(yīng)的阻塞隊列中,任務(wù)狀態(tài)由運(yùn)行態(tài)變成

5、阻塞態(tài),然后發(fā)生任務(wù)切換,運(yùn)行就緒隊列中最高優(yōu)先級任務(wù)。阻塞態(tài)就緒態(tài)(阻塞態(tài)運(yùn)行態(tài)):阻塞的任務(wù)被恢復(fù)后(任務(wù)恢復(fù)、延時時間超時、讀信號量超時或讀到信號量等),此時被恢復(fù)的任務(wù)會被加入就緒隊列,從而由阻塞態(tài)變成就緒態(tài);此時如果被恢復(fù)任務(wù)的優(yōu)先級高于正在運(yùn)行任務(wù)的優(yōu)先級,則會發(fā)生任務(wù)切換,該任務(wù)由就緒態(tài)變成運(yùn)行態(tài)。線程狀態(tài)遷移就緒態(tài)阻塞態(tài) : 任務(wù)也有可能在就緒態(tài)時被阻塞(掛起),此時任務(wù)狀態(tài)由就緒態(tài)變?yōu)樽枞麘B(tài),該任務(wù)從就緒隊列中刪除,不會參與任務(wù)調(diào)度,直到該任務(wù)被恢復(fù)。運(yùn)行態(tài)就緒態(tài) : 有更高優(yōu)先級任務(wù)創(chuàng)建或者恢復(fù)后,會發(fā)生任務(wù)調(diào)度,此刻就緒隊列中最高優(yōu)先級任務(wù)變?yōu)檫\(yùn)行態(tài),那么原先運(yùn)行的任務(wù)由

6、運(yùn)行態(tài)變?yōu)榫途w態(tài),依然在就緒隊列中。運(yùn)行態(tài)退出態(tài) : 運(yùn)行中的任務(wù)運(yùn)行結(jié)束,任務(wù)狀態(tài)由運(yùn)行態(tài)變?yōu)橥顺鰬B(tài)。退出態(tài)包含任務(wù)運(yùn)行結(jié)束的正常退出狀態(tài)以及Invalid狀態(tài)。例如,任務(wù)運(yùn)行結(jié)束但是沒有自刪除,對外呈現(xiàn)的就是Invalid狀態(tài),即退出態(tài)。阻塞態(tài)退出態(tài) : 阻塞的任務(wù)調(diào)用刪除接口,任務(wù)狀態(tài)由阻塞態(tài)變?yōu)橥顺鰬B(tài)。對于多線程的場景,HarmonyOS內(nèi)核管理線程靠任務(wù)池和就緒隊列,執(zhí)行靠調(diào)度算法。調(diào)度算法:HarmonyOS內(nèi)核中的線程采用搶占式調(diào)度機(jī)制,同時支持SCHED_RR和SCHED_FIFO調(diào)度策略線程管理RR策略能基本保證我們每個任務(wù)都能夠得到有效的執(zhí)行,不會有一些任務(wù)進(jìn)行長時間等待F

7、IFO策略優(yōu)點在于任務(wù)的切換比較簡單,而且對于一些時間片不好把握的任務(wù)來說,F(xiàn)IFO能偶更有效的利用我們的cpu。頭文件:”/third_party/cmsis/CMSIS/RTOS2/Include/cmsis_os2.h”線程創(chuàng)建-API介紹API功能描述osThreadNew創(chuàng)建線程osThreadTerminate刪除某個線程(一般是對非自線程操作)osThreadYield掛起當(dāng)前線程osThreadSuspend掛起指定線程osThreadResume恢復(fù)指定線程osThreadExit終止當(dāng)前線程osThreadTerminate終止指定線程函數(shù)osThreadNew通過將線程添

8、加到活動線程列表并將其設(shè)置為就緒狀態(tài)來啟動線程函數(shù)。線程函數(shù)的參數(shù)使用參數(shù)指針*argument傳遞。當(dāng)創(chuàng)建的thread函數(shù)的優(yōu)先級高于當(dāng)前運(yùn)行的線程時,創(chuàng)建的thread函數(shù)立即啟動并成為新的運(yùn)行線程。線程屬性是用參數(shù)指針attr定義的。屬性包括線程優(yōu)先級、堆棧大小或內(nèi)存分配的設(shè)置??梢栽赗TOS啟動(調(diào)用 osKernelStart)之前安全地調(diào)用該函數(shù),但不能在內(nèi)核初始化 (調(diào)用 osKernelInitialize)之前調(diào)用該函數(shù)。線程創(chuàng)建名稱描述func線程函數(shù)argument作為啟動參數(shù)傳遞給線程函數(shù)的指針attr線程屬性返回值線程ID,如果出錯,返回NULLosThreadId

9、_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr);線程創(chuàng)建-線程屬性osThreadAttr_t名稱數(shù)據(jù)類型描述nameconst char*線程名稱attr_bitsuint32_t線程屬性位cb_memvoid*線程控制塊的內(nèi)存每個線程都含有一個線程控制塊(TCB)。TCB包含了線程上下文棧指針(stack pointer)、線程狀態(tài)、線程優(yōu)先級、線程ID、線程名、線程棧大小等信息。TCB可以反映出每個線程運(yùn)行情況。cb_sizeuint32_t線程控制塊的內(nèi)存大小stack_m

10、emvoid*棧的內(nèi)存每個線程都擁有一個獨立的棧空間,我們稱為線程棧。??臻g里保存的信息包含局部變量、寄存器、函數(shù)參數(shù)、函數(shù)返回地址等。stack_sizeuint32_t棧的大小priorityosPriority_t優(yōu)先級優(yōu)先級表示任務(wù)執(zhí)行的優(yōu)先順序。線程的優(yōu)先級決定了在發(fā)生線程切換時即將要執(zhí)行的線程,就緒隊列中最高優(yōu)先級的線程將得到執(zhí)行。線程創(chuàng)建-實例在OS_Thread_example函數(shù)中,通過osThreadNew()函數(shù)創(chuàng)建了thread1和thread2兩個進(jìn)程,thread1和thread2啟動后會輸出打印日志。/*任務(wù)一*/void thread_entry1(void)

11、int sum = 0; while (1) printf(This is Niobe Thread1-%drn, sum+); usleep(500000); /*任務(wù)二*/void thread_entry2(void) int sum = 0; while (1) printf(This is Niobe Thread2-%drn, sum+); usleep(500000); /*任務(wù)創(chuàng)建*/static void OS_Thread_example(void) osThreadAttr_t attr; = thread1; attr.attr_bits = 0U;

12、 attr.cb_mem = NULL; attr.cb_size = 0U; attr.stack_mem = NULL; attr.stack_size = 1024*4; attr.priority = 25; if (osThreadNew(osThreadFunc_t)thread_entry1, NULL, &attr) = NULL) printf(Falied to create thread1!n); = thread2; if (osThreadNew(osThreadFunc_t)thread_entry2, NULL, &attr) = NULL) printf(Falied to create thread2!n)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論