鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件3.1鴻蒙系統(tǒng)多線程應(yīng)用開發(fā)_第1頁
鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件3.1鴻蒙系統(tǒng)多線程應(yīng)用開發(fā)_第2頁
鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件3.1鴻蒙系統(tǒng)多線程應(yīng)用開發(fā)_第3頁
鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件3.1鴻蒙系統(tǒng)多線程應(yīng)用開發(fā)_第4頁
鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件3.1鴻蒙系統(tǒng)多線程應(yīng)用開發(fā)_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.1鴻蒙系統(tǒng)多線程應(yīng)用開發(fā)本章主要講述鴻蒙系統(tǒng)多線程應(yīng)用開發(fā)。通過學(xué)習(xí)本節(jié)將能夠了解鴻蒙多線程應(yīng)用開發(fā)技術(shù)。通過本節(jié)學(xué)習(xí)可以熟悉:多線程工作原理與用途CMSIS多線程編程POSIX多線程編程多線程應(yīng)用案例-多線程煙霧警報器多線程工作原理CMSIS多線程編程POSIX多線程編程多線程應(yīng)用案例-多線程煙霧警報器多線程工作原理

線程是操作系統(tǒng)能夠進(jìn)行任務(wù)調(diào)度的最小單位,也是一個程序中并行執(zhí)行的分支。

每個線程有自己的工作函數(shù)與不同的執(zhí)行路徑,且每個線程都獨自擁有在內(nèi)存上分配局部變量的棧空間,但同屬一個程序的多個線程共享此程序的全局變量等資源。

在多核多線程的主控芯片上,通常由操作系統(tǒng)優(yōu)先調(diào)度線程的任務(wù)由一個CPU硬件線程來完成,如果硬件線程資源不足則與單核單線程的主控芯片一樣,采用時間片的調(diào)度方式來實施線程的并行執(zhí)行多線程工作原理CMSIS多線程編程POSIX多線程編程多線程應(yīng)用案例-多線程煙霧警報器CMSIS多線程編程(1/2)

CMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)標(biāo)準(zhǔn)的多線程編程接口。CMSIS多線程函數(shù)在cmsis_os2.h頭文件中已聲明,具體的編程步驟如下:1.

定義線程執(zhí)行的函數(shù)CMSIS線程函數(shù)原型:void(*func)(void*arg),其中arg是在函數(shù)執(zhí)行時附帶的參數(shù)值,線程在創(chuàng)建時除指定arg參數(shù)值外,還需指定線程要執(zhí)行的函數(shù)名。線程創(chuàng)建成功后自動執(zhí)行線程函數(shù)。2.

設(shè)置線程屬性

在CMSIS多線程編程中,使用osThreadAttr_t結(jié)構(gòu)體變量描述線程的名稱、棧大小、優(yōu)先級別等屬性值,參考代碼如下:

osThreadAttr_tattr;//聲明描述線程屬性的結(jié)構(gòu)體變量memset(&attr,0,sizeof(attr));//將結(jié)構(gòu)體變量的全部屬性值清零

="myLed";//設(shè)置線程名

attr.stack_size=1024;//設(shè)置線程所用的棧大小

attr.priority=osPriorityNormal1;//設(shè)置線程優(yōu)先級別CMSIS多線程編程(2/2)

3.

線程管理在CMSIS多線程編程中,使用osThreadNew函數(shù)創(chuàng)建線程,函數(shù)原型:osThreadId_tosThreadNew(osThreadFunc_tfunc,void*arg,constosThreadAttr_t*attr)

其中func參數(shù)用于指定線程函數(shù)名,arg參數(shù)用于指定當(dāng)線程函數(shù)執(zhí)行時得到的參數(shù)值,attr參數(shù)用于指定使用的線程屬性值。使用上一步驟設(shè)置的線程屬性,創(chuàng)建一個線程執(zhí)行呼吸燈處理函數(shù)的代碼如下:osThreadId_ttid=osThreadNew(myLedThreadFunc,NULL,&attr);函數(shù)osThreadNew執(zhí)行成功返回線程的id,通過此線程id,可以通過以下函數(shù)管理線程:osStatus_tosThreadSuspend(osThreadId_ttid);//設(shè)置tid線程暫停執(zhí)行osStatus_tosThreadResume(osThreadId_ttid);//設(shè)置tid線程恢復(fù)執(zhí)行osStatus_tosThreadTerminate(osThreadId_ttid);//結(jié)束tid線程的執(zhí)行多線程工作原理CMSIS多線程編程POSIX多線程編程多線程應(yīng)用案例-多線程煙霧警報器POSIX多線程編程(1/3)

POSIX(PortableOperatingSystemInterface)標(biāo)準(zhǔn)多線程在pthread.h頭文件提供相關(guān)操作的函數(shù)聲明,具體的編程步驟如下:1.

定義線程執(zhí)行的函數(shù)POSIX線程與CMSIS線程功能一致,它的函數(shù)原型為:void*(*func)(void*arg),其中arg是在函數(shù)執(zhí)行時附帶的參數(shù)值,線程函數(shù)執(zhí)行結(jié)束返回一個地址。POSIX多線程編程(2/3)2.

設(shè)置線程屬性

使用pthread_attr_t結(jié)構(gòu)體變量描述線程的屬性,并通過函數(shù)設(shè)置線程的屬性值,常用的函數(shù)有:

pthread_attr_tattr;//聲明線程屬性結(jié)構(gòu)體變量

intpthread_attr_init(pthread_attr_t*attr);//初始化線程結(jié)構(gòu)體變量

intpthread_attr_setstacksize(pthread_attr_t*attr,size_tsize);

//在線程屬性結(jié)構(gòu)體變量中設(shè)置線程棧大小。

intpthread_attr_setschedpolicy(pthread_attr_t*attr,intpolicy);

//在線程屬性結(jié)構(gòu)體變量中設(shè)置線程的調(diào)度算法

policy參數(shù)可選:

SCHED_OTHER(默認(rèn)值):分時調(diào)度算法,每個線程得到相同的執(zhí)行時間

SCHED_FIFO:工作隊列調(diào)度算法,一個線程執(zhí)行完才會執(zhí)行下一個線程

SCHED_RR:輪流調(diào)度算法,以分時為基礎(chǔ),結(jié)合線程優(yōu)先級別進(jìn)行調(diào)度

//在線程屬性結(jié)構(gòu)體變量中設(shè)置線程的優(yōu)先級別

intpthread_attr_setschedparam(pthread_attr_t*attr,conststructsched_param*param);

用法:先創(chuàng)建一個sched_param類型的結(jié)構(gòu)體變量,

并為其內(nèi)部的sched_priority成員賦一個表示級別的int類型值(數(shù)值越大則級別越高),然后執(zhí)行此函數(shù)并傳遞此sched_param變量的地址。

POSIX多線程編程(3/3)3.

線程管理在POSIX多線程編程中,使用pthread_create函數(shù)創(chuàng)建線程,函數(shù)原型:intpthread_create(pthread_t*tid,constpthread_attr_t*attr,void*(*func)(void*),void*arg);

其中tid參數(shù)用于存放線程id的pthread_t變量地址,attr參數(shù)用于指定使用的線程屬性值,func參數(shù)指定線程執(zhí)行的函數(shù),arg參數(shù)用于指定當(dāng)線程函數(shù)執(zhí)行時得到的參數(shù)值,函數(shù)執(zhí)行成功返回0,失敗則返回小于0的錯誤碼。pthread_tpthread_self(void);//獲取當(dāng)前線程的id//當(dāng)線程函數(shù)執(zhí)行結(jié)束后,通過此函數(shù)回收指定id的線程資源,并通過retval參數(shù)接收線程函數(shù)的返回值intpthread_join(pthread_ttid,void**retval);//設(shè)置指定id的線程名稱,name為線程名稱intpthread_setname_np(pthread_ttid,constchar*name);//獲取指定id的線程名稱,

獲取的名稱存入buf數(shù)組中,buflen參數(shù)為buf數(shù)組的長度intpthread_getname_np(pthread_ttid,char*buf,size_tbuflen);多線程工作原理CMSIS多線程編程POSIX多線程編程多線程應(yīng)用案例-多線程煙霧警報器多線程應(yīng)用案例(1/2)

通過多線程并行執(zhí)行與模塊化開發(fā)的技術(shù),由一個線程專門實現(xiàn)呼吸燈的功能,再由另一個線程循環(huán)檢測煙霧傳感器,當(dāng)數(shù)據(jù)異常時及時發(fā)出警報。在工程源碼的myhello目錄下,創(chuàng)建myledThread.c源文件。在源文件中由一個CMSIS標(biāo)準(zhǔn)的線程,循環(huán)改變PWM信號占空比實現(xiàn)呼吸燈的功能。voidmyLedInit(){1.LED的PWM初始化

2.線程屬性設(shè)置

3.創(chuàng)建PWM線程,指定線程函數(shù)與線程屬性設(shè)置}4.PWM線程函數(shù):

循環(huán)定時改變PWM占空比多線程應(yīng)用案例(2/2)

在工程源碼的myhello目錄下,再創(chuàng)建myadcThread.c源文件。在源文件中由一個POSIX標(biāo)準(zhǔn)的線程,循環(huán)檢測煙霧傳感器及時發(fā)生聲光警報的功能。voidmyAdcInit(){1.煙霧傳感器IO初始化

2.繼電器模塊IO初始化

3.線程屬性設(shè)置

溫馨提示

  • 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

提交評論