版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 某著名企業(yè)金典系列路演活動策劃案
- 《GBT 22325-2008小麥粉中過氧化苯甲酰的測定 高效液相色譜法》專題研究報告
- 《GBT 14454.11-2008香料 含酚量的測定》專題研究報告
- 道路養(yǎng)護(hù)安全培訓(xùn)計劃課件
- 道路交通安全培訓(xùn)效果課件
- 2026年江蘇高考生物試題及答案
- 2022頭皮美塑療法技術(shù)操作規(guī)范專家共識
- 內(nèi)蒙古農(nóng)作物生產(chǎn)技術(shù)(北方本)綜合測試題(四)及答案
- 車隊安全培訓(xùn)內(nèi)容
- 2025工程技術(shù)年終總結(jié)(2篇)
- 2026年遼寧金融職業(yè)學(xué)院單招職業(yè)技能測試題庫附答案解析
- 2026北京海淀初三上學(xué)期期末語文試卷和答案
- 2024-2025學(xué)年北京市東城區(qū)五年級(上)期末語文試題(含答案)
- 2026年寧夏賀蘭工業(yè)園區(qū)管委會工作人員社會化公開招聘備考題庫帶答案詳解
- NB-T32036-2017光伏發(fā)電工程達(dá)標(biāo)投產(chǎn)驗收規(guī)程
- 兩輪車控制器行業(yè)報告
- JSA臨時用電作業(yè)安全分析表
- 2015-2022年北京衛(wèi)生職業(yè)學(xué)院高職單招語文/數(shù)學(xué)/英語筆試參考題庫含答案解析
- 賽膚潤常見臨床應(yīng)用2010年
- 提高鋁模板施工質(zhì)量合格率
- 傳感器與檢測技術(shù)習(xí)題集
評論
0/150
提交評論