版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
RTOS1.1實(shí)時(shí)操作0系統(tǒng)的基本含義課程導(dǎo)引第1章RTOS的基本概念與線(xiàn)程基礎(chǔ)知識(shí)1.2RTOS中的基本概念1.3線(xiàn)程的三要素、四種狀態(tài)及三種基本形式1.4本章小結(jié)RTOS課程導(dǎo)引1.學(xué)什么?第1頁(yè)共27頁(yè)本課程以國(guó)產(chǎn)實(shí)時(shí)操作系統(tǒng)RT-Thread為藍(lán)本,闡述RTOS的應(yīng)用與原理。
教材:王宜懷等編著,實(shí)時(shí)操作系統(tǒng)應(yīng)用技術(shù):基于RT-Thread與ARM的編程實(shí)踐,機(jī)械工業(yè)出版社,2024年4月。(內(nèi)含硬件板,定價(jià)89.90元,網(wǎng)上折扣后為70元左右。)RTOS全書(shū)包含基礎(chǔ)應(yīng)用篇(1~6章)、綜合實(shí)踐篇(7~8章)、原理剖析篇(9章)三大部分,只做實(shí)時(shí)操作系統(tǒng)下應(yīng)用開(kāi)發(fā),可只閱讀基礎(chǔ)應(yīng)用篇與綜合實(shí)踐篇,希望了解原理,則通讀全書(shū)。電子資源下載地址:https:///RTwThreadwARMjc/list.htm第2頁(yè)共27頁(yè)RTOS2.為什么要學(xué)?(1)實(shí)時(shí)操作系統(tǒng)是嵌入式人工智能與物聯(lián)網(wǎng)終端的重要工具和運(yùn)行載體;(2)隨著微型計(jì)算機(jī)技術(shù)的不斷發(fā)展,RAM、Flash空間變大,價(jià)格降低,RTOS將逐步成為標(biāo)準(zhǔn)配置;(3)使用RTOS,可以把一個(gè)大工程分解成一個(gè)一個(gè)小工程,RTOS為應(yīng)用編程提供服務(wù),方便應(yīng)用程序開(kāi)發(fā)、維護(hù)與程序移植。第3頁(yè)共27頁(yè)RTOS3.如何學(xué)?—“勤”(1)學(xué)習(xí)過(guò)程:課前預(yù)習(xí):花20分鐘左右瀏覽課本;聽(tīng)課:帶好紙質(zhì)和筆,腦手聯(lián)動(dòng);課后:及時(shí)看書(shū)、梳理札記、完成作業(yè),當(dāng)天完成當(dāng)天任務(wù);實(shí)驗(yàn):勤動(dòng)手;期中、期末復(fù)習(xí):收攏知識(shí);(2)電子札記:按照模板,嚴(yán)格遵守排版格式,及時(shí)梳理知識(shí)要點(diǎn);(3)勤問(wèn):學(xué)問(wèn)學(xué)問(wèn),一要學(xué),二要問(wèn),要克服“不問(wèn)”之慣性,問(wèn)老師、問(wèn)同學(xué)。
第4頁(yè)共27頁(yè)RTOS嵌入式系統(tǒng),即嵌入式計(jì)算機(jī)系統(tǒng),它是不以計(jì)算機(jī)形式出現(xiàn)的“計(jì)算機(jī)”。這類(lèi)計(jì)算機(jī)隱含在各種具體產(chǎn)品之中,在這些產(chǎn)品中,計(jì)算機(jī)程序發(fā)揮關(guān)鍵核心作用。嵌入式處理器按其應(yīng)用范圍可以分為電子系統(tǒng)智能化(微控制器MCU)和計(jì)算機(jī)應(yīng)用延伸(應(yīng)用處理器MAP)兩大類(lèi)。1.1實(shí)時(shí)操作系統(tǒng)的基本含義1.1.1無(wú)操作系統(tǒng)與實(shí)時(shí)操作系統(tǒng)第5頁(yè)共27頁(yè)RTOS1.無(wú)操作系統(tǒng)下程序運(yùn)行流程無(wú)操作系統(tǒng)(NoOperatingSystem,NOS)的嵌入式系統(tǒng)中,在系統(tǒng)復(fù)位后,首先進(jìn)行堆棧、中斷向量、系統(tǒng)時(shí)鐘、內(nèi)存變量、部分硬件模塊等初始化工作,然后進(jìn)入“無(wú)限循環(huán)”,在這個(gè)無(wú)限循環(huán)中,CPU一般根據(jù)一些全局變量的值決定執(zhí)行各種功能程序(線(xiàn)程),這是第一條運(yùn)行路線(xiàn)。若發(fā)生中斷,將響應(yīng)中斷,執(zhí)行中斷服務(wù)例程(InterruptServiceRoutines,ISR),這是第二條運(yùn)行路線(xiàn),執(zhí)行完ISR后,返回中斷處繼續(xù)執(zhí)行。從操作系統(tǒng)的調(diào)度功能角度理解,NOS中的主程序,可以被簡(jiǎn)單地理解為一個(gè)RTOS內(nèi)核,這個(gè)內(nèi)核負(fù)責(zé)系統(tǒng)初始化和調(diào)度其它線(xiàn)程。注:NOS實(shí)例演示(
..\03-Software\CH02\NOS)第6頁(yè)共27頁(yè)RTOS2.RTOS下程序運(yùn)行流程本書(shū)主要闡述面向嵌入式人工智能與物聯(lián)網(wǎng)領(lǐng)域的實(shí)時(shí)操作系統(tǒng)(RTOS)的應(yīng)用方法與原理。在基于RTOS的編程模式下,同樣有兩條線(xiàn)路:一條是線(xiàn)程線(xiàn),編程時(shí)把一個(gè)較大工程分解成幾個(gè)較小的工程(被稱(chēng)為線(xiàn)程或任務(wù)),有個(gè)調(diào)度者負(fù)責(zé)這些線(xiàn)程的執(zhí)行;另一條線(xiàn)路是中斷線(xiàn),與NOS情況一致,若發(fā)生中斷,將響應(yīng)中斷,執(zhí)行中斷服務(wù)程序(ISR),然后返回中斷處繼續(xù)執(zhí)行。注:RT-Thread實(shí)例演示(..\03-Software\CH02\NOSRT-Thread)第7頁(yè)共27頁(yè)RTOS3.RTOS的基本功能線(xiàn)程管理與調(diào)度、線(xiàn)程間的同步與通信、存儲(chǔ)管理、時(shí)間管理、中斷管理等。4.RTOS的應(yīng)用場(chǎng)合將成為未來(lái)MCU應(yīng)用開(kāi)發(fā)的標(biāo)準(zhǔn)配置。(選擇具體的RTOS時(shí),注意避免收費(fèi)陷阱)第8頁(yè)共27頁(yè)RTOS1.1.2實(shí)時(shí)操作系統(tǒng)與非實(shí)時(shí)操作系統(tǒng)嵌入式操作系統(tǒng)有實(shí)時(shí)與非實(shí)時(shí)之分。應(yīng)用處理器使用的嵌入式操作系統(tǒng)EOS對(duì)實(shí)時(shí)性要求不高,主要關(guān)心功能,這類(lèi)操作系統(tǒng)主要有標(biāo)準(zhǔn)鴻蒙、Android、iOS、嵌入式Linux等。(多進(jìn)程操作系統(tǒng))而以微控制器為核心的嵌入式系統(tǒng),期望能夠在較短的確定時(shí)間內(nèi)完成特定的系統(tǒng)功能或中斷響應(yīng),應(yīng)用于這類(lèi)系統(tǒng)中的操作系統(tǒng)就是實(shí)時(shí)操作系統(tǒng),這類(lèi)操作系統(tǒng)主要有RT-Thread、輕量級(jí)鴻蒙、μC/OS、MQX、FreeRTOS等。(單進(jìn)程操作系統(tǒng))第9頁(yè)共27頁(yè)RTOS1.2RTOS中的基本概念1.2.1線(xiàn)程與調(diào)度的基本含義1.線(xiàn)程的基本含義(重點(diǎn))線(xiàn)程是RTOS中最重要概念之一。在RTOS下,把一個(gè)復(fù)雜的嵌入式應(yīng)用工程按一定規(guī)則分解成一個(gè)個(gè)功能清晰的小工程,然后設(shè)定各個(gè)小工程的運(yùn)行規(guī)則,交給RTOS管理,這就是基于RTOS編程的基本思想。這一個(gè)個(gè)小工程被稱(chēng)為“線(xiàn)程(Thread)”,RTOS管理這些線(xiàn)程,被稱(chēng)為“調(diào)度(Scheduling)”。第10頁(yè)共27頁(yè)RTOS1)從線(xiàn)程調(diào)度角度理解:RTOS中的線(xiàn)程是一個(gè)功能清晰的小程序,是RTOS調(diào)度的基本單元;2)從RTOS的軟件設(shè)計(jì)角度來(lái)理解:線(xiàn)程就是在軟件設(shè)計(jì)時(shí),需要根據(jù)具體應(yīng)用,劃分出獨(dú)立的、相互作用的程序集合。這樣的程序集合就被稱(chēng)為線(xiàn)程,每個(gè)線(xiàn)程都被賦予一定的優(yōu)先級(jí);3)從CPU角度理解:在單CPU下,某一時(shí)刻CPU只會(huì)處理(執(zhí)行)一個(gè)線(xiàn)程,或說(shuō)只有一個(gè)線(xiàn)程占用CPU。RTOS內(nèi)核關(guān)鍵功能就是以合理的方式為系統(tǒng)中的每個(gè)線(xiàn)程分配時(shí)間(即調(diào)度),使之得以運(yùn)行。第11頁(yè)共27頁(yè)RTOS2.調(diào)度的基本含義(重點(diǎn))調(diào)度就是決定該輪到哪個(gè)線(xiàn)程運(yùn)行了,它是內(nèi)核最重要的職責(zé)。例如,一臺(tái)晚會(huì)有小品、相聲、唱歌、詩(shī)朗誦等節(jié)目,而舞臺(tái)只有一個(gè),在晚會(huì)過(guò)程中導(dǎo)演會(huì)指揮每個(gè)節(jié)目什么時(shí)間進(jìn)行候場(chǎng)、什么時(shí)間上臺(tái)進(jìn)行表演、表演多長(zhǎng)時(shí)間等,這個(gè)過(guò)程就可以看做是導(dǎo)演在對(duì)各個(gè)獨(dú)立的節(jié)目進(jìn)行調(diào)度,通過(guò)導(dǎo)演的調(diào)度各個(gè)節(jié)目有序演出,觀眾就能看到一臺(tái)精彩的晚會(huì)。優(yōu)先級(jí)的調(diào)度算法算法的核心思想是:總是讓處于就緒態(tài)的、優(yōu)先級(jí)最高的線(xiàn)程先運(yùn)行,優(yōu)先級(jí)相同的按照先進(jìn)就緒隊(duì)列先運(yùn)行,同優(yōu)先級(jí)的可各運(yùn)行一定時(shí)間片。第12頁(yè)共27頁(yè)RTOS1.2.2
內(nèi)核類(lèi)其他基本概念1.時(shí)鐘節(jié)拍時(shí)鐘節(jié)拍:時(shí)鐘節(jié)拍(ClockTick),有時(shí)也直接譯為時(shí)鐘嘀嗒,它是一個(gè)定時(shí)器產(chǎn)生的周期性中斷,調(diào)度功能重要來(lái)源之一。
2.代碼臨界段代碼臨界段:也稱(chēng)為臨界區(qū),是指部分代碼開(kāi)始執(zhí)行則不允許任何中斷打擾。在進(jìn)入時(shí)關(guān)中斷,出來(lái)時(shí)開(kāi)中斷。3.不可搶占型內(nèi)核與可搶占型內(nèi)核不可搶占型內(nèi)核:要求每個(gè)線(xiàn)程主動(dòng)放棄CPU的使用權(quán)??蓳屨夹蛢?nèi)核:一個(gè)正在運(yùn)行的線(xiàn)程可以被打斷,而讓另一個(gè)優(yōu)先級(jí)更高、且變?yōu)榫途w態(tài)的線(xiàn)程運(yùn)行。一般為可搶占型內(nèi)核。第13頁(yè)共27頁(yè)RTOS4.實(shí)時(shí)性相關(guān)概念及RTOS實(shí)時(shí)性指標(biāo)(了解)實(shí)時(shí)性:實(shí)時(shí)性可以理解為在規(guī)定時(shí)間內(nèi)系統(tǒng)的反應(yīng)能力,可分為硬實(shí)時(shí)和軟實(shí)時(shí)。硬實(shí)時(shí):要求在規(guī)定的時(shí)間內(nèi)必須完成操作。軟實(shí)時(shí):只要按照線(xiàn)程的優(yōu)先級(jí)盡可能快地完成操作即可。評(píng)價(jià)一個(gè)RTOS一般可從以下幾個(gè)方面來(lái)衡量
:
(1)線(xiàn)程調(diào)度的時(shí)間指標(biāo)調(diào)度延時(shí)、線(xiàn)程切換時(shí)間、恢復(fù)時(shí)間。
(2)中斷禁止時(shí)間、中斷延遲時(shí)間。
(3)最小內(nèi)存開(kāi)銷(xiāo)。第14頁(yè)共27頁(yè)RTOS1.線(xiàn)程的上下文及線(xiàn)程切換(重點(diǎn)、難點(diǎn))線(xiàn)程的上下文是指某一時(shí)間點(diǎn)CPU內(nèi)部寄存器的內(nèi)容。當(dāng)多線(xiàn)程內(nèi)核決定運(yùn)行另外的線(xiàn)程時(shí),它保存正在運(yùn)行線(xiàn)程的上下文,保存在線(xiàn)程自己的堆棧之中。入棧工作完成以后,就把下一個(gè)將要運(yùn)行線(xiàn)程的上下文,從其線(xiàn)程堆棧中重新裝入CPU的寄存器,開(kāi)始下一個(gè)線(xiàn)程的運(yùn)行,這一過(guò)程叫作線(xiàn)程切換或上下文切換。上下文的英文單詞是context,這個(gè)詞具有場(chǎng)景、語(yǔ)境、來(lái)龍去脈的含義。要點(diǎn):線(xiàn)程棧、SP、PC1.2.3線(xiàn)程類(lèi)其他基本概念第15頁(yè)共27頁(yè)RTOS2.線(xiàn)程優(yōu)先級(jí)(了解)在一個(gè)多線(xiàn)程系統(tǒng)中,每個(gè)線(xiàn)程都有一個(gè)優(yōu)先級(jí),RTOS根據(jù)線(xiàn)程的優(yōu)先級(jí)等進(jìn)行線(xiàn)程調(diào)度,一般情況下優(yōu)先級(jí)高的線(xiàn)程先運(yùn)行。了解有關(guān)概念:優(yōu)先級(jí)驅(qū)動(dòng)、優(yōu)先級(jí)反轉(zhuǎn)、優(yōu)先級(jí)繼承。3.線(xiàn)程間通信(后面重點(diǎn)學(xué)習(xí)的內(nèi)容,RTOS為我們服務(wù)的)線(xiàn)程間通信是指線(xiàn)程間的信息交換,其作用是實(shí)現(xiàn)線(xiàn)程間同步及數(shù)據(jù)傳輸。同步是指根據(jù)線(xiàn)程間的合作關(guān)系,協(xié)調(diào)不同線(xiàn)程間的執(zhí)行順序。線(xiàn)程間通信的方式主要有事件、消息隊(duì)列、信號(hào)量、互斥量等。4.資源(了解)RTOS中的資源是指任何被線(xiàn)程所占用的實(shí)體,可以是輸入/輸出設(shè)備,例如顯示器,也可以是一個(gè)變量、結(jié)構(gòu)或數(shù)組等。涉及資源的主要概念有:共享資源、互斥與死鎖等。第16頁(yè)共27頁(yè)RTOS1.3線(xiàn)程的三要素、四種狀態(tài)及三種基本形式從線(xiàn)程的存儲(chǔ)結(jié)構(gòu)上看,線(xiàn)程由三個(gè)部分組成:線(xiàn)程函數(shù)、線(xiàn)程堆棧、線(xiàn)程描述符,這就是線(xiàn)程的三要素。線(xiàn)程函數(shù):線(xiàn)程要完成具體功能的程序;線(xiàn)程堆棧:每個(gè)線(xiàn)程擁有自己獨(dú)立的線(xiàn)程堆棧空間,用于保存線(xiàn)程在調(diào)度時(shí)的上下文信息及線(xiàn)程內(nèi)部使用的局部變量;線(xiàn)程描述符:關(guān)聯(lián)了線(xiàn)程屬性的程序控制塊,記錄le線(xiàn)程的各個(gè)屬性。1.3.1線(xiàn)程的三要素:線(xiàn)程函數(shù)、線(xiàn)程堆棧、線(xiàn)程描述符(重點(diǎn))第17頁(yè)共27頁(yè)RTOS1.線(xiàn)程函數(shù)一個(gè)線(xiàn)程,對(duì)應(yīng)一段函數(shù)代碼,完成一定功能,可被稱(chēng)之為線(xiàn)程函數(shù)。RTOS內(nèi)核如何知道哪個(gè)該先運(yùn)行呢?由于任何時(shí)刻只能有一個(gè)線(xiàn)程在運(yùn)行(處于激活態(tài)),當(dāng)RTOS內(nèi)核使一個(gè)線(xiàn)程運(yùn)行時(shí),之前的運(yùn)行線(xiàn)程就會(huì)退出激活態(tài)。CPU被處于激活態(tài)的線(xiàn)程所獨(dú)占,從這個(gè)角度看,線(xiàn)程函數(shù)與無(wú)操作系統(tǒng)(NOS)中的“main”函數(shù)性質(zhì)相近,一般被設(shè)計(jì)為“永久循環(huán)”,認(rèn)為線(xiàn)程一直在執(zhí)行,永遠(yuǎn)獨(dú)占處理器。但也有一些特殊性,將在第6章中討論。第18頁(yè)共27頁(yè)RTOS2.線(xiàn)程堆棧(重點(diǎn)、難點(diǎn))線(xiàn)程堆棧是獨(dú)立于線(xiàn)程函數(shù)之外的RAM,是按照“先進(jìn)后出”策略組織的一段連續(xù)存儲(chǔ)空間,是RTOS中線(xiàn)程的重要組成部分。在RTOS中被創(chuàng)建的每個(gè)線(xiàn)程都有自己私有的堆??臻g,在線(xiàn)程的運(yùn)行過(guò)程中,堆棧用于保存線(xiàn)程程序運(yùn)行過(guò)程中的局部變量、線(xiàn)程調(diào)用普通函數(shù)時(shí)會(huì)為線(xiàn)程保存返回地址等參數(shù)變量、保存線(xiàn)程的上下文等等。第19頁(yè)共27頁(yè)RTOS3.線(xiàn)程描述符(重點(diǎn)、難點(diǎn))線(xiàn)程被創(chuàng)建時(shí),系統(tǒng)會(huì)為每個(gè)線(xiàn)程創(chuàng)建一個(gè)唯一的線(xiàn)程描述符TD,它相當(dāng)于線(xiàn)程在RTOS中的一個(gè)“身份證”,RTOS就是通過(guò)這些“身份證”來(lái)管理線(xiàn)程和查詢(xún)線(xiàn)程信息的。在RTOS中,一般情況下使用列表來(lái)維護(hù)線(xiàn)程描述符。在RT-Thread中阻塞列表用于存放因等待某個(gè)信號(hào)而終止運(yùn)行的線(xiàn)程;延時(shí)列表用于存放通過(guò)延時(shí)函數(shù)或等待某個(gè)信號(hào)指定的時(shí)間而終止運(yùn)行的線(xiàn)程;就緒列表則按優(yōu)先級(jí)的高低存放準(zhǔn)備要運(yùn)行的線(xiàn)程。第20頁(yè)共27頁(yè)RTOS1.線(xiàn)程狀態(tài)的基本含義(重點(diǎn)、難點(diǎn))1)終止態(tài):線(xiàn)程已經(jīng)完成,或被刪除,不再需要使用CPU。2)阻塞態(tài):又可稱(chēng)為“掛起態(tài)”。線(xiàn)程未準(zhǔn)備好,不能被激活。當(dāng)?shù)却龝r(shí)間到或等待的情況發(fā)生時(shí),該線(xiàn)程才變?yōu)榫途w態(tài)。3)就緒態(tài):線(xiàn)程已經(jīng)準(zhǔn)備好可以被激活,但未進(jìn)入激活態(tài)。一旦獲取CPU的使用權(quán)就可以進(jìn)入激活態(tài),處于就緒態(tài)的線(xiàn)程描述符存放于就緒列表中。4)激活態(tài):即“運(yùn)行態(tài)”,線(xiàn)程在運(yùn)行中,線(xiàn)程擁有CPU使用權(quán)。在任一時(shí)刻,線(xiàn)程被創(chuàng)建后所處的狀態(tài)一定是四種狀態(tài)之一。1.3.2線(xiàn)程的四種狀態(tài):終止態(tài)、阻塞態(tài)、就緒態(tài)和激活態(tài)第21頁(yè)共27頁(yè)RTOS2.線(xiàn)程狀態(tài)之間的轉(zhuǎn)換(了解)RTOS線(xiàn)程的四種狀態(tài)是動(dòng)態(tài)轉(zhuǎn)換的
1)終止態(tài)轉(zhuǎn)為就緒態(tài):線(xiàn)程重新被開(kāi)始,根據(jù)線(xiàn)程優(yōu)先級(jí)進(jìn)入就緒態(tài)。2)阻塞態(tài)轉(zhuǎn)為就緒態(tài):阻塞條件被解除。3)就緒態(tài)轉(zhuǎn)為激活態(tài)、終止態(tài)。就緒線(xiàn)程被調(diào)度而獲得CPU資源進(jìn)入運(yùn)行;也可以直接調(diào)用函數(shù)進(jìn)入激活態(tài)。4)激活態(tài)轉(zhuǎn)為就緒態(tài)、阻塞態(tài)、終止態(tài)。5)激活態(tài)轉(zhuǎn)為就緒態(tài)、阻塞態(tài)。第22頁(yè)共27頁(yè)RTOS線(xiàn)程函數(shù)一般分為兩個(gè)部分:初始化部分和線(xiàn)程體部分初始化部分實(shí)現(xiàn)對(duì)變量的定義、初始化以及設(shè)備的打開(kāi)等線(xiàn)程體部分負(fù)責(zé)完成該線(xiàn)程的基本功能。線(xiàn)程一般結(jié)構(gòu)如下:voidthread_a(uint32_tinitial_data){
//初始化部分
//線(xiàn)程體部分}線(xiàn)程的基本形式:?jiǎn)未螆?zhí)行線(xiàn)程、周期執(zhí)行線(xiàn)程和事件驅(qū)動(dòng)線(xiàn)程。1.3.3線(xiàn)程的三種基本形式:?jiǎn)未螆?zhí)行、周期執(zhí)行、資源驅(qū)動(dòng)第23頁(yè)共27頁(yè)RTOS1.單次執(zhí)行線(xiàn)程指在創(chuàng)建后只會(huì)被執(zhí)行一次,執(zhí)行完后就會(huì)被銷(xiāo)毀或阻塞的線(xiàn)程。如自動(dòng)線(xiàn)程。voidthread_a(uint32_tinitial_data){//初始化部分//線(xiàn)程體部分//線(xiàn)程函數(shù)銷(xiāo)毀或阻塞}初始化:包括對(duì)變量的定義和賦值,打開(kāi)需要使用的設(shè)備等等;線(xiàn)程函數(shù)的執(zhí)行:該線(xiàn)程的基本功能實(shí)現(xiàn);線(xiàn)程函數(shù)的銷(xiāo)毀或阻塞:即調(diào)用線(xiàn)程銷(xiāo)毀或者阻塞函數(shù)將自己從線(xiàn)程列表中刪除。第24頁(yè)共27頁(yè)RTOS2.周期執(zhí)行線(xiàn)程指需要按照一定周期執(zhí)行的線(xiàn)程,大部分線(xiàn)程如此,與NOS下main.c一致。voidthread_a(uint32_tinitial_data){//初始化部分……
//線(xiàn)程體部分while(1){ //循環(huán)體部分}}線(xiàn)程函數(shù)的執(zhí)行是放在永久循環(huán)體中執(zhí)行的。線(xiàn)程需要按照一定周期執(zhí)行,執(zhí)行完該線(xiàn)程之后可能需要調(diào)用延時(shí)函數(shù)wait將自己放入延時(shí)列表中,等時(shí)間到了之后重新進(jìn)入就緒態(tài)。第25頁(yè)共27頁(yè)RTOS3.資源驅(qū)動(dòng)線(xiàn)程資源:主要指信號(hào)量、事件等線(xiàn)程通信與同步中的方法。資源驅(qū)動(dòng)線(xiàn)程是操作系統(tǒng)特有的線(xiàn)程類(lèi)型。執(zhí)行時(shí)間不確定,所要等待的資源可用時(shí)才轉(zhuǎn)入就緒態(tài),否則會(huì)被加入到等待該資源的等待列表中。voidthread_a(uint32_tinitial_data)){//初始化部分……while(1){
//調(diào)用等待資源函數(shù)//線(xiàn)程體部分}}第26頁(yè)共27頁(yè)RTOS1.4本章小結(jié)在RTOS下編程與NOS下編程相比有顯著優(yōu)點(diǎn),這個(gè)優(yōu)點(diǎn)就是有個(gè)調(diào)度者,指揮協(xié)調(diào)著各個(gè)線(xiàn)程的運(yùn)行,這樣編程者可以把一個(gè)大工程分解成一個(gè)個(gè)小工程,交由RTOS管理,這符合軟件工程的基本原理。線(xiàn)程是RTOS中最重要概念之一。在RTOS下,把一個(gè)復(fù)雜的應(yīng)用工程按一定規(guī)則分解成一個(gè)個(gè)功能清晰的小工程,然后設(shè)定各個(gè)小工程運(yùn)行規(guī)則,交給RTOS管理,這就是基于RTOS編程的基本思想。這一個(gè)個(gè)小工程被稱(chēng)為線(xiàn)程,RTOS管理這些線(xiàn)程,被稱(chēng)為調(diào)度。線(xiàn)程可以分別從線(xiàn)程調(diào)度、軟件設(shè)計(jì)、占用CPU等不同視角來(lái)理解。調(diào)度就是以合理方式為每個(gè)線(xiàn)程分配時(shí)間,使之得以運(yùn)行。一個(gè)函數(shù)只有在給出其線(xiàn)程描述符及線(xiàn)程堆棧的情況下,才可以被稱(chēng)為線(xiàn)程,才能夠被調(diào)度運(yùn)行。線(xiàn)程一般有四種狀態(tài),分別為:終止態(tài)、阻塞態(tài)、就緒態(tài)和激活態(tài)。線(xiàn)程有三種基本形式,分別是單次執(zhí)行、周期執(zhí)行及資源驅(qū)動(dòng)等形式。第27頁(yè)共27頁(yè)RTOS第2章RT-Thread第一個(gè)樣例工程本章導(dǎo)引:學(xué)習(xí)RTOS,首先要以一個(gè)芯片為基礎(chǔ),按照“分門(mén)別類(lèi),各有歸處”的原則,從建立無(wú)操作系統(tǒng)開(kāi)始,建立起RTOS的工程框架,讓幾個(gè)最簡(jiǎn)單的線(xiàn)程“跑”起來(lái)。以此簡(jiǎn)明理解線(xiàn)程被調(diào)度運(yùn)行的基本過(guò)程,隨后就可以進(jìn)行RTOS下程序設(shè)計(jì)的學(xué)習(xí)了。本章給出RT-Thread的工程框架及第一個(gè)樣例工程。2.1RT-Thread簡(jiǎn)介RTOS第2章RT-Thread第一個(gè)樣例工程2.3第一個(gè)樣例工程2.4本章小結(jié)2.2軟硬件開(kāi)發(fā)平臺(tái)第29頁(yè)共24頁(yè)RT-Thread(RealTime-Thread)是上海睿賽德電子科技有限公司于2006年開(kāi)始推出的開(kāi)源及社區(qū)化發(fā)展的一款實(shí)時(shí)操作系統(tǒng),主要面向嵌入式人工智能與物聯(lián)網(wǎng)領(lǐng)域。RTOS2.1RT-Thread簡(jiǎn)介(了解)2.1.1RT-Thread概述2.1.2RT-Thread的基本特點(diǎn)開(kāi)源免費(fèi)且有技術(shù)支持;淺顯易懂,方便移植;可裁剪性強(qiáng);占用資源?。ㄎ覀冇?KB的RAM下運(yùn)行案例)、功耗低。第30頁(yè)共24頁(yè)/download.html#download-rt-thread-nano如需更新工程內(nèi)的RT-Thread的版本,本書(shū)附錄A(P222),給出了RT-Thread版本更新方法RTOS2.1.3下載與更新RT-Thread源碼
從2006年開(kāi)始推出版本0.1.0后不斷升級(jí)和更新,本書(shū)用的是2017年后推出RT-ThreadNano精簡(jiǎn)內(nèi)核版,版本號(hào)是3.1.5。下載地址:第31頁(yè)共24頁(yè)RTOS2.2軟硬件開(kāi)發(fā)平臺(tái)學(xué)習(xí)RTOS一定要以一個(gè)軟硬件開(kāi)發(fā)平臺(tái)為藍(lán)本,學(xué)習(xí)共性技術(shù),銜接個(gè)性,仿真達(dá)不到目的。本書(shū)的硬件開(kāi)發(fā)平臺(tái)為:AHL-STM32L431(書(shū)中贈(zèng)送)。軟件開(kāi)發(fā)平臺(tái)為:金葫蘆集成開(kāi)發(fā)環(huán)境AHL-GEC-IDE,對(duì)于本書(shū)例程,兼容ST的集成開(kāi)發(fā)環(huán)境STM32CubeIDE。第32頁(yè)共24頁(yè)2.2.1網(wǎng)上電子資源RTOS網(wǎng)上電子資源內(nèi)容索引文件夾主要內(nèi)容01-Document文檔文件夾(AHL-STM32L431用戶(hù)手冊(cè)、參考等)02-Hardware硬件文件夾(硬件資源電子文檔)03-Software軟件文件夾(各章樣例源程序,按照章進(jìn)行編號(hào))04-Tool工具文件夾(編程實(shí)踐中可能使用的軟件工具)下載地址:https:///RTwThreadwARMjc/list.htm第33頁(yè)共24頁(yè)2.2.2硬件平臺(tái):AHL-STM32L431RTOS1.為什么需要硬件平臺(tái)?1)嵌入式軟件開(kāi)發(fā)有別于PC軟件開(kāi)發(fā)的一個(gè)顯著的特點(diǎn)在于,它需要一個(gè)交叉編譯和調(diào)試環(huán)境,即工程的編輯和編譯所使用的軟件通常在PC上運(yùn)行,而編譯生成的嵌入式軟件的機(jī)器碼文件則需要通過(guò)寫(xiě)入工具下載到目標(biāo)機(jī)上執(zhí)行。2)“仿真”不真,無(wú)法達(dá)到實(shí)際學(xué)習(xí)目標(biāo)。3)有硬件條件,當(dāng)然好!(本書(shū)內(nèi)直接夾帶)第34頁(yè)共24頁(yè)RTOS2.AHL-STM32L431開(kāi)發(fā)板的引出腳3.AHL-STM32L431開(kāi)發(fā)板的特點(diǎn)1)核心芯片。64引腳LQFP封裝的STM32L431RC芯片。內(nèi)含256KBFlash(共有128個(gè)扇區(qū))、64KBRAM,包含SysTick、GPIO、串口、A/D、D/A、I2C、SPI等模塊。2)硬件功能。由硬件最小系統(tǒng)、紅綠藍(lán)三色燈、觸摸按鍵、溫度傳感器、兩路TTL-USB串口等構(gòu)成。3)Type-C接口。方便程序下載與printf輸出進(jìn)行跟蹤調(diào)試。4)可擴(kuò)展應(yīng)用。不僅可以用于RT-Thread實(shí)時(shí)操作系統(tǒng)的學(xué)習(xí),也通過(guò)板的引出腳,外接其他接口模塊進(jìn)行創(chuàng)新性實(shí)驗(yàn)與實(shí)踐。引出腳的含義參見(jiàn)附錄B(P222)第35頁(yè)共24頁(yè)2.2.3軟件平臺(tái):金葫蘆集成開(kāi)發(fā)環(huán)境RTOS1.AHL-GEC-IDEhttp:///AHLwGECwIDE/list.htm2.STM32CubeIDEhttps:///zh/development-tools/stm32cubeide.html#get-software蘇州大學(xué)嵌入式實(shí)驗(yàn)室于2018年開(kāi)始逐步推出的免費(fèi)嵌入式集成開(kāi)發(fā)環(huán)境,集成了GNU編譯器、匯編器等,具有編輯、編譯、程序下載、printf打樁調(diào)試等功能,為設(shè)計(jì)人員提供了一個(gè)簡(jiǎn)捷易用的嵌入式開(kāi)發(fā)工具。主要特點(diǎn)有:1)兼容常用開(kāi)發(fā)環(huán)境;2)支持串口下載調(diào)試;3)具有外接軟件功能;4)包含豐富的常用工具;5)簡(jiǎn)化工程配置;6)提供可擴(kuò)展功能。該集成開(kāi)發(fā)環(huán)境是適用于ST公司的MCU。本書(shū)提供的例程兼容AHL-GEC-IDE與STM32CubeIDE。第36頁(yè)共24頁(yè)2.3.1樣例程序功能2.3第一個(gè)樣例工程RTOS樣例程序的硬件是紅、綠、藍(lán)三色一體的發(fā)光極管(小燈),由三個(gè)GPIO引腳控制其亮暗。軟件控制紅、綠、藍(lán)各燈每5秒、10秒、20秒狀態(tài)變化,對(duì)外表現(xiàn)為三色燈的合成色,其實(shí)際效果如右圖所示。第37頁(yè)共24頁(yè)2.3.2工程框架設(shè)計(jì)原則RTOS所謂工程框架是指工程內(nèi)文件夾的命名、文件的存放位置、文件內(nèi)容的放置規(guī)則。軟件工程與一件建筑作品、一件畫(huà)作等是一致的,軟件工程框架是整個(gè)工程的脊梁,其主要線(xiàn)程不是完成一個(gè)單獨(dú)的模塊功能,而是指出工程應(yīng)該包含哪些文件夾、這些文件夾里面應(yīng)該放置什么文件、各個(gè)文件的內(nèi)容又是如何定位等。因此,工程框架設(shè)計(jì)的基本原則應(yīng)該是:分門(mén)別類(lèi),各有歸處,建立工程文件夾,并考慮隨后內(nèi)容安排及內(nèi)容定位,建立其下級(jí)子文件夾。第38頁(yè)共24頁(yè)2.3.3NOS工程框架RTOS1.NOS工程框架的樹(shù)形結(jié)構(gòu)
文檔文件夾:文檔作為工密切相關(guān)部分,是軟件工程的基本要求CPU文件夾:存放CPU相關(guān)文件,由ARM提供給MCU廠家MCU文件夾:含有l(wèi)inker_file、startup、MCU_drivers下級(jí)文件夾GEC文件夾:引入通用嵌入式計(jì)算機(jī)(GEC)概念,預(yù)留該文件夾用戶(hù)板文件夾:含有硬件接線(xiàn)信息的User.h文件及應(yīng)用驅(qū)動(dòng)軟件構(gòu)件文件夾:含有與硬件無(wú)關(guān)的軟件構(gòu)件應(yīng)用程序文件夾:應(yīng)用程序主要在此處編程N(yùn)OS工程框架樹(shù)型模板第39頁(yè)共24頁(yè)RTOS2.NOS樣例工程的main函數(shù)及isr函數(shù)線(xiàn)程線(xiàn)(main函數(shù)):程序通過(guò)判斷全局變量gSec來(lái)控制三色小燈的開(kāi)關(guān)狀態(tài),實(shí)現(xiàn)紅燈每5s閃爍一次,綠燈每10s閃爍一次,藍(lán)燈每20s閃爍一次,同時(shí)通過(guò)串口輸出開(kāi)關(guān)信息。中斷線(xiàn)(isr.c中斷服務(wù)例程):當(dāng)定時(shí)器到達(dá)定時(shí)時(shí)間1s時(shí),會(huì)執(zhí)行定時(shí)器中斷服務(wù)例程。在定時(shí)器中斷服務(wù)例程中,首先判斷是否是由TIMER_USER觸發(fā)的中斷,如果是,對(duì)變量gSec累加,最后清除中斷標(biāo)志位。第40頁(yè)共24頁(yè)RTOS3.NOS樣例工程運(yùn)行測(cè)試..\03-Software\CH02-First-Example\NOS編譯樣例工程,通過(guò)TTL-USB串口線(xiàn)連接調(diào)試串口與PC,進(jìn)入AHL-GEC-IDE中的“下載”→“串口更新”,點(diǎn)擊“連接GEC”成功后,導(dǎo)入編譯出的.hex文件,點(diǎn)擊“一鍵自動(dòng)更新”將程序下載到目標(biāo)板上,可以觀察紅燈、藍(lán)燈和綠燈的閃爍情況,若與右圖所示一致,則正確。第41頁(yè)共24頁(yè)RTOS第42頁(yè)共24頁(yè)2.3.4RT-Thread工程框架RTOS
與NOS工程框架一致07_AppPrg文件夾:操作系統(tǒng)應(yīng)用程序主要在此處編程RT-Thread工程框架樹(shù)型模板1.RT-Thread工程框架的樹(shù)形結(jié)構(gòu)第43頁(yè)共24頁(yè)RTOS本工程框架是在NOS工程框架的基礎(chǔ)上修改了兩個(gè)文件夾:“05_UserBoard”、“07_AppPrg”,補(bǔ)充說(shuō)明如下:05_UserBoard文件夾:增加了Os_Self_API.h、OS_United_API.h兩個(gè)頭文件。Os_Self_API.h給出了RT-Thread對(duì)外接口函數(shù)API,如事件、消息隊(duì)列、信號(hào)量、互斥量等有關(guān)函數(shù),實(shí)際函數(shù)代碼駐留于BIOS中。Os_United_API.h給出了RTOS的統(tǒng)一對(duì)外接口API,目的是實(shí)現(xiàn)不同的RTOS應(yīng)用程序可移植。07_AppPrg文件夾:是用戶(hù)自定義線(xiàn)程的函數(shù)體文件,其中threadauto_appinit.c是主線(xiàn)程文件,其他前綴名帶thread的都是用戶(hù)線(xiàn)程文件。第44頁(yè)共24頁(yè)RTOS2.RT-Thread的啟動(dòng)在該樣例工程(..\CH02-First-Example\RT-Thread)中,先后共創(chuàng)建了5個(gè)線(xiàn)程,如下表所示:第45頁(yè)共24頁(yè)RTOS3.主線(xiàn)程的執(zhí)行過(guò)程(1)主線(xiàn)程過(guò)程概述1)在主線(xiàn)程中依次創(chuàng)建藍(lán)燈線(xiàn)程、綠燈線(xiàn)程和紅燈線(xiàn)程,紅燈線(xiàn)程實(shí)現(xiàn)紅燈每5s閃爍一次,綠燈線(xiàn)程實(shí)現(xiàn)綠燈每10s閃爍一次,藍(lán)燈線(xiàn)程實(shí)現(xiàn)藍(lán)燈每20s閃爍一次,創(chuàng)建完這些用戶(hù)線(xiàn)程之后主線(xiàn)程被終止。2)此時(shí),在就緒列表中剩下紅燈線(xiàn)程、綠燈線(xiàn)程、藍(lán)燈線(xiàn)程和空閑線(xiàn)程這四個(gè)線(xiàn)程。第46頁(yè)共24頁(yè)RTOS3)由于就緒列表優(yōu)先級(jí)最高的第一個(gè)線(xiàn)程是thread_redlight,它優(yōu)先得到激活運(yùn)行。thread_redlight線(xiàn)程每隔5000ms控制一次紅燈的亮暗狀態(tài),當(dāng)thread_redlight線(xiàn)程調(diào)用系統(tǒng)服務(wù)delay_ms執(zhí)行延時(shí),調(diào)度系統(tǒng)暫時(shí)剝奪該線(xiàn)程對(duì)CPU的使用權(quán),將該線(xiàn)程從就緒列表中移出,并將該線(xiàn)程的定時(shí)器放入延時(shí)列表中。4)thread_greenlight線(xiàn)程和thread_bluelight線(xiàn)程被系統(tǒng)依次調(diào)度執(zhí)行,根據(jù)延時(shí)時(shí)長(zhǎng)將線(xiàn)程從就緒列表中移出,并將線(xiàn)程的定時(shí)器放到延時(shí)列表中。5)當(dāng)這三個(gè)線(xiàn)程的定時(shí)器都被放到延時(shí)列表時(shí),就緒列表中只剩下空閑線(xiàn)程,此時(shí)空閑線(xiàn)程會(huì)得到運(yùn)行。第47頁(yè)共24頁(yè)RTOS從工作原理角度來(lái)說(shuō),調(diào)度切換是基于每1ms(時(shí)鐘嘀嗒)的SysTick中斷,在SysTick中斷服務(wù)例程中,查看延時(shí)列表中的線(xiàn)程的定時(shí)器是否到期,若有線(xiàn)程的定時(shí)器到期,則將線(xiàn)程的定時(shí)器從延時(shí)列表移出,并將線(xiàn)程放到就緒列表中。同時(shí),由于到期線(xiàn)程的優(yōu)先級(jí)大于空閑線(xiàn)程的優(yōu)先級(jí),會(huì)搶占空閑線(xiàn)程CPU使用權(quán),通過(guò)上下文切換激活,再次得到運(yùn)行。這些工作屬于RTOS內(nèi)核,應(yīng)用層面只要了解即可。本樣例工程中,由于SysTick中斷相關(guān)程序?qū)儆赗T-Thread內(nèi)核,被駐留于BIOS中,第9章直接運(yùn)行源碼,可以看到SysTick中斷服務(wù)例程,這里先初略了解一下。第48頁(yè)共24頁(yè)RTOS(2)主線(xiàn)程源碼解析1)創(chuàng)建用戶(hù)線(xiàn)程。把函數(shù)變?yōu)榫€(xiàn)程。2)啟動(dòng)用戶(hù)線(xiàn)程。放入就緒隊(duì)列。3)app_init函數(shù)代碼剖析。參見(jiàn)工程源碼。第49頁(yè)共24頁(yè)RTOS4.紅燈、綠燈、藍(lán)燈線(xiàn)程函數(shù)首先將小燈初始設(shè)置為暗,然后在while(1)的永久循環(huán)體內(nèi),通過(guò)delay_ms()函數(shù)實(shí)現(xiàn)延時(shí),每隔指定的時(shí)間間隔切換燈的亮暗一次。delay_ms()延時(shí)操作并非停止其他操作的空跑等待,而是通過(guò)延時(shí)列表與線(xiàn)程定時(shí)器管理延時(shí)線(xiàn)程,從而實(shí)現(xiàn)對(duì)線(xiàn)程的延時(shí)。在延時(shí)期間,線(xiàn)程被放入到延時(shí)列表中,RTOS可以調(diào)度執(zhí)行其他的線(xiàn)程。第50頁(yè)共24頁(yè)RTOS5.RT-Thread樣例工程運(yùn)行測(cè)試第51頁(yè)共24頁(yè)RTOS2.4本章小結(jié)學(xué)習(xí)RTOS的第一要素就是實(shí)踐,在實(shí)踐中體會(huì)其基本機(jī)制。要進(jìn)行實(shí)踐,必須有軟硬件基礎(chǔ)平臺(tái),本章給出的硬件平臺(tái)AHL-STM32L431及軟件平臺(tái)AHL-GEC-IDE的介紹,可以滿(mǎn)足RTOS學(xué)習(xí)與實(shí)踐的基本要求,也可以方便地應(yīng)用于實(shí)際產(chǎn)品開(kāi)發(fā)。良好的工程組織是軟件工程的基本要求,也是可移植、可復(fù)用、可維護(hù)的保證。要按照“分門(mén)別類(lèi),各有歸處”的基本原則組織工程框架,且一級(jí)子文件夾不再變動(dòng),使得新增內(nèi)容各有歸處,同時(shí)保證NOS下與RTOS下工程中一級(jí)子文件夾名稱(chēng)相同,為實(shí)際應(yīng)用開(kāi)發(fā)提供了規(guī)范的標(biāo)準(zhǔn)模板。本章的實(shí)例只用到RTOS下的延時(shí)函數(shù),但有三個(gè)線(xiàn)程在運(yùn)行,可以體會(huì)到這里的延時(shí)函數(shù)與運(yùn)行機(jī)器碼空延時(shí)不同,它讓出了CPU使用權(quán),在延時(shí)期間,CPU可以執(zhí)行其他線(xiàn)程,第10章將對(duì)這種延時(shí)方式做進(jìn)一步分析。第52頁(yè)共24頁(yè)RTOS本章導(dǎo)引:對(duì)應(yīng)用程序設(shè)計(jì)來(lái)說(shuō),RTOS是一種工具,是為應(yīng)用程序服務(wù)的,它不該成為應(yīng)用程序的負(fù)擔(dān)。而我們必須基本掌握這個(gè)工具的使用方法,才能使它為我們服務(wù),否則它會(huì)成為負(fù)擔(dān)。本章詳細(xì)介紹中斷系統(tǒng)、時(shí)間嘀嗒、延時(shí)函數(shù)、調(diào)度策略、線(xiàn)程優(yōu)先級(jí)和常用列表等RTOS下應(yīng)用程序的基本要素,帶領(lǐng)大家掌握RTOS的使用方法。第3章RTOS下應(yīng)用程序的基本要素3.2時(shí)間嘀嗒與延時(shí)函數(shù)3.1中斷基本概念及處理過(guò)程RTOS第3章RTOS下應(yīng)用程序的基本要素3.3調(diào)度策略3.4RTOS中的列表3.5本章小結(jié)第54頁(yè)共22頁(yè)RTOS3.1中斷基本概念及處理過(guò)程RTOS下程序運(yùn)行的兩條線(xiàn)路:線(xiàn)程線(xiàn)、中斷線(xiàn)線(xiàn)程線(xiàn):可能有許多個(gè)線(xiàn)程,由內(nèi)核調(diào)度運(yùn)行中斷線(xiàn):線(xiàn)程被某種中斷打斷后,轉(zhuǎn)去運(yùn)行中斷服務(wù)程序ISR,隨后返回原處繼續(xù)運(yùn)行第55頁(yè)共22頁(yè)RTOS3.1.1中斷基本概念1.中斷與異常的基本含義異常(exception)是CPU強(qiáng)行從正在執(zhí)行的程序切換到由某些內(nèi)部或外部條件所要求的處理線(xiàn)程上去,這些線(xiàn)程的緊急程度優(yōu)先于CPU正在執(zhí)行的線(xiàn)程。中斷(interrupt)是來(lái)自CPU外圍設(shè)備的強(qiáng)行線(xiàn)程切換請(qǐng)求。CPU對(duì)復(fù)位、中斷、異常具有同樣的處理過(guò)程,本書(shū)隨后在談及這個(gè)處理過(guò)程時(shí)統(tǒng)稱(chēng)為中斷。第56頁(yè)共22頁(yè)RTOS2.中斷源、中斷服務(wù)程序、中斷向量號(hào)與中斷向量表可以引起CPU產(chǎn)生中斷的外部器件被稱(chēng)為中斷源。CPU被中斷后轉(zhuǎn)去執(zhí)行的程序,被稱(chēng)為中斷服務(wù)程序(InterruptServiceRoutine,ISR)。一個(gè)CPU通??梢宰R(shí)別多個(gè)中斷源,給CPU能夠識(shí)別的每個(gè)中斷源編個(gè)號(hào),就叫中斷向量號(hào)。把各個(gè)中斷服務(wù)程序的首地址放在一段連續(xù)的地址中,并且按照中斷向量號(hào)順序存放,這個(gè)連續(xù)存儲(chǔ)區(qū)被稱(chēng)為中斷向量表。在ARMCortex-M微處理器中,還有一個(gè)非內(nèi)核中斷請(qǐng)求(InterruptRequest,IRQ)的編號(hào),稱(chēng)為IRQ號(hào)。IRQ號(hào)將內(nèi)核中斷與非內(nèi)核中斷稍加區(qū)分,對(duì)于非內(nèi)核中斷,IRQ中斷號(hào)從0開(kāi)始遞增,而對(duì)于內(nèi)核中斷,IRQ中斷號(hào)從-1開(kāi)始遞減。第57頁(yè)共22頁(yè)RTOS3.中斷優(yōu)先級(jí)、可屏蔽中斷和不可屏蔽中斷在進(jìn)行CPU設(shè)計(jì)時(shí),一般定義了中斷源的優(yōu)先級(jí)。若CPU在程序執(zhí)行過(guò)程中,有兩個(gè)以上中斷同時(shí)發(fā)生,則優(yōu)先級(jí)最高的中斷得到最先響應(yīng)??善帘沃袛嗍侵缚赏ㄟ^(guò)程序設(shè)置的方式?jīng)Q定不響應(yīng)該中斷,即該中斷被屏蔽了;不可屏蔽中斷是指不能通過(guò)程序方式關(guān)閉的中斷。第58頁(yè)共22頁(yè)RTOS中斷處理的基本過(guò)程有:中斷請(qǐng)求、中斷采樣、中斷響應(yīng)與中斷處理1.中斷請(qǐng)求當(dāng)某一中斷源需要CPU為其服務(wù)時(shí),它將會(huì)向CPU發(fā)出中斷請(qǐng)求信號(hào)(一種電信號(hào))。中斷控制器獲取中斷源硬件設(shè)備的中斷向量號(hào),并通過(guò)識(shí)別的中斷向量號(hào),將對(duì)應(yīng)硬件模塊的中斷狀態(tài)寄存器中的“中斷請(qǐng)求位”置位,以便讓CPU知道何種中斷請(qǐng)求來(lái)了。2.中斷采樣(檢測(cè))(了解)在中斷周期中,CPU將會(huì)檢測(cè)系統(tǒng)中是否有中斷請(qǐng)求信號(hào),若此時(shí)有中斷請(qǐng)求信號(hào),則CPU將會(huì)暫停當(dāng)前執(zhí)行的線(xiàn)程,轉(zhuǎn)而去對(duì)中斷請(qǐng)求進(jìn)行響應(yīng),若系統(tǒng)中沒(méi)有中斷請(qǐng)求信號(hào)則繼續(xù)執(zhí)行當(dāng)前線(xiàn)程。3.1.2中斷處理的基本過(guò)程(重點(diǎn)、難點(diǎn))第59頁(yè)共22頁(yè)RTOS3.中斷響應(yīng)與中斷處理中斷響應(yīng)的過(guò)程是由系統(tǒng)自動(dòng)完成的。在中斷的響應(yīng)過(guò)程中,首先CPU會(huì)查找中斷源所對(duì)應(yīng)的中斷模式是否允許產(chǎn)生中斷,若中斷模塊允許中斷,則響應(yīng)該中斷請(qǐng)求,中斷響應(yīng)的過(guò)程要求CPU保存當(dāng)前環(huán)境的“上下文(context)”于棧中。通過(guò)中斷向量號(hào)找到中斷向量表中對(duì)應(yīng)的中斷服務(wù)程序ISR的首地址,轉(zhuǎn)而去執(zhí)行中斷服務(wù)程序ISR。第60頁(yè)共22頁(yè)RTOS4.ArmCortex-M微處理器中斷編程要點(diǎn)1)理解初始中斷向量表(轉(zhuǎn)源程序)2)確定對(duì)哪個(gè)中斷源編程3)宏定義中斷服務(wù)程序名4)編制中斷服務(wù)例程5)在RTOS下的中斷初始化第61頁(yè)共22頁(yè)RTOS時(shí)鐘嘀嗒(Timetick),是RTOS中時(shí)間的最小度量單位,是線(xiàn)程調(diào)度的基本時(shí)間單元。主要用于系統(tǒng)計(jì)時(shí)、線(xiàn)程調(diào)度等。要進(jìn)行線(xiàn)程切換,至少等一個(gè)時(shí)間嘀嗒。時(shí)鐘嘀嗒由硬件定時(shí)器產(chǎn)生,一般以毫秒(ms)為單位。在RT-Thread中,由于ArmCortex-M內(nèi)核中含有SysTick定時(shí)器,為了操作系統(tǒng)在芯片之間移植方便,時(shí)鐘嘀嗒由對(duì)SysTick定時(shí)器編程產(chǎn)生。3.2時(shí)間嘀嗒與延時(shí)函數(shù)3.2.1時(shí)間嘀嗒(重點(diǎn))第62頁(yè)共22頁(yè)RTOS1.RTOS下延時(shí)函數(shù)的基本內(nèi)涵在有操作系統(tǒng)的情況下,線(xiàn)程一般不采用原地空跑(空循環(huán))的方式進(jìn)行延時(shí)(該方式線(xiàn)程仍然占用CPU的使用權(quán)),而往往會(huì)使用到延時(shí)函數(shù)(該方式線(xiàn)程會(huì)讓出CPU使用權(quán)),通過(guò)使用延時(shí)列表管理延時(shí)線(xiàn)程,從而實(shí)現(xiàn)對(duì)線(xiàn)程的延時(shí)。在RT-Thread中,提供了一個(gè)延時(shí)函數(shù)rt_thread_delay,為了直觀與通用,在Os_United_API.h文件中將該函數(shù)宏定義為delay_ms。執(zhí)行該函數(shù)時(shí),將當(dāng)前線(xiàn)程的定時(shí)器按其延時(shí)參數(shù)指示的時(shí)間插入到延時(shí)列表的相應(yīng)位置,當(dāng)延時(shí)時(shí)間到達(dá)時(shí),線(xiàn)程進(jìn)入就緒列表,等待RT-Thread調(diào)度運(yùn)行。3.2.2延時(shí)函數(shù)第63頁(yè)共22頁(yè)RTOS2.使用RTOS下延時(shí)函數(shù)的注意點(diǎn)1)delay_ms只能用在對(duì)時(shí)間精度要求不高或者時(shí)間間隔較長(zhǎng)的場(chǎng)合。延時(shí)時(shí)長(zhǎng)參數(shù)以時(shí)鐘嘀嗒為單位,在RT-Thread中1個(gè)時(shí)鐘嘀嗒等于1ms,這樣對(duì)延時(shí)時(shí)長(zhǎng)參數(shù)就可以理解為是以ms為單位,此時(shí)實(shí)際延時(shí)時(shí)間與希望延時(shí)時(shí)間相等。但如果1個(gè)時(shí)鐘嘀嗒大于1ms時(shí),而對(duì)希望延時(shí)的時(shí)間精度有較高要求時(shí)(如延時(shí)時(shí)間不是時(shí)鐘嘀嗒的整數(shù)倍),由于內(nèi)核是在每個(gè)時(shí)鐘嘀嗒到來(lái)時(shí)(即SysTick中斷)才會(huì)去檢查延時(shí)列表,此時(shí)實(shí)際延時(shí)時(shí)間與希望延時(shí)時(shí)間可能會(huì)有誤差,最壞情況下的誤差接近一個(gè)時(shí)鐘嘀嗒。所以,只能用在對(duì)時(shí)間精度要求不高或者時(shí)間間隔較長(zhǎng)的場(chǎng)合。2)延時(shí)小于1個(gè)時(shí)鐘嘀嗒,不使用delay_ms函數(shù)。若需延時(shí)的時(shí)間小于1個(gè)時(shí)間時(shí)鐘嘀嗒,則不建議使用delay_ms函數(shù),而是根據(jù)具體的延時(shí)時(shí)間,決定采用變量循環(huán)空跑(NOP指令)、插入?yún)R編語(yǔ)言或探索其他更合理的方式來(lái)解決。第64頁(yè)共22頁(yè)RTOS調(diào)度是內(nèi)核的主要職責(zé)之一,它決定將哪一個(gè)線(xiàn)程投入運(yùn)行、何時(shí)投入運(yùn)行以及運(yùn)行多久,協(xié)調(diào)線(xiàn)程對(duì)系統(tǒng)資源的合理使用。調(diào)度是一種指揮方式,有策略問(wèn)題。調(diào)度策略不同,線(xiàn)程被投入運(yùn)行時(shí)刻也不同。常用的調(diào)度策略主要有:優(yōu)先級(jí)搶占調(diào)度與時(shí)間片輪轉(zhuǎn)調(diào)度等。3.3調(diào)度策略3.3.1調(diào)度基礎(chǔ)知識(shí)(重點(diǎn))第65頁(yè)共22頁(yè)RTOS1.優(yōu)先級(jí)搶占調(diào)度優(yōu)先級(jí)搶占調(diào)度總是讓就緒列表中優(yōu)先級(jí)最高的線(xiàn)程先運(yùn)行,對(duì)于優(yōu)先級(jí)相同的線(xiàn)程,則采用先進(jìn)先出(FirstInFirstOut,F(xiàn)IFO)的策略。在ARMCortex-M處理器中,中斷(異常)的優(yōu)先級(jí)一般在MCU設(shè)計(jì)階段就確定了,優(yōu)先級(jí)編號(hào)越小表示中斷(異常)的優(yōu)先級(jí)越高,而且高優(yōu)先級(jí)可以搶占低優(yōu)先級(jí)的中斷(異常)。在RT-Thread中,通常使用32種優(yōu)先級(jí),數(shù)值分別為1~32,優(yōu)先級(jí)數(shù)值越小,表示優(yōu)先級(jí)越高。第66頁(yè)共22頁(yè)RTOS基于優(yōu)先級(jí)先進(jìn)先出調(diào)度策略在運(yùn)行時(shí)可分為以下三種情況:第一種情況,線(xiàn)程B的優(yōu)先級(jí)高于線(xiàn)程A,當(dāng)線(xiàn)程A正在運(yùn)行時(shí),線(xiàn)程B準(zhǔn)備就緒,則調(diào)度系統(tǒng)在下一個(gè)時(shí)間嘀嗒中斷發(fā)生的時(shí)候,會(huì)將CPU的使用權(quán)從線(xiàn)程A處搶奪,將其轉(zhuǎn)入就緒態(tài),并分配CPU使用權(quán)給線(xiàn)程B。第二種情況,當(dāng)線(xiàn)程A被阻塞后主動(dòng)放棄CPU使用權(quán),調(diào)度系統(tǒng)將在當(dāng)前就緒的線(xiàn)程中尋找優(yōu)先級(jí)最高的線(xiàn)程,將CPU的使用權(quán)分配給它。第三種情況,當(dāng)存在同一優(yōu)先級(jí)的多個(gè)線(xiàn)程都處于就緒態(tài)時(shí),較早進(jìn)入就緒態(tài)的線(xiàn)程優(yōu)先獲得系統(tǒng)分配的一段固定時(shí)間片供其運(yùn)行。第67頁(yè)共22頁(yè)RTOS2.時(shí)間片輪詢(xún)調(diào)度時(shí)間片輪轉(zhuǎn)(RoundRobin,RR)調(diào)度策略,也總是讓就緒列表中優(yōu)先級(jí)最高的線(xiàn)程先運(yùn)行,但是,對(duì)于優(yōu)先級(jí)相同的線(xiàn)程,使用時(shí)間片輪轉(zhuǎn)方式,即相同優(yōu)先級(jí)的線(xiàn)程相同時(shí)間片方式分享CPU時(shí)間。實(shí)際上,當(dāng)采用RR調(diào)度時(shí),不同優(yōu)先級(jí)的線(xiàn)程是按照FIFO策略排列的;相同優(yōu)先級(jí)的線(xiàn)程會(huì)才會(huì)采用時(shí)間片輪詢(xún)來(lái)調(diào)用。第68頁(yè)共22頁(yè)RTOS在RT-Thread中,采用基于優(yōu)先級(jí)先進(jìn)先出(FIFO)和時(shí)間片輪轉(zhuǎn)(RR)的綜合調(diào)度策略,該調(diào)度策略為:總是將CPU的使用權(quán)分配給當(dāng)前就緒的、優(yōu)先級(jí)最高的且是較先進(jìn)入就緒態(tài)的線(xiàn)程,同一優(yōu)先級(jí)的線(xiàn)程采用時(shí)間片輪轉(zhuǎn)的調(diào)度算法。每個(gè)輪詢(xún)線(xiàn)程有最長(zhǎng)時(shí)間限制(時(shí)間片),在此時(shí)間片內(nèi)該線(xiàn)程可以被激活。3.3.2RT-Thread中使用的調(diào)度策略(重點(diǎn)、難點(diǎn))在RT-Thread中,調(diào)度策略是通過(guò)可掛起系統(tǒng)調(diào)用PendSV(PendableSupervisor,PendSV)中斷和定時(shí)器SysTick中斷來(lái)實(shí)現(xiàn)的。第69頁(yè)共22頁(yè)RTOS3.3.3RT-Thread中固有線(xiàn)程(重點(diǎn))1.自啟動(dòng)線(xiàn)程在內(nèi)核啟動(dòng)之前,需要?jiǎng)?chuàng)建一個(gè)自啟動(dòng)線(xiàn)程,以便內(nèi)核啟動(dòng)后執(zhí)行它,并由它來(lái)創(chuàng)建其他用戶(hù)線(xiàn)程。當(dāng)自啟動(dòng)線(xiàn)程被創(chuàng)建時(shí),其狀態(tài)為就緒態(tài),會(huì)自動(dòng)被放入到就緒列表中。在RT-Thread中自啟動(dòng)線(xiàn)程的優(yōu)先級(jí)為10,在啟動(dòng)過(guò)程中由自啟動(dòng)線(xiàn)程來(lái)創(chuàng)建其他線(xiàn)程,因此它的優(yōu)先級(jí)級(jí)必須要高于或等于其他用戶(hù)線(xiàn)程的優(yōu)先級(jí),這樣才能保證其他用戶(hù)線(xiàn)程被正常創(chuàng)建并運(yùn)行。若自啟動(dòng)線(xiàn)程優(yōu)先級(jí)低于它所創(chuàng)建的用戶(hù)線(xiàn)程優(yōu)先級(jí),則一旦創(chuàng)建一個(gè)線(xiàn)程后,自啟動(dòng)線(xiàn)程會(huì)被搶占,無(wú)法繼續(xù)創(chuàng)建其他線(xiàn)程。第70頁(yè)共22頁(yè)RTOS2.空閑線(xiàn)程為了確保在內(nèi)核無(wú)用戶(hù)線(xiàn)程可執(zhí)行的時(shí)候,CPU能繼續(xù)保持運(yùn)行狀態(tài),那么就必須安排一個(gè)空閑線(xiàn)程,該線(xiàn)程不完成任何實(shí)際工作,其狀態(tài)為就緒態(tài),始終在就緒列表中。在RT-Thread中,空閑線(xiàn)程是在內(nèi)核啟動(dòng)的過(guò)程被創(chuàng)建的,其優(yōu)先級(jí)為31,是所有線(xiàn)程中最低的。第71頁(yè)共22頁(yè)RTOSRTOS中要運(yùn)行的線(xiàn)程大多先放入就緒列表,即就緒列表中的線(xiàn)程是即將運(yùn)行的線(xiàn)程,隨時(shí)準(zhǔn)備被調(diào)度運(yùn)行。至于何時(shí)被允許運(yùn)行,由內(nèi)核調(diào)度策略決定。就緒列表中的線(xiàn)程,按照優(yōu)先級(jí)高低順序及先進(jìn)先出排列。當(dāng)內(nèi)核調(diào)度器確認(rèn)哪個(gè)線(xiàn)程運(yùn)行,則將該線(xiàn)程狀態(tài)標(biāo)志由就緒態(tài)改為激活態(tài),線(xiàn)程會(huì)從就緒列表取出被執(zhí)行。3.4RTOS中的功能列表(重點(diǎn))3.4.1就緒列表第72頁(yè)共22頁(yè)RTOS延時(shí)阻塞列表是按線(xiàn)程的延時(shí)時(shí)間長(zhǎng)短的順序排列,線(xiàn)程進(jìn)入延時(shí)列表后,存儲(chǔ)的延時(shí)時(shí)間與調(diào)用延時(shí)函數(shù)實(shí)參不同,存儲(chǔ)的延時(shí)時(shí)間=(延時(shí)函數(shù)實(shí)參-所有前面線(xiàn)程存儲(chǔ)時(shí)間之和)。當(dāng)線(xiàn)程調(diào)用了延時(shí)函數(shù),則該線(xiàn)程就會(huì)被放入到延時(shí)列表中,其狀態(tài)由激活態(tài)轉(zhuǎn)化為阻塞態(tài)。當(dāng)延時(shí)時(shí)間到時(shí),該線(xiàn)程狀態(tài)由阻塞態(tài)轉(zhuǎn)化為就緒態(tài),線(xiàn)程將被從延時(shí)列表移出并放入到就緒列表中,線(xiàn)程狀態(tài)被設(shè)置為就緒態(tài),等待調(diào)度執(zhí)行。3.4.2延時(shí)阻塞列表第73頁(yè)共22頁(yè)RTOS當(dāng)線(xiàn)程進(jìn)行永久等待狀態(tài)或因等待事件位、消息、信號(hào)量、互斥量時(shí),其狀態(tài)由激活態(tài)轉(zhuǎn)化為阻塞態(tài),線(xiàn)程就會(huì)被放到阻塞列表中。當(dāng)?shù)却龡l件滿(mǎn)足時(shí),該線(xiàn)程狀態(tài)由阻塞態(tài)轉(zhuǎn)化為就緒態(tài),線(xiàn)程會(huì)從阻塞列表中移出而放入到就緒列表中,由RTOS進(jìn)行調(diào)度執(zhí)行。3.4.3條件阻塞列表為了方便對(duì)線(xiàn)程進(jìn)行分類(lèi)管理,在RTOS中會(huì)根據(jù)線(xiàn)程等待的事件位、消息、信號(hào)量、互斥量等條件,將線(xiàn)程放入對(duì)應(yīng)的阻塞列表。根據(jù)線(xiàn)程等待的條件不同,阻塞列表又可分為事件阻塞列表、消息阻塞列表、信號(hào)量阻塞列表、互斥量阻塞列表。第74頁(yè)共22頁(yè)RTOS本章給出的RTOS下應(yīng)用程序的基本要素主要是針對(duì)應(yīng)用開(kāi)發(fā)者,要理解RTOS下程序運(yùn)行的基本流程,這些基本要素是必須掌握的。異常與中斷在程序設(shè)計(jì)中有著特殊作用,使用一個(gè)芯片編程,必須知道這個(gè)芯片在硬件上支持哪些異常與中斷,中斷條件是什么,在何處進(jìn)行中斷服務(wù)例程的編程等。在RTOS中,時(shí)鐘嘀嗒是時(shí)間的最小度量單位,是線(xiàn)程調(diào)度的基本時(shí)間單元。
在RTOS中,延時(shí)函數(shù)具有讓出CPU使用權(quán)的功能,調(diào)用延時(shí)函數(shù)的線(xiàn)程將進(jìn)入延時(shí)阻塞列表,時(shí)間到達(dá)后,內(nèi)核將其從延時(shí)阻塞列表中移到就緒列表,被調(diào)度運(yùn)行。
在RTOS中,調(diào)度是內(nèi)核的主要職責(zé)之一,它決定將哪一個(gè)線(xiàn)程投入運(yùn)行、何時(shí)投入運(yùn)行以及運(yùn)行多久。編程時(shí),只要線(xiàn)程進(jìn)入就緒列表,就認(rèn)為該線(xiàn)程已經(jīng)運(yùn)行,何時(shí)運(yùn)行就是調(diào)度者的事情了。RTOS的基本調(diào)度策略有:優(yōu)先級(jí)搶占調(diào)度與時(shí)間片輪轉(zhuǎn)調(diào)度等。在RTOS中,使用就緒列表管理就緒的線(xiàn)程,使用延時(shí)阻塞列表管理延時(shí)等待的線(xiàn)程,使用阻塞列表管理因等待事件、消息等而阻塞的線(xiàn)程。3.5本章小結(jié)第75頁(yè)共22頁(yè)RTOS
本章導(dǎo)引:
在RTOS中,每個(gè)線(xiàn)程作為獨(dú)立的個(gè)體,接受內(nèi)核調(diào)度器的調(diào)度運(yùn)行。但是,線(xiàn)程之間不是完全不聯(lián)系的,其聯(lián)系的方式就是同步與通信。只有掌握同步與通信的編程方法,才能編寫(xiě)出較為完整的程序,RTOS中主要的同步與通信手段有事件與消息隊(duì)列,它們是RTOS提供給應(yīng)用編程的重要工具,這個(gè)內(nèi)容是RTOS下進(jìn)行應(yīng)用程序開(kāi)發(fā)需要重點(diǎn)掌握的內(nèi)容之一。在多線(xiàn)程的工程中,還會(huì)涉及到對(duì)共享資源的排他使用問(wèn)題,RTOS提供了信號(hào)量與互斥量來(lái)協(xié)調(diào)多線(xiàn)程下的共享資源的排他使用,它們也同步與通信范疇。本章給出事件、消息隊(duì)列、信號(hào)量及互斥量的含義、應(yīng)用場(chǎng)合、操作函數(shù)以及編程舉例,第9章再簡(jiǎn)明剖析其運(yùn)行機(jī)制第4章同步與通信4.1RTOS中同步與通信基本概念RTOS4.2事件4.3消息隊(duì)列4.4信號(hào)量4.5互斥量第4章同步與通信的應(yīng)用方法4.6本章小結(jié)第77頁(yè)共45頁(yè)RTOS4.1RTOS中同步與通信基本概念
在百米比賽起點(diǎn),運(yùn)動(dòng)員正在等待發(fā)令槍響,一旦發(fā)令槍響,運(yùn)動(dòng)員立即起跑,這就是一種同步。當(dāng)一個(gè)人采摘蘋(píng)果放入籃子中,另外一個(gè)人只要見(jiàn)到籃子中有蘋(píng)果,就取出加工,這也是一種同步。RTOS中也有類(lèi)似的機(jī)制應(yīng)用于線(xiàn)程之間,或者中斷服務(wù)例程與線(xiàn)程之間。第78頁(yè)共45頁(yè)RTOS4.1.1同步的含義與通信手段同步:為了實(shí)現(xiàn)各線(xiàn)程之間的合作和無(wú)沖突的運(yùn)行,一個(gè)線(xiàn)程的運(yùn)行過(guò)程就需要和其他線(xiàn)程進(jìn)行配合,線(xiàn)程之間的配合過(guò)程稱(chēng)為同步。線(xiàn)程間的同步過(guò)程通常是由某種條件來(lái)觸發(fā)的,所以同步也稱(chēng)為條件同步。通信手段:為了實(shí)現(xiàn)線(xiàn)程之間的同步,RTOS提供了靈活多樣的通信手段,如事件、消息隊(duì)列、信號(hào)量、互斥量等等,它們適合不同的場(chǎng)合。第79頁(yè)共45頁(yè)RTOS
1.從是否需要通信數(shù)據(jù)的角度看1)如果只發(fā)同步信號(hào),不需要數(shù)據(jù),可使用事件、信號(hào)量、互斥量。同步信號(hào)為多個(gè)信號(hào)的邏輯運(yùn)算結(jié)果時(shí),一般使用事件作為同步手段。2)如果既有同步功能,又能傳輸數(shù)據(jù),可使用消息隊(duì)列。2.從產(chǎn)生與使用數(shù)據(jù)速度的角度看
若產(chǎn)生數(shù)據(jù)的速度快于處理速度,就會(huì)有未處理的數(shù)據(jù)堆積,這種情況下只能使用有緩沖功能的通信手段,如消息隊(duì)列。但是,產(chǎn)生數(shù)據(jù)的速度總平均應(yīng)該慢于處理速度,否則消息隊(duì)列會(huì)溢出。第80頁(yè)共45頁(yè)RTOS4.1.2同步類(lèi)型(難點(diǎn))在RTOS中,有中斷與線(xiàn)程之間的同步、兩個(gè)線(xiàn)程之間的同步、兩個(gè)以上線(xiàn)程同步一個(gè)線(xiàn)程、多個(gè)線(xiàn)程相互同步等同步類(lèi)型。1.中斷和線(xiàn)程之間的同步一般是中斷服務(wù)例程發(fā)出同步信號(hào),處于阻塞狀態(tài)的線(xiàn)程等著這個(gè)信號(hào)。一旦這個(gè)信號(hào)發(fā)出,處于阻塞狀態(tài)的線(xiàn)程就會(huì)從阻塞狀態(tài)變?yōu)榫途w狀態(tài),接受RTOS內(nèi)核的調(diào)度。2.兩個(gè)線(xiàn)程之間的同步兩個(gè)線(xiàn)程之間的同步分為單向同步(用得多)和雙向同步(實(shí)現(xiàn)產(chǎn)銷(xiāo)平衡)。第81頁(yè)共45頁(yè)RTOS3
.兩個(gè)以上線(xiàn)程同步+一個(gè)線(xiàn)程(了解)當(dāng)需要由兩個(gè)以上線(xiàn)程來(lái)同步一個(gè)線(xiàn)程時(shí),簡(jiǎn)單的通信方式難以實(shí)現(xiàn),可采用事件按“邏輯與”來(lái)實(shí)現(xiàn),此時(shí)被同步線(xiàn)程的執(zhí)行次數(shù)不超過(guò)各個(gè)同步線(xiàn)程中發(fā)出信號(hào)最少的線(xiàn)程的執(zhí)行次數(shù)。4
.多個(gè)線(xiàn)程相互同步(了解)多個(gè)線(xiàn)程相互同步可以將若干相關(guān)線(xiàn)程的運(yùn)行頻度保持一致,每個(gè)相關(guān)線(xiàn)程在運(yùn)行到同步點(diǎn)時(shí)都必須等待其他線(xiàn)程,只有全部相關(guān)線(xiàn)程都到達(dá)同步點(diǎn),才可以按優(yōu)先級(jí)順序依次離開(kāi)同步點(diǎn),從而達(dá)到相關(guān)線(xiàn)程的運(yùn)行頻度保持一致的目的。第82頁(yè)共45頁(yè)RTOS4.2.1事件的含義及應(yīng)用場(chǎng)合4.2事件
事件:當(dāng)某個(gè)線(xiàn)程需要等待另一線(xiàn)程(或中斷)的信號(hào)才能繼續(xù)工作,這個(gè)信號(hào)被稱(chēng)為事件。若需要將兩個(gè)及兩個(gè)以上的信號(hào)進(jìn)行某種邏輯運(yùn)算,用邏輯運(yùn)算的結(jié)果作為同步控制信號(hào)時(shí),也是事件。
應(yīng)用場(chǎng)合:事件可以實(shí)現(xiàn)一個(gè)線(xiàn)程(或中斷服務(wù)例程)控制另一個(gè)線(xiàn)程,多個(gè)信號(hào)也可以進(jìn)行邏輯運(yùn)算后形成一個(gè)事件。事件發(fā)出后,等待事件的線(xiàn)程將從阻塞狀態(tài)變?yōu)榫途w狀態(tài)。第83頁(yè)共45頁(yè)RTOS4.2.2事件的常用函數(shù)1.創(chuàng)建事件函數(shù)(event_create)第84頁(yè)共45頁(yè)RTOS2.獲取事件函數(shù)event_recv()第85頁(yè)共45頁(yè)RTOS3.發(fā)送事件函數(shù)event_send()第86頁(yè)共45頁(yè)4.2.3事件編程舉例:通過(guò)事件實(shí)現(xiàn)中斷和線(xiàn)程通信1.事件樣例程序的功能事件編程實(shí)例見(jiàn)“..\03-Software\CH04-Syn-Comm\Event-ISR”文件夾。該工程給出了利用事件進(jìn)行中斷與線(xiàn)程同步的實(shí)例,其功能為:1)用戶(hù)串口中斷為收到一個(gè)字節(jié)產(chǎn)生中斷,在“isr.c”文件的中斷服務(wù)例程UART_User_Handler中,進(jìn)行接收組幀;2)當(dāng)串口接收到一個(gè)完整的數(shù)據(jù)幀(幀頭3A+四位數(shù)據(jù)+幀尾0D0A),發(fā)送一個(gè)事件(起名為紅燈事件);3)在紅燈線(xiàn)程中,有等待紅燈事件的語(yǔ)句,沒(méi)有紅燈事件時(shí),該線(xiàn)程進(jìn)入阻塞隊(duì)列,一旦有紅燈事件發(fā)生,運(yùn)行隨后的程序,紅燈狀態(tài)反轉(zhuǎn)。第87頁(yè)共45頁(yè)RTOS2.準(zhǔn)備階段1)聲明事件字全局變量并創(chuàng)建事件字。在使用事件之前,首先在07_AppPrg文件夾下的工程總頭文件(includes.h文件)中聲明一個(gè)事件字全局變量g_EventWord。2)確定要用的事件名稱(chēng)、使用事件字的哪一位。在樣例工程總頭文件includes.h的“全局使用的宏常數(shù)”處3)創(chuàng)建事件字實(shí)例。在threadauto_appinit.c文件app_init函數(shù)中創(chuàng)建。
第88頁(yè)共47頁(yè)RTOS
3.應(yīng)用階段1)等待事件位置位:這一步是在等待事件觸發(fā)的線(xiàn)程中進(jìn)行的,使用event_recv函數(shù)。2)設(shè)置事件位:這一步是在觸發(fā)事件的線(xiàn)程中進(jìn)行的(也可以在中斷服務(wù)例程中進(jìn)行),在線(xiàn)程的相應(yīng)位置使用event_send函數(shù)對(duì)事件位置位,用來(lái)表示某個(gè)特定事件發(fā)生。例:event_send(g_EventWord,RED_LIGHT_EVENT);//設(shè)置紅燈事件4.樣例程序源碼(參見(jiàn)“..\03-Software\CH04-Syn-Comm\Event-ISR”),轉(zhuǎn)入實(shí)例分析。第89頁(yè)共45頁(yè)RTOS4.3.1消息隊(duì)列的含義以及應(yīng)用場(chǎng)合4.3消息隊(duì)列
消息(Message):是一種線(xiàn)程間數(shù)據(jù)傳送的單位,它可以是只包含文本的字符串或數(shù)字,也可以更復(fù)雜,如結(jié)構(gòu)體類(lèi)型等,所以相比使用事件時(shí)傳遞的少量數(shù)據(jù)(1位或1個(gè)字),消息則可以傳遞更多、更復(fù)雜的數(shù)據(jù),它的傳送通過(guò)消息隊(duì)列實(shí)現(xiàn)。
消息隊(duì)列(MessageQueue):是在消息傳輸過(guò)程中保存消息的一種容器,是將消息從它的源頭發(fā)送到目的地的中轉(zhuǎn)站,它是能夠?qū)崿F(xiàn)線(xiàn)程之間同步和大量數(shù)據(jù)交換的一種隊(duì)列機(jī)制。第90頁(yè)共45頁(yè)RTOS消息隊(duì)列作為具有行為同步和緩沖功能的數(shù)據(jù)通信手段,主要適用于以下兩個(gè)場(chǎng)合:第一,消息的產(chǎn)生周期較短,消息的處理周期較長(zhǎng);第二,消息的產(chǎn)生是隨機(jī)的,消息的處理速度與消息內(nèi)容有關(guān),某些消息的處理時(shí)間有可能較長(zhǎng)。這兩種情況均可把產(chǎn)生與處理分在兩個(gè)程序主體進(jìn)行編程,它們之間通過(guò)消息隊(duì)列通信。第91頁(yè)共45頁(yè)RTOS4.3.2消息隊(duì)列的常用函數(shù)1.創(chuàng)建消息隊(duì)列變量函數(shù)(mq_create)第92頁(yè)共45頁(yè)RTOS第93頁(yè)共45頁(yè)2.發(fā)送消息函數(shù)(mq_send)RTOS3.獲取消息函數(shù)(mq_recv)第94頁(yè)共45頁(yè)RTOS4.3.3消息隊(duì)列的編程實(shí)例:通過(guò)消息隊(duì)列實(shí)現(xiàn)中斷和線(xiàn)程通信1.消息隊(duì)列樣例程序功能消息隊(duì)列編程實(shí)例見(jiàn)“..\03-Software\CH04-Syn-Comm\MessageQueue”文件夾。該工程給出如何利用消息隊(duì)列中斷服務(wù)例程與線(xiàn)程之間傳遞消息,其功能為:1)用戶(hù)串口中斷為收到一個(gè)字節(jié)產(chǎn)生中斷,在“isr.c”文件的中斷服務(wù)例程UART_User_Handler中,進(jìn)行接收組幀;2)當(dāng)串口接收到一個(gè)完整的數(shù)據(jù)幀,發(fā)送一個(gè)消息,每個(gè)消息就是數(shù)據(jù)幀中的8字節(jié)數(shù)據(jù)。每個(gè)消息的字節(jié)數(shù)是在創(chuàng)建消息隊(duì)列時(shí)確定的,且為定長(zhǎng)。3)在等待消息的線(xiàn)程(thread_message_recv)中,有等待消息的語(yǔ)句,若消息隊(duì)列中沒(méi)有消息,該線(xiàn)程進(jìn)入阻塞隊(duì)列,一旦有消息隊(duì)列中有消息,運(yùn)行隨后的程序,通過(guò)串口打印出消息,以及消息隊(duì)列中剩余消息的個(gè)數(shù)。第95頁(yè)共45頁(yè)RTOS4.3.3消息隊(duì)列的編程實(shí)例2.準(zhǔn)備階段1)聲明消息隊(duì)列全局變量。在使用消息隊(duì)列之前,首先在07_AppPrg文件夾下的工程總頭文件(includes.h文件)中聲明一個(gè)全局消息變量g_mq。2)創(chuàng)建消息隊(duì)列實(shí)例。在threadauto_appinit.c文件的app_init函數(shù)中創(chuàng)建消息隊(duì)列實(shí)例,實(shí)參為:消息變量名字為g_mq,每個(gè)消息8個(gè)字節(jié),最大消息個(gè)數(shù)4個(gè)。第96頁(yè)共45頁(yè)RTOS3.應(yīng)用階段:1)等待消息。即通過(guò)mq_recv函數(shù)獲取消息隊(duì)列中存放的消息。例如在本節(jié)樣例程序中,thread_messagerecv.c文件中,在mq_recv函數(shù)處等待消息隊(duì)列中有消息時(shí)才會(huì)繼續(xù)往下運(yùn)行。2)發(fā)送消息(將消息放入消息隊(duì)列)。通過(guò)mq_send函數(shù)將消息放入消息隊(duì)列中,若消息隊(duì)列中存放的消息數(shù)已滿(mǎn),則會(huì)直接舍棄該條消息。例:mq_send(g_mq,recv_data,sizeof(recv_data));4.樣例程序源碼代碼詳見(jiàn):..\03-Software\CH04-Syn-Comm\MessageQueue,轉(zhuǎn)入實(shí)例分析。第97頁(yè)共45頁(yè)RTOS運(yùn)行結(jié)果1)當(dāng)發(fā)送一幀消息時(shí),串口輸出消息的內(nèi)容第98頁(yè)共45頁(yè)RTOS運(yùn)行結(jié)果2)當(dāng)發(fā)送多于5個(gè)消息時(shí),溢出的部分會(huì)被舍棄第99頁(yè)共47頁(yè)RTOS4.4.1信號(hào)量的含義與應(yīng)用場(chǎng)合4.4信號(hào)量
信號(hào)量(Semaphore):信號(hào)量的概念最初是由荷蘭計(jì)算機(jī)科學(xué)家艾茲格·迪杰斯特拉(EdsgerW.Dijkstra)提出的,廣泛應(yīng)用于不同的操作系統(tǒng)中。維基百科()對(duì)信號(hào)量的定義如下:信號(hào)量是一個(gè)提供信號(hào)的非負(fù)整型變量,以確保在并行計(jì)算環(huán)境中,不同線(xiàn)程在訪問(wèn)共享資源時(shí),不會(huì)發(fā)生沖突。第100頁(yè)共45頁(yè)RTOS
可以把信號(hào)量看做實(shí)際生活中的停車(chē)位,定義的信號(hào)量個(gè)數(shù)就是停車(chē)位的個(gè)數(shù),車(chē)子(線(xiàn)程)想要進(jìn)行停車(chē)操作必須要申請(qǐng)(wait)到可用的停車(chē)位,停車(chē)位滿(mǎn)了就只能等待(對(duì)應(yīng)線(xiàn)程阻塞),而一旦有車(chē)輛離開(kāi)(release),停車(chē)位就會(huì)加一。
正是信號(hào)量這種有序的特性,使得信號(hào)量在計(jì)算機(jī)中有著較多的應(yīng)用場(chǎng)合,如實(shí)現(xiàn)線(xiàn)程之間的有序操作;實(shí)現(xiàn)線(xiàn)程之間的互斥執(zhí)行,使信號(hào)量個(gè)數(shù)為1,對(duì)臨界區(qū)加鎖,保證同一時(shí)刻只有一個(gè)線(xiàn)程在訪問(wèn)臨界區(qū);為了實(shí)現(xiàn)更好的性能而控制線(xiàn)程的并發(fā)數(shù)等等。第101頁(yè)共45頁(yè)RTOS4.4.2信號(hào)量的常用函數(shù)1.創(chuàng)建信號(hào)量變量函數(shù)(sem_create)第102頁(yè)共45頁(yè)RTOS2.等待獲取信號(hào)量函數(shù)第103頁(yè)共45頁(yè)RTOS3.釋放信號(hào)量函數(shù)(sem_release)第104頁(yè)共45頁(yè)RTOS4.4.3信號(hào)量的編程舉例:通過(guò)信號(hào)量來(lái)實(shí)現(xiàn)車(chē)輛的有序進(jìn)場(chǎng)停車(chē)1.信號(hào)量樣例程序的功能事件編程實(shí)例見(jiàn)“..\03-Software\CH04-Syn-Comm\Semaphore”文件夾。該工程給出了利用事件進(jìn)行中斷與線(xiàn)程同步的實(shí)例,其功能為:1)該工程以三輛車(chē)進(jìn)只有兩個(gè)停車(chē)位的停車(chē)場(chǎng)為例,空車(chē)位對(duì)應(yīng)于信號(hào)量,只有信號(hào)量>0,車(chē)輛才能進(jìn)場(chǎng),車(chē)輛空位>0,車(chē)輛可以進(jìn)場(chǎng)停車(chē),車(chē)輛空位減1;2)車(chē)輛出來(lái)時(shí),車(chē)輛空位加1,對(duì)應(yīng)于信號(hào)量的獲取與釋放。
3)模擬程序設(shè)計(jì)的功能是車(chē)子1進(jìn)場(chǎng)停車(chē)20秒,車(chē)子2進(jìn)場(chǎng)停車(chē)10秒,車(chē)子3進(jìn)場(chǎng)停車(chē)5秒,可以看到需要等待進(jìn)場(chǎng)的情況。第105頁(yè)共45頁(yè)RTOS4.4.3信號(hào)量的編程舉例2.準(zhǔn)備階段1)聲明信號(hào)量全局變量。在使用信號(hào)量之前,首先在07_AppPrg文件夾下的工程總頭文件(includes.h文件)中聲明一個(gè)信號(hào)量全局變量g_sp。2)創(chuàng)建信號(hào)量實(shí)例。在threadauto_appinit.c的app_init函數(shù)中創(chuàng)建信號(hào)量第106頁(yè)共45頁(yè)RTOS3.應(yīng)用階段1)等待信號(hào)量。在線(xiàn)程訪問(wèn)資源前,通過(guò)sem_take函數(shù)等待信號(hào)量;若無(wú)可用信號(hào)量時(shí),則線(xiàn)程進(jìn)入信號(hào)量阻塞列表,等待可用信號(hào)量。例:sem_take(g_sp,WAITING_FOREVER);//等待信號(hào)量2)釋放信號(hào)量。在線(xiàn)程使用完資源后,通過(guò)sem_release函數(shù)釋放信號(hào)量。例:sem_release(g_sp);//釋放信號(hào)4.樣例程序源碼(參見(jiàn)..\03-Software\CH04-Syn-Comm\Semaphore..),轉(zhuǎn)入實(shí)例分析。第107頁(yè)共45頁(yè)RTOS程序執(zhí)行分析流程(重點(diǎn)):每當(dāng)有車(chē)輛進(jìn)入停車(chē)場(chǎng)直到車(chē)輛離開(kāi),會(huì)輸出車(chē)輛對(duì)空閑車(chē)位(信號(hào)量)的使用過(guò)程以及線(xiàn)程的狀態(tài)。車(chē)輛到達(dá)停車(chē)場(chǎng)先請(qǐng)求空閑停車(chē)位(信號(hào)量),如果當(dāng)前空閑車(chē)位(信號(hào)量)個(gè)數(shù)為0,即無(wú)空閑車(chē)位(信號(hào)量),則會(huì)輸出當(dāng)前車(chē)輛等待空閑車(chē)位(信號(hào)量)的提示;當(dāng)車(chē)輛申請(qǐng)到空閑車(chē)位(信號(hào)量),則輸出剩余空閑車(chē)位(信號(hào)量)的個(gè)數(shù);車(chē)輛離開(kāi)停車(chē)場(chǎng)釋放空閑車(chē)位(信號(hào)量),并輸出提示以釋放車(chē)位(信號(hào)量)。在車(chē)輛獲取空閑車(chē)位(信號(hào)量)時(shí)和車(chē)輛駛離停車(chē)場(chǎng)釋放空閑車(chē)位(信號(hào)量)時(shí),增加了當(dāng)前空閑車(chē)位(信號(hào)量)數(shù)量的判斷,有空閑車(chē)位綠燈亮表示允許停車(chē),無(wú)空閑車(chē)位紅燈亮表示禁止停車(chē)。第108頁(yè)共45頁(yè)RTOS運(yùn)行結(jié)果第109頁(yè)共45頁(yè)RTOS4.5.1互斥量的含義和應(yīng)用場(chǎng)合4.5互斥量
互斥量(Mutex,也稱(chēng)為互斥鎖):是一種用于保護(hù)操作系統(tǒng)中的臨界區(qū)(或是共享資源)基本的同步工具之一。它能夠保證任何時(shí)刻只有一個(gè)線(xiàn)程能夠操作臨界區(qū),從而實(shí)現(xiàn)線(xiàn)程間同步?;コ饬康牟僮髦挥屑渔i和解鎖兩種,每個(gè)線(xiàn)程都可以對(duì)一個(gè)互斥量進(jìn)行加鎖和解鎖操作,必須按照先加鎖再解鎖的順序進(jìn)行操作。一旦某個(gè)線(xiàn)程對(duì)互斥量上鎖,在它對(duì)互斥量進(jìn)行解鎖操作之前,任何線(xiàn)程都無(wú)法再對(duì)該互斥量進(jìn)行上鎖,是一個(gè)獨(dú)占資源的行為。第110頁(yè)共45頁(yè)RTOS在一個(gè)計(jì)算機(jī)系統(tǒng)中,有很多受限的資源,如串行通信接口、讀卡器和打印機(jī)等硬件資源以及公用全局變量、隊(duì)列和數(shù)據(jù)等軟件資源。以使用串口通信為例,下面是兩個(gè)線(xiàn)程間不使用互斥和使用互斥的情況。在不使用互斥的情況下,由于操作系統(tǒng)時(shí)間片輪轉(zhuǎn)機(jī)制,線(xiàn)程A和線(xiàn)程B交替執(zhí)行,會(huì)導(dǎo)致發(fā)送的內(nèi)容混亂,無(wú)法得到正確的結(jié)果。第111頁(yè)共47頁(yè)RTOS4.5.2互斥量的常用函數(shù)1.創(chuàng)建互斥量變量函數(shù)(mutex_create)第112頁(yè)共45頁(yè)RTOS2.獲取互斥量函數(shù)(mutex_take)
第113頁(yè)共45頁(yè)RTOS3.互斥量釋放函數(shù)(mutex_release)第114頁(yè)共45頁(yè)RTOS4.5.3互斥量的編程舉例:實(shí)現(xiàn)對(duì)互斥資源的獨(dú)占訪問(wèn)1.互斥量樣例程序的功能事件編程實(shí)例見(jiàn)“..\03-Software\CH04-Syn-Comm\Mutex-3LED”。該工程給出了通過(guò)互斥量來(lái)實(shí)現(xiàn)線(xiàn)程對(duì)資源的獨(dú)占訪問(wèn)的實(shí)例,其功能為:樣例工程實(shí)現(xiàn)紅燈線(xiàn)程每5s閃爍一次、綠燈線(xiàn)程每10s閃爍一次和綠燈線(xiàn)程每20s閃爍一次。在2.3節(jié)的樣例工程中紅燈線(xiàn)程、藍(lán)燈線(xiàn)程和綠燈線(xiàn)程有時(shí)會(huì)同時(shí)亮的情況(出現(xiàn)混合顏色),而本工程通過(guò)單色燈互斥量使得每一時(shí)刻只有一個(gè)燈亮,不出現(xiàn)混合顏色情況。第115頁(yè)共45頁(yè)RTOS4.5.3互斥量的編程舉例2.準(zhǔn)備階段
1)聲明互斥量全局變量。在includes.h中定義互斥量。G_VAR_PREFIXmutex_tmutex;2)創(chuàng)建互斥量實(shí)例。在app_init函數(shù)中初始化互斥量。g_mutex=mutex_create("g_mutex",IPC_FLAG_PRIO);//初始化互斥量變量第116頁(yè)共45頁(yè)RTOS3.應(yīng)用階段1)鎖定互斥量。在線(xiàn)程訪問(wèn)獨(dú)占資源前,通過(guò)mutex_take函數(shù)鎖定互斥量,以獲取其使用權(quán);若此時(shí)獨(dú)占資源已被其他線(xiàn)程鎖定,則線(xiàn)程進(jìn)入該互斥量的等待列表,等待鎖定此資源的線(xiàn)程解鎖該互斥量。2)解鎖互斥量。在線(xiàn)程使用完獨(dú)占資源后,通過(guò)mutex_release()函數(shù)解鎖互斥量,釋放對(duì)獨(dú)占資源的使用權(quán),以便其他線(xiàn)程能夠使用獨(dú)占資源。例:mutex_release(mutex);4.樣例程序源碼(參見(jiàn)“..\03-Software\CH04-Syn-Comm\Mutex-3LED”),轉(zhuǎn)入實(shí)例分析。第117頁(yè)共45頁(yè)RTOS程序流程執(zhí)行分析(重點(diǎn)):
紅燈線(xiàn)程調(diào)用mutex_take函數(shù)申請(qǐng)鎖定單色燈互斥量成功,互斥鎖為1,紅燈線(xiàn)程切換亮暗。任何此時(shí)訪問(wèn)紅燈線(xiàn)程的請(qǐng)求都將被拒絕。當(dāng)紅燈線(xiàn)程鎖定單色燈互斥量時(shí),藍(lán)燈線(xiàn)程和綠燈線(xiàn)程申請(qǐng)鎖定單色燈互斥量均失敗,會(huì)被放到互斥量阻塞列表中,直到紅燈線(xiàn)程解鎖單色燈互斥量之后,才會(huì)從互斥量阻塞列表中移出,獲得單色燈互斥量,然后進(jìn)行燈的亮暗切換。由于單色燈互斥量是由紅燈線(xiàn)程鎖定的,因此紅燈線(xiàn)程能成功解鎖它。5s后,紅燈線(xiàn)程解鎖單色燈互斥量,解鎖后互斥鎖為0,并進(jìn)入等待狀態(tài)。此時(shí)單色燈互斥量會(huì)從互斥量列表移出,并轉(zhuǎn)移給正在等待單色燈互斥量的綠燈線(xiàn)程。第118頁(yè)共45頁(yè)RTOS
綠燈線(xiàn)程變?yōu)閱紊珶艋コ饬克姓撸捅硎揪G燈線(xiàn)程成功鎖定單色燈互斥量,互斥鎖變?yōu)?,同時(shí)切換綠燈亮暗。10s后,綠燈線(xiàn)程解鎖單色燈互斥量,互斥鎖再次變?yōu)?,此時(shí)仍處于等待狀態(tài)的藍(lán)燈線(xiàn)程成為單色燈互斥量所有者。20s后,藍(lán)燈
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中醫(yī)泥灸與溫?zé)岑煼ǖ慕Y(jié)合效果
- 2024年貨物運(yùn)輸協(xié)議條款詳解與保險(xiǎn)責(zé)任規(guī)定版B版
- 2024年酒店宴會(huì)廳企業(yè)訂餐服務(wù)協(xié)議范本大全3篇
- 2024年贛州影視制作合作合同
- 2024年綠色養(yǎng)殖場(chǎng)區(qū)租賃與環(huán)保服務(wù)合同3篇
- 2024年財(cái)產(chǎn)分割合同模板
- 2024年礦山環(huán)境保護(hù)合同
- 2024年社區(qū)足球場(chǎng)地租賃協(xié)議3篇
- 2024年藝術(shù)文化貸款協(xié)議3篇
- 2024年融資擔(dān)保借款三方協(xié)議范本版B版
- 軟件度量與度量指標(biāo)的應(yīng)用
- 貴州省黔東南州2023-2024學(xué)年九年級(jí)上學(xué)期期末道德與法治試題
- 濕疹健康宣教課件
- 《婦產(chǎn)科學(xué):宮頸癌》課件
- 河北省承德市承德縣2023-2024學(xué)年七年級(jí)上學(xué)期期末生物試卷+
- 精神病健康教育知識(shí)宣傳
- 2024年《雙眼視覺(jué)學(xué)、驗(yàn)光學(xué)、配鏡學(xué)》等綜合知識(shí)試題與答案
- 2023年北京海淀七年級(jí)上學(xué)期期末英語(yǔ)試卷(含答案)
- 急救、生命支持類(lèi)醫(yī)學(xué)裝備調(diào)配制度與流程
- 河南省駐馬店市重點(diǎn)中學(xué)2023-2024學(xué)年九年級(jí)上學(xué)期12月月考語(yǔ)文試題(無(wú)答案)
- 江蘇省無(wú)錫市2022-2023學(xué)年上學(xué)期初中學(xué)業(yè)水平調(diào)研測(cè)試九年級(jí)英語(yǔ)期末試題
評(píng)論
0/150
提交評(píng)論