




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C/OS-II程序設(shè)計(jì)基礎(chǔ)September,C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)緒論緒論 本章重點(diǎn)介紹C/OS-II V2.52版本嵌入式實(shí)時(shí)操作系統(tǒng)常用函數(shù)的基本用法,其最大的特點(diǎn)不僅示例程序簡(jiǎn)潔明了,而且電路也非常簡(jiǎn)單(如下圖),希望初學(xué)者一看就懂、一學(xué)就會(huì),達(dá)到快速入門(mén)的目的。注意:所有應(yīng)用示例都全部默認(rèn)采用這個(gè)圖,主要是為了盡量簡(jiǎn)化示例程序,提高可讀性,使用簡(jiǎn)單明了的語(yǔ)言和方法來(lái)解析復(fù)雜的理論知識(shí),硬件去抖目 錄任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述時(shí)間管理時(shí)間管理事件的一般使用規(guī)則事件的一般使用規(guī)則系統(tǒng)管理系統(tǒng)管理1互斥信號(hào)量互斥信號(hào)量信號(hào)量信號(hào)
2、量事件標(biāo)志組事件標(biāo)志組消息郵箱消息郵箱動(dòng)態(tài)內(nèi)存管理動(dòng)態(tài)內(nèi)存管理消息隊(duì)列消息隊(duì)列23465789101211C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)任務(wù)的任務(wù)的分類任務(wù)的優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)任務(wù)的劃分任務(wù)的劃分123任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì) 在基于實(shí)時(shí)操作系統(tǒng)的應(yīng)用程序設(shè)計(jì)中,任務(wù)設(shè)計(jì)是整個(gè)應(yīng)用程序的基礎(chǔ),其它軟件設(shè)計(jì)工作都是圍繞任務(wù)設(shè)計(jì)來(lái)展開(kāi)。任務(wù)設(shè)計(jì)應(yīng)用程序設(shè)計(jì)“任務(wù)函數(shù)”和相關(guān)的數(shù)據(jù)結(jié)構(gòu)其他軟件工作任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)的分類任務(wù)的分類按照?qǐng)?zhí)行方式分類任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序
3、設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)的分類任務(wù)的分類1.單次執(zhí)行類任務(wù)void MyTask (void *pdata) 進(jìn)行準(zhǔn)備工作的代碼; 任務(wù)實(shí)體代碼; 調(diào)用任務(wù)刪除函數(shù);運(yùn)行運(yùn)行創(chuàng)建刪除刪除單次執(zhí)行類任務(wù)定義和初始化變量及硬件設(shè)備 完成該任務(wù)的具體功能 將自己刪除,操作系統(tǒng)將不再管理它 任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)的分類任務(wù)的分類執(zhí)行狀態(tài)等待狀態(tài)就緒狀態(tài)void MyTask (void *pdata) 進(jìn)行準(zhǔn)備工作的代碼; while (1) 任務(wù)實(shí)體代碼; 調(diào)用系統(tǒng)延時(shí)函數(shù); 延時(shí)時(shí)間到延時(shí)時(shí)間到2.周期執(zhí)行類任務(wù)任務(wù)優(yōu)先級(jí)足夠高任務(wù)優(yōu)先級(jí)足夠高任務(wù)設(shè)計(jì)任務(wù)設(shè)
4、計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)的分類任務(wù)的分類3.事件觸發(fā)執(zhí)行類任務(wù)void MyTask (void *pdata) 進(jìn)行準(zhǔn)備工作的代碼; while (1) 調(diào)用獲取事件的函數(shù); 任務(wù)實(shí)體代碼; 等待信號(hào)量或消息運(yùn)行狀態(tài)運(yùn)行狀態(tài)等待狀態(tài)等待狀態(tài)運(yùn)行狀態(tài)運(yùn)行狀態(tài)就緒狀態(tài)就緒狀態(tài) 任務(wù)優(yōu)先級(jí)足夠高消息完成具體功能任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)的劃分任務(wù)的劃分1.任務(wù)劃分的目標(biāo) 在對(duì)一個(gè)具體的嵌入式應(yīng)用系統(tǒng)進(jìn)行任務(wù)劃分時(shí),可以有不同的任務(wù)劃分方案。為了選擇最佳劃分方案,就必須知道任務(wù)劃分的目標(biāo)。高效率的系統(tǒng)高效率的系統(tǒng)1.首要目標(biāo)是滿足首要目標(biāo)是
5、滿足“實(shí)時(shí)性實(shí)時(shí)性”指標(biāo)指標(biāo):即使在最壞的情況下,系統(tǒng)中所有對(duì)實(shí)時(shí)性有要求的功能都能夠正常實(shí)現(xiàn);3.簡(jiǎn)化軟件系統(tǒng):簡(jiǎn)化軟件系統(tǒng):一個(gè)任務(wù)要實(shí)現(xiàn)其功能,除了需要操作系統(tǒng)的調(diào)度功能支持外,還需要操作系統(tǒng)的其它服務(wù)功能支持,合理劃分任務(wù),可以減少對(duì)操作系統(tǒng)的服務(wù)要求,簡(jiǎn)化軟件系統(tǒng);4.降低資源需求:降低資源需求:合理劃分任務(wù),減少或簡(jiǎn)化任務(wù)之間的同步和通信需求,就可以減少相應(yīng)數(shù)據(jù)結(jié)構(gòu)的內(nèi)存規(guī)模,從而降低對(duì)系統(tǒng)資源的需求。2.任務(wù)數(shù)目合理:任務(wù)數(shù)目合理:對(duì)于同一個(gè)應(yīng)用系統(tǒng),合理的合并一些任務(wù),使任務(wù)數(shù)目適當(dāng)少一些還是比較有利;任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)的劃分任務(wù)的劃
6、分2.任務(wù)劃分的方法 任務(wù)的劃分方法,傳遞性:傳遞性:信息傳遞的上游任務(wù)的優(yōu)先級(jí)高于下游任務(wù)的優(yōu)先級(jí)。如信號(hào)采集任務(wù)的優(yōu)先級(jí)高于數(shù)據(jù)處理任務(wù)的優(yōu)先級(jí)。緊迫性:緊迫性:因?yàn)榫o迫任務(wù)對(duì)響應(yīng)時(shí)間有嚴(yán)格要求,在所有緊迫任務(wù)中,按響應(yīng)時(shí)間要求排序,越緊迫的任務(wù)安排的優(yōu)先級(jí)越高。緊迫任務(wù)通常與ISR關(guān)聯(lián);關(guān)鍵性:關(guān)鍵性:任務(wù)越關(guān)鍵安排的優(yōu)先級(jí)越高,以保障其執(zhí)行機(jī)會(huì);中斷關(guān)聯(lián)性中斷關(guān)聯(lián)性:與中斷服務(wù)程序(ISR)有關(guān)聯(lián)的任務(wù)應(yīng)該安排盡可能高的優(yōu)先級(jí),以便及時(shí)處理異步事件,提高系統(tǒng)的實(shí)時(shí)性。如果優(yōu)先級(jí)安排得比較低,CPU有可能被優(yōu)先級(jí)比較高的任務(wù)長(zhǎng)期占用,以致于在第二次中斷發(fā)生時(shí)連第一次中斷還沒(méi)有處理,產(chǎn)生信
7、號(hào)丟失現(xiàn)象;頻繁性:頻繁性:對(duì)于周期性任務(wù),執(zhí)行越頻繁,則周期越短,允許耽誤的時(shí)間也越短,故應(yīng)該安排的優(yōu)先級(jí)也越高,以保障及時(shí)得到執(zhí)行;快捷性:快捷性:在前面各項(xiàng)條件相近時(shí),越快捷(耗時(shí)短)的任務(wù)安排的優(yōu)先級(jí)越高,以使其它就緒任務(wù)的延時(shí)縮短;任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)的優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí) 任務(wù)的優(yōu)先級(jí)安排原則如下: 緊迫性緊迫性任務(wù)優(yōu)先級(jí) 關(guān)鍵性關(guān)鍵性中斷關(guān)聯(lián)性中斷關(guān)聯(lián)性快捷性快捷性頻繁性頻繁性傳遞性傳遞性C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述基本原則基本原則系統(tǒng)函數(shù)的分類系統(tǒng)函數(shù)的分類12系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述| C/OS-II程
8、序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)基本原則基本原則1.配對(duì)性原則 對(duì)于C/OS-II來(lái)說(shuō),大多數(shù)API都是成對(duì)的,而且一部分必須配對(duì)使用。當(dāng)然,查詢狀態(tài)的系統(tǒng)函數(shù)一般不需要配對(duì)使用,而且部分API如延時(shí),也不需要配對(duì)使用。配對(duì)的函數(shù)見(jiàn)下表。函數(shù)1功能函數(shù)2功能備注OSFlagPend()等待事件標(biāo)志組的事件標(biāo)志位OSFlagPost()置位或清0事件標(biāo)志組中的標(biāo)志不必須配對(duì)使用,一般不在同一個(gè)任務(wù)中(用于資源同步時(shí)必須同一個(gè)任務(wù)中配對(duì)使用)OSMboxPend()等待消息郵箱中的消息OSMboxPost()或OSMboxPostOpt()以不同的方式向消息郵箱發(fā)送消息OSQPend()等待消息隊(duì)列中的消息
9、OSQPost()或OSQPostFront()或OSQPostOpt()以不同的方式向消息隊(duì)列發(fā)送一條消息OSSemPend()等待一個(gè)信號(hào)量OSSemPost()發(fā)送一個(gè)信號(hào)量OSMutexPend()等待一個(gè)互斥信號(hào)量OSMutexPost()釋放一個(gè)互斥信號(hào)量必須在同一個(gè)任務(wù)中配對(duì)使用函數(shù)1功能函數(shù)2功能備注OSTimeGet()獲得系統(tǒng)時(shí)間OSTimeSet()設(shè)置系統(tǒng)時(shí)間不必配對(duì)使用OSIntEnter()進(jìn)入中斷處理OSIntExit()退出中斷處理必須在中斷服務(wù)程序中配對(duì)使用OSSchedLock()給調(diào)度器上鎖OSSchedUnlock()給調(diào)度調(diào)度必須在一個(gè)任務(wù)中配對(duì)使用O
10、S_ENTER_CRITICAL()進(jìn)入臨界區(qū)OS_EXIT_CRITICAL()退出臨界區(qū)必須在一個(gè)任務(wù)或中斷中配對(duì)使用函數(shù)1功能函數(shù)2功能備注OSMemGet()分配一個(gè)內(nèi)存塊OSMemPut()釋放一個(gè)內(nèi)存塊必須配對(duì)使用OSTaskCreate()或OSTaskCreateExt()建立任務(wù)OSTaskDel()刪除任務(wù)動(dòng)態(tài)使用任務(wù)時(shí)必須配對(duì)使用OSTaskSuspend()掛起任務(wù)OSTaskResume()恢復(fù)任務(wù)必須配對(duì)使用OSTimeDly()或OSTimeDlyHMSM()延時(shí)OSTimeDlyResume()恢復(fù)延時(shí)的任務(wù)不必配對(duì)使用。OSTimeDlyHMSM()可能需要多
11、個(gè)OSTimeDlyResume()才能恢復(fù)函數(shù)1功能函數(shù)2功能備注OSFlagCreate()建立事件標(biāo)志組OSFlagDel()刪除事件標(biāo)志組動(dòng)態(tài)使用事件時(shí)必須配對(duì)使用OSMboxCreate()建立消息郵箱OSMboxDel()刪除消息郵箱OSMutexCreate() 建立互斥信號(hào)量OSMutexDel()刪除互斥信號(hào)量OSQCreate()建立消息隊(duì)列OSQDel()刪除消息隊(duì)列OSSemCreate()建立信號(hào)量OSSemDel()刪除信號(hào)量系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)基本原則基本原則2.中斷服務(wù)程序調(diào)用函數(shù)的限制 中斷服務(wù)程序不能調(diào)用可能會(huì)導(dǎo)
12、致任務(wù)調(diào)度的函數(shù),它們主要是一些等待事件的函數(shù),這些函數(shù)及其替代函數(shù)見(jiàn)下表。注意:未列入表中的函數(shù)OSTaskCreate()、OSTaskCreateExt()、OSTaskDel()、OSTaskResume()、OSTaskChangePrio()、OSTaskSuspend()、OSTimeDly()、OSTimeDlyHMSM() 、OSTimeResume()都屬于在中斷服務(wù)程序中禁止調(diào)用的函數(shù)。禁止使用的函數(shù)替代函數(shù)功能備注OSFlagPend()OSFlagAccept()無(wú)等待獲得事件標(biāo)志組的事件標(biāo)志位需要程序自己判斷是否獲得了相應(yīng)的事件OSMboxPend()OSMboxA
13、ccept()無(wú)等待獲得消息郵箱中的消息OSMutexPend()OSMutexAccept()無(wú)等待獲得一個(gè)互斥信號(hào)量OSQPend()OSQAccept()無(wú)等待獲得息隊(duì)列中的消息OSSemPend()OSSemAccept()無(wú)等待獲得一個(gè)信號(hào)量系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)基本原則基本原則1.創(chuàng)建事件和刪除事件的函數(shù)。 一些函數(shù)雖然沒(méi)有明確地規(guī)定不能被中斷服務(wù)程序調(diào)用,但因?yàn)橹袛喾?wù)程序的特性,一般不會(huì)使用。 2.與任務(wù)相關(guān)的函數(shù)OSTaskChangePrio() 、 OSTaskDelReq() 、OSTaskStkChk() 和OSTaskQu
14、ery() 。至于函數(shù)OSSchedLock()和OSSchedUnlock(),在中斷服務(wù)程序中使用沒(méi)有任何意義。系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)基本原則基本原則3.任務(wù)必須調(diào)用某個(gè)系統(tǒng)函數(shù) 因?yàn)镃/OS-II是完全基于優(yōu)先級(jí)的操作系統(tǒng),所以在一定的條件下必須出讓CPU占有權(quán)以便比自己優(yōu)先級(jí)更低的任務(wù)能夠運(yùn)行,這是通過(guò)調(diào)用部分系統(tǒng)函數(shù)來(lái)實(shí)現(xiàn)的,這些函數(shù)見(jiàn)下表。一般的任務(wù)必須調(diào)用表中至少一個(gè)函數(shù),只有一種情況例外,就是單次執(zhí)行的任務(wù),因?yàn)槿蝿?wù)刪除后肯定出讓CPU,所以可以不調(diào)用表中的函數(shù)。函數(shù)名功能函數(shù)名功能OSFlagPend等待事件標(biāo)志組的事件標(biāo)志位OSM
15、utexPend等待一個(gè)互斥信號(hào)量OSQPend等待消息隊(duì)列中的消息OSQPend等待消息隊(duì)列中的消息OSSemPend等待一個(gè)信號(hào)量OSTaskSuspend 掛起任務(wù)OSTimeDly延時(shí)OSTimeDlyHMSM延時(shí)一般的操作系統(tǒng)都提供時(shí)間管理的函數(shù),最基本的就是延時(shí)函數(shù),C/OS-II也不例外,C/OS-II所具有的時(shí)間管理函數(shù)見(jiàn)下表。C/OS-II具有簡(jiǎn)單的動(dòng)態(tài)內(nèi)存管理能力。C/OS-II的動(dòng)態(tài)內(nèi)存管理函數(shù)見(jiàn)下表。任務(wù)管理函數(shù)是操作與任務(wù)相關(guān)功能的函數(shù),詳見(jiàn)下表。系統(tǒng)管理函數(shù)是一些與C/OS-II內(nèi)核或功能相關(guān)的一些函數(shù),詳見(jiàn)下表。C/OS-II的初始化函數(shù)有2個(gè):OSInit()和
16、OSStart(),它們不能在任何任務(wù)和中斷服務(wù)程序中使用,僅在main()函數(shù)中按照一定的規(guī)范被調(diào)用,其中OSInit()函數(shù)初始化C/OS-II內(nèi)部變量,OSStart()函數(shù)啟動(dòng)多任務(wù)環(huán)境。 C/OS-II把信號(hào)量等都稱為事件,管理它們的就是事件管理函數(shù)。C/OS-II V2.52具有的事件有普通信號(hào)量、互斥信號(hào)量、事件標(biāo)志組、消息郵箱和消息隊(duì)列,這些都是C/OS-II用于同步與通訊的工具,本章后述的內(nèi)容將會(huì)詳細(xì)介紹。系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)系統(tǒng)函數(shù)的分類系統(tǒng)函數(shù)的分類初始化初始化任務(wù)管理任務(wù)管理時(shí)間管理時(shí)間管理內(nèi)存管理內(nèi)存管理根據(jù)功能分類事件管
17、理事件管理函數(shù)名功能備注OSStatInit()使能任務(wù)統(tǒng)計(jì)功能復(fù)位一次只能調(diào)用一次,并且必須在任務(wù)中調(diào)用,在調(diào)用時(shí)其它用戶任務(wù)不能處于就緒狀態(tài)OSIntEnter()進(jìn)入中斷處理必須由中斷服務(wù)程序按照規(guī)范調(diào)用,使用本公司的模版就不需要調(diào)用它們OSIntExit()退出中斷處理OSSchedLock()鎖調(diào)度器必須配對(duì)使用,一般情況不需要使用。事實(shí)上,C/OS-II不推薦使用它們OSSchedUnlock()解鎖調(diào)度器OS_ENTER_CRITICAL()進(jìn)入臨界區(qū)必須配對(duì)使用,一般通過(guò)禁止中斷和允許中斷來(lái)實(shí)現(xiàn)的。對(duì)于一些移植代碼來(lái)說(shuō),不能嵌套調(diào)用OS_EXIT_CRITICAL()退出臨界區(qū)
18、函數(shù)名功能函數(shù)名功能OSTaskChangePrio()改變?nèi)蝿?wù)優(yōu)先級(jí)OSTaskSuspend()掛起任務(wù)OSTaskCreate()建立任務(wù)OSTaskResume()恢復(fù)任務(wù)OSTaskCreateExt()建立任務(wù),比OSTaskCreate()控制任務(wù)屬性更多OSTaskStkChk()檢查堆棧OSTaskDel()刪除任務(wù)OSTaskQuery()獲得任務(wù)信息OSTaskDelReq()請(qǐng)求刪除任務(wù),有特殊用途系統(tǒng)管理系統(tǒng)管理函數(shù)名功能備注OSTimeDly()以時(shí)鐘節(jié)拍為單位延時(shí)OSTimeDlyHMSM()以鐘時(shí)分秒毫秒為單位延時(shí)OSTimeDlyResume()恢復(fù)延時(shí)的任務(wù)
19、OSTimeDlyHMSM()可能需要多次才能恢復(fù)OSTimeGet()獲得系統(tǒng)時(shí)間以時(shí)鐘節(jié)拍為單位OSTimeSet()設(shè)置系統(tǒng)時(shí)間以時(shí)鐘節(jié)拍為單位OSTimeTick()時(shí)鐘節(jié)拍處理函數(shù)由時(shí)鐘節(jié)拍中斷處理程序調(diào)用,用戶很少使用函數(shù)名功能OSMemCreate()初始化一個(gè)堆OSMemGet()從指定堆中獲得一個(gè)內(nèi)存塊OSMemPut()從指定堆中釋放一個(gè)內(nèi)存塊OSMemQuery()查詢指定堆的狀態(tài)C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)使用場(chǎng)合時(shí)間管理時(shí)間管理行為同步行為同步資源同步資源同步123系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)使用場(chǎng)合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)
20、基礎(chǔ)時(shí)間管理時(shí)間管理1.控制任務(wù)的執(zhí)行周期 void MyTask (void *pdata) 進(jìn)行準(zhǔn)備工作的代碼; while (1) 任務(wù)實(shí)體代碼; 調(diào)用系統(tǒng)延時(shí)函數(shù); 調(diào)用OSTimeDly( )或OSTimeDlyHMSM( ) 無(wú)限循壞注意:延時(shí)函數(shù)OSTimeDly()是以系統(tǒng)節(jié)拍數(shù)為參數(shù),而延時(shí)函數(shù)OSTimeDlyHMSM()是以實(shí)際時(shí)間值為參數(shù),但在執(zhí)行過(guò)程中仍然轉(zhuǎn)換為系統(tǒng)節(jié)拍數(shù)。如果實(shí)際時(shí)間不是系統(tǒng)節(jié)拍的整數(shù)倍,將進(jìn)行四舍五入處理。設(shè)系統(tǒng)節(jié)拍為50毫秒,調(diào)用OSTimeDly(20)的效果是延時(shí)1秒鐘,調(diào)用OSTimeDlyHMSM(0,1,27,620)的實(shí)際時(shí)間是延時(shí)1
21、分27秒600毫秒。 在任務(wù)函數(shù)的代碼中可以通過(guò)插入延時(shí)函數(shù)來(lái)控制任務(wù)周期性運(yùn)行,定時(shí)閑置CPU一段時(shí)間,供其它任務(wù)使用。 系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)使用場(chǎng)合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)時(shí)間管理時(shí)間管理2.控制任務(wù)的運(yùn)行節(jié)奏 在任務(wù)函數(shù)的代碼中也可以通過(guò)插入延時(shí)函數(shù)來(lái)控制任務(wù)的運(yùn)行節(jié)奏。 void MyTask (void *pdata) 進(jìn)行準(zhǔn)備工作的代碼; while(1) 調(diào)用獲取事件的函數(shù); 第一部分操作代碼; 調(diào)用系統(tǒng)延時(shí)函數(shù); 第二部分操作代碼; 調(diào)用系統(tǒng)延時(shí)函數(shù); 第三部分操作代碼; 各種時(shí)間順序控制任務(wù)可以用這種結(jié)構(gòu)的任務(wù)函數(shù)實(shí)現(xiàn)。調(diào)用OSTimeDly( )或OS
22、TimeDlyHMSM( ) 調(diào)用OSTimeDly( )或OSTimeDlyHMSM( ) 等待信號(hào)量、消息其他任務(wù)代碼無(wú)限循環(huán)系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)使用場(chǎng)合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)時(shí)間管理時(shí)間管理3.狀態(tài)查詢 查詢過(guò)程是一個(gè)無(wú)限循環(huán)過(guò)程,只有當(dāng)希望的狀態(tài)出現(xiàn)以后才能退出這個(gè)無(wú)限循環(huán),這種情況在實(shí)時(shí)操作系統(tǒng)管理下是不允許的,它將剝奪低優(yōu)先級(jí)任務(wù)的運(yùn)行機(jī)會(huì)。解決這個(gè)問(wèn)題的辦法是“用定時(shí)查詢代替連續(xù)查詢” 。 void MyTask (void *pdata) 進(jìn)行準(zhǔn)備工作的代碼; while(1) while (查詢的條件不成立) 調(diào)用系統(tǒng)延時(shí)函數(shù); 其它處理代碼; 不成立
23、,延時(shí)再查詢,同時(shí)讓出cpu占有權(quán),供低優(yōu)先級(jí)任務(wù)使用查詢條件成立,運(yùn)行后續(xù)代碼定時(shí)查詢條件是否成立無(wú)限循環(huán)系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)使用場(chǎng)合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)資源同步資源同步共享資源共享資源臨界區(qū)訪問(wèn)共享資源臨界區(qū)訪問(wèn)共享資源等待共享資源申請(qǐng)共享資源.申請(qǐng)共享資源.任務(wù)1任務(wù)2釋放臨界區(qū)互斥,保證共享資源的完整性和可靠性釋放1.“資源同步”圖解1.使用關(guān)中斷:使用關(guān)中斷:通過(guò)調(diào)用禁止中斷函數(shù)OS_ENTER_CRITICAL()和允許中斷函數(shù)OS_EXIT_CRITICAL()實(shí)現(xiàn)的。2.使用關(guān)調(diào)度:使用關(guān)調(diào)度:通過(guò)調(diào)用禁止任務(wù)調(diào)度函數(shù)OSSchedLock()和允許任
24、務(wù)調(diào)度函數(shù)OSSchedUnlock()實(shí)現(xiàn)的,因?yàn)榻拐{(diào)度違背了多任務(wù)的初衷,所以不建議用戶使用。3.使用信號(hào)量與互斥信號(hào)量:使用信號(hào)量與互斥信號(hào)量:通過(guò)等待信號(hào)量和發(fā)送信號(hào)量實(shí)現(xiàn)共享資源的獨(dú)享。系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)使用場(chǎng)合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)資源同步資源同步2.“資源同步” 實(shí)現(xiàn)方式 系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)使用場(chǎng)合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)行為同步行為同步消息消息收到消息.等待消息.任務(wù)1任務(wù)2發(fā)送消息 一個(gè)任務(wù)的運(yùn)行過(guò)程需要和其它任務(wù)的運(yùn)行配合,才能達(dá)到預(yù)定的效果,任務(wù)之間的這種動(dòng)作配合和協(xié)調(diào)關(guān)系稱為“行為同步”。 任務(wù)優(yōu)先級(jí)足夠高1.行為同步
25、 信號(hào)量 事件標(biāo)志組 消息郵箱 消息隊(duì)列 任務(wù)之間的通訊同步系統(tǒng)函數(shù)使用場(chǎng)合系統(tǒng)函數(shù)使用場(chǎng)合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)行為同步行為同步2.數(shù)據(jù)通信 數(shù)據(jù)通訊時(shí)是否需要遵守“資源同步”規(guī)則 數(shù)據(jù)通訊的同時(shí)是否具有“行為同步” 功能消息郵箱消息郵箱不需要有消息隊(duì)列消息隊(duì)列 不需要有全局變量全局變量需要無(wú)注意:盡管指針可能是局部變量,但只要指針指向的變量是全局變量,操作指針指向的變量時(shí)也需要當(dāng)作全局變量來(lái)處理。C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)時(shí)間管理時(shí)間管理系統(tǒng)延時(shí)函數(shù)OSTimeDly()強(qiáng)制延時(shí)的任務(wù)結(jié)束延時(shí)OSTimeDlyResume() 系統(tǒng)延時(shí)函數(shù)OSTimeDly
26、HMSM()123獲得系統(tǒng)時(shí)間OSTimeGet()和設(shè)置系統(tǒng)時(shí)間OSTimeSet() 4時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)概述概述 C/OS-II提供了若干個(gè)時(shí)間管理服務(wù)函數(shù),可以滿足任務(wù)在運(yùn)行過(guò)程中對(duì)時(shí)間管理的需求。在使用時(shí)間管理服務(wù)函數(shù)時(shí),必須十分清楚一個(gè)事實(shí):時(shí)間管理服務(wù)函數(shù)是以系統(tǒng)節(jié)拍為處時(shí)間管理服務(wù)函數(shù)是以系統(tǒng)節(jié)拍為處理單位的,實(shí)際的時(shí)間與希望的時(shí)間是有誤差的,最壞的情況理單位的,實(shí)際的時(shí)間與希望的時(shí)間是有誤差的,最壞的情況下誤差接近一個(gè)系統(tǒng)節(jié)拍。下誤差接近一個(gè)系統(tǒng)節(jié)拍。因此時(shí)間管理服務(wù)函數(shù)只能用在對(duì)時(shí)間精度要求不高的場(chǎng)合,或者時(shí)間間隔較長(zhǎng)的場(chǎng)合。 時(shí)間管
27、理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDly()系統(tǒng)延時(shí)函數(shù)OSTimeDly()調(diào)用圖解任務(wù)進(jìn)入運(yùn)行狀態(tài)任務(wù)進(jìn)入運(yùn)行狀態(tài)進(jìn)入延時(shí),同時(shí)發(fā)生任務(wù)調(diào)度進(jìn)入延時(shí),同時(shí)發(fā)生任務(wù)調(diào)度任務(wù)調(diào)用任務(wù)調(diào)用OSTimeDly()任務(wù)進(jìn)入就緒狀態(tài)任務(wù)進(jìn)入就緒狀態(tài) 當(dāng)前任務(wù)優(yōu)先級(jí)為就緒態(tài)中最高延時(shí)時(shí)間到延時(shí)的長(zhǎng)短是由時(shí)鐘節(jié)拍的數(shù)目來(lái)確定時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDly() 下面我們?cè)O(shè)計(jì)一個(gè)任務(wù),讓一個(gè)LED以50個(gè)時(shí)鐘節(jié)拍為單位閃耀,說(shuō)明OSTimeDly()函數(shù)的用途。由于篇幅關(guān)系,只給出任務(wù)主要處理代碼。void TaskLED (void
28、 *pdata) while (1) LED0=0; OSTimeDly(25); LED0=1; OSTimeDly(25); 延時(shí)25個(gè)節(jié)拍 循壞控制LED以固定頻率閃爍點(diǎn)亮LED延時(shí)25個(gè)節(jié)拍 熄滅LED初始化代碼注意:上面的設(shè)計(jì)是OSTimeDly() 控制任務(wù)的周期性執(zhí)行,還可以用它來(lái)控制任務(wù)的運(yùn)行節(jié)拍。#define LED0 PEout(9)/ PE9時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyHMSM()函數(shù)名稱函數(shù)名稱OSTimeDlyHMSM所屬文件OS_TIMC.C函數(shù)原型函數(shù)原型INT8U OSTimeDlyHMSM (INT8U hou
29、rs, INT8U minutes, INT8U seconds, INT16U milli)功能描述功能描述延時(shí),指定的延時(shí)時(shí)間為時(shí)、分、秒、毫秒函數(shù)參數(shù)函數(shù)參數(shù)hours:小時(shí),minutes:分鐘,seconds:秒,milli:毫秒函數(shù)返回值函數(shù)返回值OS_TIME_INVALID_MINUTES:minutes參數(shù)錯(cuò)誤OS_TIME_INVALID_SECONDS:seconds參數(shù)錯(cuò)誤OS_TIME_INVALID_MILLI:milli參數(shù)錯(cuò)誤特殊說(shuō)明特殊說(shuō)明(1) 所有參數(shù)為0時(shí)不延時(shí),函數(shù)直接返回(2) 必須正確設(shè)置全局常數(shù)OS_TICKS_PER_SEC,否則延時(shí)時(shí)間是錯(cuò)誤
30、的(3) 因?yàn)镺STimeDlyHMSM()是通過(guò)多次(或1次)調(diào)用OSTimeDly()實(shí)現(xiàn)的,所以延時(shí)分辨率為時(shí)延時(shí)分辨率為時(shí)鐘節(jié)拍鐘節(jié)拍(4) 因?yàn)镺STimeDlyHMSM()是通過(guò)多次(或1次)調(diào)用OSTimeDly()實(shí)現(xiàn)的,所以可能需要調(diào)用多可能需要調(diào)用多次次OSTimeDlyResume()才能恢復(fù)延時(shí)的任務(wù)才能恢復(fù)延時(shí)的任務(wù) C/OS-提供了OSTimeDlyHMSM()系統(tǒng)延時(shí)函數(shù),這個(gè)函數(shù)是以小時(shí)(H)、分(M)、秒(S)和毫秒(m)四個(gè)參數(shù)來(lái)定義延時(shí)時(shí)間的,函數(shù)在內(nèi)部把這些參數(shù)轉(zhuǎn)換為時(shí)鐘節(jié)拍,再通過(guò)單次或多次調(diào)用OSTimeDly()進(jìn)行延時(shí)和任務(wù)調(diào)度,所以延時(shí)原理和調(diào)
31、用延時(shí)函數(shù)OSTimeDly()是一樣的。OSTimeDlyHMSM()詳細(xì)見(jiàn)下表。時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyHMSM() 為了說(shuō)明OSTimeDlyHMSM()函數(shù)的使用方法,下面我們?cè)O(shè)計(jì)一個(gè)任務(wù),讓一個(gè)LED以2Hz的頻率閃耀。下面給出任務(wù)主要處理代碼。void TaskLED (void *pdata) while (1) LED1=0; OSTimeDlyHMSM(0, 0, 0, 250); LED1=1; OSTimeDlyHMSM(0, 0, 0, 250); 250ms延時(shí)循壞控制LED以固定頻率閃爍點(diǎn)亮LED250ms延時(shí)熄滅
32、LED初始化代碼注意:上面的設(shè)計(jì)是OSTimeDlyHMSM()控制任務(wù)的周期性執(zhí)行,還可以用它來(lái)控制任務(wù)的運(yùn)行節(jié)拍。#define LED1 PEout(9)/ PE9時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyResume() 任務(wù)進(jìn)入運(yùn)行狀態(tài)任務(wù)進(jìn)入運(yùn)行狀態(tài)任務(wù)調(diào)用延時(shí)函數(shù)任務(wù)調(diào)用延時(shí)函數(shù)任務(wù)進(jìn)入就緒狀態(tài)任務(wù)進(jìn)入就緒狀態(tài) 當(dāng)前任務(wù)優(yōu)先級(jí)為就緒態(tài)中最高調(diào)用OSTimeDlyResume()延時(shí)期延時(shí)期 C/OS-允許用戶結(jié)束正處于延時(shí)期的任務(wù),延時(shí)的任務(wù)可以不等待延時(shí)期滿,而是通過(guò)取消其它任務(wù)的延時(shí)來(lái)使自己處于就緒態(tài),可以通過(guò)調(diào)用OSTimeDlyResum
33、e()和指定要恢復(fù)的任務(wù)的優(yōu)先級(jí)來(lái)完成。時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyResume() 函數(shù)名稱函數(shù)名稱OSTimeDlyResume所屬文件OS_TIMC.C函數(shù)原型函數(shù)原型INT8U OSTimeDlyResume(INT8U prio)功能描述功能描述讓延時(shí)的任務(wù)結(jié)束延時(shí)函數(shù)參數(shù)函數(shù)參數(shù)prio:任務(wù)優(yōu)先級(jí)函數(shù)返回值函數(shù)返回值OS_NO_ERR:成功,OS_PRIO_INVALID:prio錯(cuò)誤OS_TIME_NOT_DLY:任務(wù)沒(méi)有延時(shí),OS_TASK_NOT_EXIST:任務(wù)不存在特殊說(shuō)明特殊說(shuō)明因?yàn)橐驗(yàn)镺STimeDlyHMSM()是通
34、過(guò)多次是通過(guò)多次(或或1次次)調(diào)用調(diào)用OSTimeDly()實(shí)現(xiàn)實(shí)現(xiàn)的,所以可能需要調(diào)用多次的,所以可能需要調(diào)用多次OSTimeDlyResume()才能恢復(fù)延時(shí)的才能恢復(fù)延時(shí)的任務(wù)任務(wù) OSTimeDlyResume()的具體信息見(jiàn)下表。 時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyResume() 為了說(shuō)明OSTimeDlyResume()函數(shù)的使用方法,我們?cè)O(shè)計(jì)一個(gè)系統(tǒng),假設(shè)TaskLED的任務(wù)優(yōu)先級(jí)為2。讓一個(gè)LED以0.5Hz的頻率閃耀,但每按鍵一次,LED狀態(tài)翻轉(zhuǎn)一次。下面是兩個(gè)任務(wù)的處理流程。時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基
35、礎(chǔ)OSTimeDlyResume() TaskLED任務(wù)代碼如下。void TaskLED (void *pdata) while (1) LED1=0; OSTimeDly(OS_TICKS_PER_SEC); LED1=1; OSTimeDly (OS_TICKS_PER_SEC); 1s延時(shí)循壞控制LED以固定頻率閃爍點(diǎn)亮LED1s延時(shí)熄滅LED初始化代碼#define LED1 PEout(9)/ PE9時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyResume() TaskKEY任務(wù)的代碼如下。#define KEY1 PBin(9)/ PB9void
36、TaskKEY (void *pdata) while (1) while (KEY1 != 0) OSTimeDly(1); OSTimeDlyResume(2); while (KEY1= 0) OSTimeDly(1); 延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換等待按健按下等待按健釋放TaskLED優(yōu)先級(jí)為2,恢復(fù)TaskLED初始化代碼4,294,967,295 調(diào)用OSStart()時(shí)初始化計(jì)數(shù)器為0 計(jì)數(shù)器滿時(shí)從0開(kāi)始計(jì)數(shù) 1324.4,294,967,294 時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() 無(wú)論
37、時(shí)鐘節(jié)拍何時(shí)發(fā)生,C/OS-都會(huì)將一個(gè)32位的計(jì)數(shù)器加1,這個(gè)計(jì)數(shù)器在用戶調(diào)用OSStart()初始化多任務(wù)和4,294,967,295個(gè)節(jié)拍執(zhí)行完一遍的時(shí)候從0開(kāi)始計(jì)數(shù)。 發(fā)生時(shí)鐘節(jié)拍32位計(jì)數(shù)器12n.時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() 發(fā)生時(shí)鐘節(jié)拍32位計(jì)數(shù)器 用戶可以通過(guò)調(diào)用OSTimeGet()來(lái)獲得該計(jì)數(shù)器的當(dāng)前值, OSTimeGet()的詳細(xì)信息見(jiàn)下表。函數(shù)名稱函數(shù)名稱OSTimeGet所屬文件所屬文件OS_TIMC.C函數(shù)原型函數(shù)原型INT32U OSTimeGet(void)功能描述功能描述獲得系統(tǒng)時(shí)間函
38、數(shù)參數(shù)函數(shù)參數(shù)prio:任務(wù)優(yōu)先級(jí)函數(shù)返回值函數(shù)返回值系統(tǒng)時(shí)間ticks = n;調(diào)用OSTimeGet()ticks = OSTimeGet();return(n)時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() 101102n.發(fā)生時(shí)鐘節(jié)拍32位計(jì)數(shù)器調(diào)用OSTimeSet(101) 設(shè)置計(jì)數(shù)器值為101 用戶可以通過(guò)調(diào)用OSTimeSet()來(lái)改變計(jì)數(shù)器的值,OSTimeSet()的詳細(xì)信息見(jiàn)下表。 函數(shù)名稱函數(shù)名稱OSTimeSet所屬文件所屬文件OS_TIMC.C函數(shù)原型函數(shù)原型void OSTimeSet(INT32U tic
39、ks)功能描述功能描述設(shè)置系統(tǒng)時(shí)間函數(shù)參數(shù)函數(shù)參數(shù)ticks:需要設(shè)置的值函數(shù)返回值函數(shù)返回值無(wú)特殊說(shuō)明特殊說(shuō)明很少使用 時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() 為了說(shuō)明OSTimeGet()函數(shù)的使用方法,我們?cè)O(shè)計(jì)一個(gè)任務(wù),計(jì)算兩次按鍵的時(shí)間間隔放在全局變量ktime中。下面是任務(wù)的處理流程。時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() TaskKEY任務(wù)代碼如下。 #define KEY1 PBin(9)/ PB9void TaskKEY (void *pdata)
40、 while (1) while ( KEY1!= 0) OSTimeDly(1); ktime = OSTimeGet() - ktime; while (KEY1= 0) OSTimeDly(1); 延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換等待按健按下等待按健釋放獲得按鍵間隔時(shí)間初始化代碼C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)系統(tǒng)管理系統(tǒng)管理進(jìn)入然后退出臨界區(qū)禁止然后允許調(diào)度12CPU共享共享進(jìn)入臨界段進(jìn)入臨界段OS_ENTER_CRITICAL()CPU共享共享退出臨界段退出臨界段OS_EXIT_CRITICAL() 當(dāng)前任務(wù)獨(dú)占當(dāng)前任務(wù)獨(dú)占CPU 其他任何任務(wù)和中斷都無(wú)法得
41、其他任何任務(wù)和中斷都無(wú)法得到到CPU,直到退出臨界段。保,直到退出臨界段。保證了臨界段代碼的運(yùn)行完整性證了臨界段代碼的運(yùn)行完整性系統(tǒng)管理系統(tǒng)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)進(jìn)入然后退出臨界區(qū)進(jìn)入然后退出臨界區(qū) 進(jìn)入然后退出臨界段是“資源同步”的方法之一,能夠在訪問(wèn)共享資源時(shí)保障信息的可靠性和完整性。 為了說(shuō)明它在”資源同步”時(shí)的使用,我們?cè)O(shè)計(jì)一個(gè)系統(tǒng),假設(shè)有兩個(gè)任務(wù),它們都對(duì)全局變量sum1和sum2操作。低優(yōu)先級(jí)任務(wù)讓這兩個(gè)變量始終相等,并不斷在計(jì)數(shù);高優(yōu)先級(jí)任務(wù)不斷的判斷這兩個(gè)變量是否相等,不相等則點(diǎn)亮LED,下面是兩個(gè)任務(wù)的處理流程。系統(tǒng)管理系統(tǒng)管理| C/OS-II程序設(shè)
42、計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)進(jìn)入然后退出臨界區(qū)進(jìn)入然后退出臨界區(qū)TaskLED任務(wù)代碼如下。#define LED1 PEout(9)/ PE9void TaskLED (void *pdata) while (1) OS_ENTER_CRITICAL(); if (sum1 != sum2) LED1=0; OS_EXIT_CRITICAL(); OSTimeDly(2); 判斷兩個(gè)全局變量是否相等延時(shí)2個(gè)節(jié)拍,任務(wù)切換進(jìn)入臨界段退出臨界段兩個(gè)全局變量不等,點(diǎn)亮LED初始化代碼系統(tǒng)管理系統(tǒng)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)進(jìn)入然后退出臨界區(qū)進(jìn)入然后退出臨界區(qū)TaskAdd任務(wù)代碼如下。vo
43、id TaskAdd (void *pdata) while (1) OS_ENTER_CRITICAL(); sum1+; sum2+; OS_EXIT_CRITICAL(); OSTimeDly(1); 全局變量sum1自加延時(shí)1個(gè)節(jié)拍,任務(wù)切換進(jìn)入臨界段退出臨界段全局變量sum2自加初始化代碼系統(tǒng)管理系統(tǒng)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)進(jìn)入然后退出臨界區(qū)進(jìn)入然后退出臨界區(qū)3.調(diào)用OSSchedLock()以后,用戶的應(yīng)用程序不得使用任何能將現(xiàn)行任務(wù)掛起的系統(tǒng)調(diào)用,直到配對(duì)的OSSchedUnlock()調(diào)用為止。 1. OSSchedlock()和OSSchedUnlock
44、()必須成對(duì)使用,也可以嵌套使用; 2. OSSchedlock()只是禁止了任務(wù)的調(diào)度,而沒(méi)有禁止中斷,此時(shí)如果允許中斷,中斷到來(lái)時(shí)還是會(huì)執(zhí)行對(duì)應(yīng)的中斷服務(wù)程序;系統(tǒng)管理系統(tǒng)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)禁止然后允許調(diào)度禁止然后允許調(diào)度注意:對(duì)于用戶來(lái)說(shuō),極少使用禁止然后允許調(diào)度的方法。不過(guò),很多操作系統(tǒng)內(nèi)部和驅(qū)動(dòng)程序使用它來(lái)減少中斷響應(yīng)時(shí)間。 給調(diào)度器上鎖OSSchedlock()函數(shù)用于禁止任務(wù)調(diào)度,直到任務(wù)完成后調(diào)用給調(diào)度器開(kāi)鎖OSSchedUnlock()函數(shù)為止。使用它有3點(diǎn)需要注意。 C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)事件的一般使用規(guī)則事件的一般使用規(guī)則 相似
45、性配對(duì)使用先創(chuàng)建后使用123在ISR中使用4事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)相似性相似性 事件管理函數(shù)是C/OS-II中最多的系統(tǒng)函數(shù),在C/OS-II V2.52中總共有34個(gè),而且每種事件具有的管理函數(shù)數(shù)目不同。但是所有的事件都有類似的6個(gè)函數(shù),它們是所有事件的基本功能,其函數(shù)名類似,使用方法也類似,詳細(xì)函數(shù)見(jiàn)下表。功能功能信號(hào)量信號(hào)量互斥信號(hào)量互斥信號(hào)量事件標(biāo)志組事件標(biāo)志組消息郵箱消息郵箱消息隊(duì)列消息隊(duì)列建立事件建立事件OSSemCreateOSMutexCreateOSFlagCreateOSMboxCreateOSQCreate刪除事件
46、刪除事件OSSemDelOSMutexDelOSFlagDelOSMboxDelOSQDel等待事件等待事件OSSemPendOSMutexPendOSFlagPendOSMboxPendOSQPend發(fā)送事件發(fā)送事件OSSemPostOSMutexPostOSFlagPostOSMboxPostOSQPost無(wú)等待獲得事件無(wú)等待獲得事件OSSemAcceptOSMutexAcceptOSFlagAcceptOSMboxAcceptOSQAccept查詢事件狀態(tài)查詢事件狀態(tài)OSSemQueryOSMutexQueryOSFlagQueryOSMboxQueryOSQQuery另外還有4個(gè)事件管
47、理函數(shù)為OSMboxPostOpt()、OSQPostFront()、 OSQPostOpt()、 OSQFlush(),各函數(shù)詳見(jiàn)后面章節(jié)。事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)先創(chuàng)建后使用先創(chuàng)建后使用 任何一個(gè)事件,必須先創(chuàng)建后使用。創(chuàng)建事件是通過(guò)調(diào)用函數(shù)OS?Create()實(shí)現(xiàn)的,其中?為事件的類型。創(chuàng)建事件可以在main()函數(shù)中,但更多的是在任務(wù)初始化部分。使用方法如下。OS_EVENT *event; void Task0(void *pdata) pdata = pdata; event = OS?Create(); while (1)
48、 /* 其它代碼 */ 定義事件防止編譯器報(bào)警創(chuàng)建事件事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)先創(chuàng)建后使用先創(chuàng)建后使用 一般來(lái)說(shuō),在嵌入式系統(tǒng)中,事件是靜態(tài)使用的,即創(chuàng)建后永遠(yuǎn)不刪除。但有時(shí)候需要?jiǎng)討B(tài)使用,即根據(jù)需要?jiǎng)?chuàng)建和刪除事件,此時(shí)創(chuàng)建事件就是在任務(wù)的事件執(zhí)行代碼中,使用方法如下。OS_EVENT *event;void Task0(void *pdata) pdata = pdata; while (1) event = OS?Create(); /* 其它代碼 */ OS?Del(event,); 定義事件防止編譯器報(bào)警創(chuàng)建事件刪除事件刪除事件后
49、不要再使用它配對(duì)使用事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ) 由前面介紹可知,事件是動(dòng)態(tài)使用時(shí),建立事件和刪除事件必須配對(duì)使用。下面給出一個(gè)示例,假設(shè)Task0為高優(yōu)先級(jí)任務(wù),Task1為低優(yōu)先級(jí)任務(wù)。 Task0代碼如下。 配對(duì)使用配對(duì)使用OS_EVENT *event;void Task0(void *pdata) pdata = pdata; event = OS?Create(); while (1) OS?Pend(event,); /* 其它代碼 */ 定義事件防止編譯器報(bào)警創(chuàng)建事件等待獲得事件無(wú)等待獲得事件OS?Accept()是等待事件的
50、一種特殊形式,有事件時(shí)它與等待事件沒(méi)有差別,沒(méi)有事件時(shí),它不等待,直接返回錯(cuò)誤信息。 因 為 已 經(jīng) 具 有 無(wú) 等 待 獲 得 事 件 的 功 能 , 所 以 很 少 使 用 查 詢 功 能OSSemQuery()。事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ) Task1代碼如下。配對(duì)使用配對(duì)使用void Task1(void *pdata) pdata = pdata; while (1) /* 其它代碼 */ OS?Post(event,); /* 其它代碼 */ 防止編譯器報(bào)警發(fā)送事件注意:一些事件有多個(gè)發(fā)送事件的函數(shù),消息郵箱除OSMboxPost
51、()外,還有增強(qiáng)型發(fā)送函數(shù)OSMboxPostOpt(),消息隊(duì)列有OSQPost()、OSQPostFront()、 OSQPostOpt()三種發(fā)送函數(shù),各函數(shù)詳見(jiàn)后面章節(jié)。事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)在在ISR中使用中使用中斷服務(wù)程序不能等待中斷服務(wù)程序總體是順序結(jié)構(gòu)中斷與所有的任務(wù)異步中斷服務(wù)程序需要盡快退出 要掌握事件函數(shù)在中斷服務(wù)程序中的調(diào)用規(guī)則,我們必須清楚中斷服務(wù)有哪些特點(diǎn)。事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)在在ISR中使用中使用 下面給出事件在中斷服務(wù)程序中使用方法,假設(shè)Task
52、0任務(wù)接收ISR發(fā)送的消息,任務(wù)代碼如下。OS_EVENT *event; void Task0(void *pdata) pdata = pdata; event = OS?Create(); while (1) OS?Pend(event,); /* 其它代碼 */ 定義事件防止編譯器報(bào)警創(chuàng)建事件等待獲得事件事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)在在ISR中使用中使用 ISR中的代碼如下。void ISR(void) /* 其它代碼 */ OS?Post(event,); /* 其它代碼 */發(fā)送事件注意:中斷服務(wù)程序一般不會(huì)調(diào)用建立和刪除事件函數(shù)
53、,否則要么沒(méi)有起到事件的作用,要么程序很復(fù)雜;1. 中斷服務(wù)程序不能調(diào)用等待事件的函數(shù),否則可能造成程序崩潰,可以調(diào)用無(wú)等待獲得事件函數(shù)獲得信號(hào),但事實(shí)上,在中斷中調(diào)用無(wú)等待獲得事件的情況都很少。C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)互斥信號(hào)量互斥信號(hào)量 簡(jiǎn)介 資源同步 函數(shù)列表 123互斥信號(hào)量互斥信號(hào)量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)簡(jiǎn)介簡(jiǎn)介 互斥信號(hào)量也稱為mutex,專用于資源同步。互斥信號(hào)量具有一些特性:占用一個(gè)空閑優(yōu)先級(jí),以便解決優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題。 在日常生活中,出租車是一種常用的共享資源,當(dāng)出租車載客時(shí),從外面可以看到標(biāo)識(shí)為載客;當(dāng)空閑時(shí),標(biāo)識(shí)為空車。這樣等車的人就可以
54、根據(jù)標(biāo)識(shí)知道出租車的當(dāng)前狀態(tài),判斷是否能夠座上這輛車。這個(gè)標(biāo)識(shí)牌就是一個(gè)二值信號(hào)量。由于這種二值信號(hào)量可以實(shí)現(xiàn)對(duì)共享資源的獨(dú)占式處理,所以叫做互斥信號(hào)量。載客載客空車空車二值信號(hào)量可以實(shí)現(xiàn)對(duì)共享資源的獨(dú)占式處理互斥信號(hào)量 互斥信號(hào)量互斥信號(hào)量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)簡(jiǎn)介簡(jiǎn)介 優(yōu)先級(jí)列表任務(wù)1任務(wù)2任務(wù)3高低共享資源 假設(shè)任務(wù)1和任務(wù)3共享一個(gè)資源,任務(wù)2為優(yōu)先級(jí)介于任務(wù)1和任務(wù)3之間的一個(gè)與該共享資源無(wú)關(guān)任務(wù),分析優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題。任務(wù)2優(yōu)先級(jí)高于任務(wù)3而進(jìn)入運(yùn)行狀態(tài)任務(wù)1申請(qǐng)共享資源而處于等待狀態(tài)此時(shí),雖然任務(wù)1比任務(wù)2優(yōu)先級(jí)更高,但卻在任務(wù)2之后運(yùn)行,這種現(xiàn)象就是優(yōu)先級(jí)反
55、轉(zhuǎn)。任務(wù)3得到共享資源而處于運(yùn)行狀態(tài)互斥信號(hào)量互斥信號(hào)量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)簡(jiǎn)介簡(jiǎn)介 綜上所述,可以說(shuō)能防止優(yōu)先級(jí)反轉(zhuǎn)現(xiàn)象的信號(hào)就是互斥信號(hào)量。優(yōu)先級(jí)列表互斥信號(hào)量任務(wù)1任務(wù)2任務(wù)3高低互斥信號(hào)量任務(wù)3互斥信號(hào)量 假設(shè)任務(wù)1和任務(wù)3共享一個(gè)資源,使用互斥信號(hào)量進(jìn)行資源同步,任務(wù)2為優(yōu)先級(jí)介于任務(wù)1和任務(wù)3之間的一個(gè)與該共享資源無(wú)關(guān)任務(wù),通過(guò)互斥信號(hào)量解決優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題。任務(wù)2優(yōu)先級(jí)不夠高無(wú)法獲得CPU任務(wù)1申請(qǐng)互斥信號(hào)量而處于等待狀態(tài)任務(wù)3此時(shí),任務(wù)2無(wú)法在任務(wù)1之前得到運(yùn)行,不發(fā)生優(yōu)先級(jí)反轉(zhuǎn)互斥信號(hào)量任務(wù)1任務(wù)3獲得CPU,且優(yōu)先級(jí)升到互斥信號(hào)量?jī)?yōu)先級(jí)任務(wù)1獲得CPU
56、,且優(yōu)先級(jí)升到互斥信號(hào)量?jī)?yōu)先級(jí)3. 信號(hào)量最好在系統(tǒng)初始化的時(shí)候創(chuàng)建,不要在系統(tǒng)運(yùn)行的過(guò)程中動(dòng)態(tài)地創(chuàng)建和刪除。在確保成功地創(chuàng)建信號(hào)量之后,才可對(duì)信號(hào)量進(jìn)行接收和發(fā)送操作。1.在嵌入式系統(tǒng)中,經(jīng)常使用互斥信號(hào)量訪問(wèn)共享資源來(lái)實(shí)現(xiàn)資源同步。而用來(lái)實(shí)現(xiàn)資源同步的互斥信號(hào)量在創(chuàng)建時(shí)初始化,這是由OSMutexCreate ()函數(shù)來(lái)實(shí)現(xiàn)的;互斥信號(hào)量互斥信號(hào)量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)簡(jiǎn)介簡(jiǎn)介 2. OSMutexPost ()發(fā)送互斥信號(hào)量函數(shù)與OSMutexPend ()等待互斥信號(hào)量函數(shù)必須成對(duì)出現(xiàn)在同一個(gè)任務(wù)調(diào)用的函數(shù)中,因此我們需要編寫(xiě)一個(gè)公共的庫(kù)函數(shù),因?yàn)橛卸鄠€(gè)任務(wù)可能調(diào)
57、用這個(gè)函數(shù) ; 使用互斥信號(hào)量有以下3點(diǎn)需要注意?;コ庑盘?hào)量互斥信號(hào)量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)函數(shù)列表函數(shù)列表 OSMutexQuery函數(shù)函數(shù)名稱函數(shù)名稱OSMutexQuery所屬文件OS_MUTEX.C函數(shù)原型函數(shù)原型INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *pdata)功能描述功能描述取得互斥信號(hào)量的狀態(tài)取得互斥信號(hào)量的狀態(tài):用戶程序必須分配一個(gè)OS_MUTEX_DATA的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來(lái)從互斥信號(hào)量的事件控制塊接收數(shù)據(jù)。通過(guò)調(diào)用OSMutexQuery ()函數(shù)可以知道任務(wù)是否有其它任務(wù)等待互斥信
58、號(hào)量,得到PIP,以及確認(rèn)互斥信號(hào)量是否有效函數(shù)參數(shù)函數(shù)參數(shù)pevent :指向互斥信號(hào)量的指針,OSMutexCreate ()的返回值pdata :指向OS_MUTEX_DATA數(shù)據(jù)結(jié)構(gòu)的指針,該數(shù)據(jù)結(jié)構(gòu)包含下述成員:OSValue: 0互斥信號(hào)量無(wú)效,1互斥信號(hào)量有效OSOwnerPrio:占用互斥信號(hào)量的任務(wù)優(yōu)先級(jí)OSMutexPIP:互斥信號(hào)量的優(yōu)先級(jí)繼承優(yōu)先級(jí)(PIP)OSEventTbl:互斥信號(hào)量等待隊(duì)列的拷貝OSEventGrp:互斥信號(hào)量等待隊(duì)列索引的拷貝函數(shù)返回值函數(shù)返回值OS_NO_ERR :調(diào)用成功OS_ERR_EVENT_TYPE :錯(cuò)誤,pevent 不是指向互斥
59、信號(hào)量的指針OS_ERR_PEVENT_NULL :錯(cuò)誤,pevent為NULLOS_ERR_POST_ISR :在中斷中調(diào)用該函數(shù)所引起的錯(cuò)誤OSMutexCreate函數(shù)函數(shù)名稱OSMutexCreate所屬文件OS_MUTEX.C函數(shù)原型OS_EVENT *OSMutexCreate (INT8U prio, INT8U *err)功能描述建立并初始化一個(gè)互斥信號(hào)量建立并初始化一個(gè)互斥信號(hào)量函數(shù)參數(shù)prio:優(yōu)先級(jí)繼承值(PIP);err :用于返回錯(cuò)誤碼函數(shù)返回值指向分配給所建立的互斥信號(hào)量的事件控制塊的指針。如果沒(méi)有可用的事件控制塊,則返回空指針。*err可能為以下值:OS_NO_E
60、RR : 成功創(chuàng)建互斥信號(hào)量OS_ERR_CREATE_ISR :在中斷中調(diào)用該函數(shù)所引起的錯(cuò)誤OS_PRIO_INVALID :錯(cuò)誤,指定的優(yōu)先級(jí)非法OS_PRIO_EXIST :錯(cuò)誤,指定的優(yōu)先級(jí)已經(jīng)有任務(wù)存在OS_ERR_PEVENT_NULL:錯(cuò)誤,已經(jīng)沒(méi)有可用的事件控制塊OSMutexPend函數(shù)函數(shù)名稱OSMutexPend所屬文件OS_MUTEX.C函數(shù)原型void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)功能描述等待互斥信號(hào)量等待互斥信號(hào)量:當(dāng)互斥信號(hào)量有效時(shí),則直接返回;如果互斥信號(hào)量無(wú)效,則等待任務(wù)獲得互斥
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 結(jié)構(gòu)化布線系統(tǒng)的檢測(cè)設(shè)備項(xiàng)目風(fēng)險(xiǎn)識(shí)別與評(píng)估綜合報(bào)告
- 計(jì)算機(jī)系統(tǒng)配套用各種消耗品項(xiàng)目風(fēng)險(xiǎn)識(shí)別與評(píng)估綜合報(bào)告
- 2025-2030年中國(guó)鍋爐配套輔助設(shè)備行業(yè)深度研究分析報(bào)告
- 2025-2030年中國(guó)無(wú)內(nèi)胎氣門(mén)嘴項(xiàng)目投資可行性研究分析報(bào)告
- 2024-2030全球狗坡道行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2024年全球及中國(guó)電解氯化系統(tǒng)行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2024年全球及中國(guó)企業(yè)合同管理軟件行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 總經(jīng)理分紅收入合同7篇
- 2025年二手住宅按揭貸款購(gòu)銷合同綜合版
- 2025年人防通風(fēng)設(shè)備安裝工程承包合同范本
- 《素描》課件-第一章 素描入門(mén)
- DL5168-2023年110KV-750KV架空輸電線路施工質(zhì)量檢驗(yàn)及評(píng)定規(guī)程
- 工資條(標(biāo)準(zhǔn)模版)
- 皮膚科常用護(hù)理技術(shù)操作規(guī)程
- 第四講 搜索引擎檢索
- 四川省中小流域暴雨洪水計(jì)算表格(尾礦庫(kù)洪水計(jì)算)
- 新視野大學(xué)英語(yǔ)(第三版)讀寫(xiě)教程Book4-Unit7-Section-B-A-worldwide-food-crisis課件
- 毛筆字練習(xí)基本筆畫(huà)及毛筆字基本筆畫(huà)入門(mén)
- 《廣東省建筑與裝飾工程綜合定額2023》
- Overture 4.0 中文版使用手冊(cè)(V1.0)-IT計(jì)算機(jī)-專業(yè)資料
- 帶括號(hào)的方程計(jì)算題100道
評(píng)論
0/150
提交評(píng)論