嵌入式系統(tǒng)軟件設(shè)計(jì)_第1頁
嵌入式系統(tǒng)軟件設(shè)計(jì)_第2頁
嵌入式系統(tǒng)軟件設(shè)計(jì)_第3頁
嵌入式系統(tǒng)軟件設(shè)計(jì)_第4頁
嵌入式系統(tǒng)軟件設(shè)計(jì)_第5頁
已閱讀5頁,還剩132頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、嵌入式系統(tǒng)軟件設(shè)計(jì)嵌入式系統(tǒng)軟件設(shè)計(jì)緒論緒論 本章重點(diǎn)介紹C/OS-II V2.52版本嵌入式實(shí)時(shí)操作系統(tǒng)常用函數(shù)的基本用法,其最大的特點(diǎn)不僅示例程序簡潔明了,而且電路也非常簡單(如下圖),希望初學(xué)者一看就懂、一學(xué)就會,達(dá)到快速入門的目的。注意:本章所有應(yīng)用示例都全部默認(rèn)采用這個(gè)圖,主要是為了盡量簡化示例程序,提高可讀性,使用簡單明了的語言和方法來解析復(fù)雜的理論知識,這是作者在多年的學(xué)習(xí)、工作和教學(xué)中一直倡導(dǎo)的風(fēng)格和習(xí)慣性的行為,同時(shí)這也是寫作本書的出發(fā)點(diǎn)。硬件去抖目 錄任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)系統(tǒng)函數(shù)使用場合系統(tǒng)函數(shù)使用場合系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述時(shí)間管理時(shí)間管理事件的一般使用規(guī)則事件的一般使用規(guī)則

2、系統(tǒng)管理系統(tǒng)管理1互斥信號量互斥信號量信號量信號量事件標(biāo)志組事件標(biāo)志組消息郵箱消息郵箱動態(tài)內(nèi)存管理動態(tài)內(nèi)存管理消息隊(duì)列消息隊(duì)列23465789101211嵌入式系統(tǒng)軟件設(shè)計(jì)任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)任務(wù)的任務(wù)的分類任務(wù)的優(yōu)先級任務(wù)的優(yōu)先級任務(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ì)來展開。任務(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ù)的分類按照執(zhí)行方式分類任務(wù)設(shè)計(jì)任

3、務(wù)設(shè)計(jì)| C/OS-II程序設(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)先級足夠高任

4、務(wù)優(yōu)先級足夠高任務(wù)設(shè)計(jì)任務(wù)設(shè)計(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í)體代碼; 等待信號量或消息運(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)先級足夠高消息完成具體功能任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)的劃分任務(wù)的劃分1.任務(wù)劃分的目標(biāo) 在對一個(gè)具體的嵌入式應(yīng)用系統(tǒng)進(jìn)行任務(wù)劃分時(shí),可以有不同的任務(wù)劃分方案。為了選擇最佳劃分方案,就必須知道任務(wù)劃分的目標(biāo)。高效率的系統(tǒng)高效率的系統(tǒng)

5、1.首要目標(biāo)是滿足首要目標(biāo)是滿足“實(shí)時(shí)性實(shí)時(shí)性”指標(biāo)指標(biāo):即使在最壞的情況下,系統(tǒng)中所有對實(shí)時(shí)性有要求的功能都能夠正常實(shí)現(xiàn);3.簡化軟件系統(tǒng):簡化軟件系統(tǒng):一個(gè)任務(wù)要實(shí)現(xiàn)其功能,除了需要操作系統(tǒng)的調(diào)度功能支持外,還需要操作系統(tǒng)的其它服務(wù)功能支持,合理劃分任務(wù),可以減少對操作系統(tǒng)的服務(wù)要求,簡化軟件系統(tǒng);4.降低資源需求:降低資源需求:合理劃分任務(wù),減少或簡化任務(wù)之間的同步和通信需求,就可以減少相應(yīng)數(shù)據(jù)結(jié)構(gòu)的內(nèi)存規(guī)模,從而降低對系統(tǒng)資源的需求。2.任務(wù)數(shù)目合理:任務(wù)數(shù)目合理:對于同一個(gè)應(yīng)用系統(tǒng),合理的合并一些任務(wù),使任務(wù)數(shù)目適當(dāng)少一些還是比較有利;任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程

6、序設(shè)計(jì)基礎(chǔ)任務(wù)的劃分任務(wù)的劃分2.任務(wù)劃分的方法 任務(wù)的劃分方法,請參考下一章“基于LPC2000的電腦自動打鈴器設(shè)計(jì)與實(shí)現(xiàn)”。傳遞性:傳遞性:信息傳遞的上游任務(wù)的優(yōu)先級高于下游任務(wù)的優(yōu)先級。如信號采集任務(wù)的優(yōu)先級高于數(shù)據(jù)處理任務(wù)的優(yōu)先級。緊迫性:緊迫性:因?yàn)榫o迫任務(wù)對響應(yīng)時(shí)間有嚴(yán)格要求,在所有緊迫任務(wù)中,按響應(yīng)時(shí)間要求排序,越緊迫的任務(wù)安排的優(yōu)先級越高。緊迫任務(wù)通常與ISR關(guān)聯(lián);關(guān)鍵性:關(guān)鍵性:任務(wù)越關(guān)鍵安排的優(yōu)先級越高,以保障其執(zhí)行機(jī)會;中斷關(guān)聯(lián)性中斷關(guān)聯(lián)性:與中斷服務(wù)程序(ISR)有關(guān)聯(lián)的任務(wù)應(yīng)該安排盡可能高的優(yōu)先級,以便及時(shí)處理異步事件,提高系統(tǒng)的實(shí)時(shí)性。如果優(yōu)先級安排得比較低,CPU

7、有可能被優(yōu)先級比較高的任務(wù)長期占用,以致于在第二次中斷發(fā)生時(shí)連第一次中斷還沒有處理,產(chǎn)生信號丟失現(xiàn)象;頻繁性:頻繁性:對于周期性任務(wù),執(zhí)行越頻繁,則周期越短,允許耽誤的時(shí)間也越短,故應(yīng)該安排的優(yōu)先級也越高,以保障及時(shí)得到執(zhí)行;快捷性:快捷性:在前面各項(xiàng)條件相近時(shí),越快捷(耗時(shí)短)的任務(wù)安排的優(yōu)先級越高,以使其它就緒任務(wù)的延時(shí)縮短;任務(wù)設(shè)計(jì)任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)任務(wù)的優(yōu)先級任務(wù)的優(yōu)先級 任務(wù)的優(yōu)先級安排原則如下: 緊迫性緊迫性任務(wù)優(yōu)先級 關(guān)鍵性關(guān)鍵性中斷關(guān)聯(lián)性中斷關(guān)聯(lián)性快捷性快捷性頻繁性頻繁性傳遞性傳遞性嵌入式系統(tǒng)軟件設(shè)計(jì)系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述基本原則基本原則系統(tǒng)函

8、數(shù)的分類系統(tǒng)函數(shù)的分類12系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)基本原則基本原則1.配對性原則 對于C/OS-II來說,大多數(shù)API都是成對的,而且一部分必須配對使用。當(dāng)然,查詢狀態(tài)的系統(tǒng)函數(shù)一般不需要配對使用,而且部分API如延時(shí),也不需要配對使用。配對的函數(shù)見下表。函數(shù)1功能函數(shù)2功能備注OSFlagPend()等待事件標(biāo)志組的事件標(biāo)志位OSFlagPost()置位或清0事件標(biāo)志組中的標(biāo)志不必須配對使用,一般不在同一個(gè)任務(wù)中(用于資源同步時(shí)必須同一個(gè)任務(wù)中配對使用)OSMboxPend()等待消息郵箱中的消息OSMboxPost()或OSMboxPostOpt(

9、)以不同的方式向消息郵箱發(fā)送消息OSQPend()等待消息隊(duì)列中的消息OSQPost()或OSQPostFront()或OSQPostOpt()以不同的方式向消息隊(duì)列發(fā)送一條消息OSSemPend()等待一個(gè)信號量OSSemPost()發(fā)送一個(gè)信號量OSMutexPend()等待一個(gè)互斥信號量OSMutexPost()釋放一個(gè)互斥信號量必須在同一個(gè)任務(wù)中配對使用函數(shù)1功能函數(shù)2功能備注OSTimeGet()獲得系統(tǒng)時(shí)間OSTimeSet()設(shè)置系統(tǒng)時(shí)間不必配對使用OSIntEnter()進(jìn)入中斷處理OSIntExit()退出中斷處理必須在中斷服務(wù)程序中配對使用OSSchedLock()給調(diào)度器

10、上鎖OSSchedUnlock()給調(diào)度調(diào)度必須在一個(gè)任務(wù)中配對使用OS_ENTER_CRITICAL()進(jìn)入臨界區(qū)OS_EXIT_CRITICAL()退出臨界區(qū)必須在一個(gè)任務(wù)或中斷中配對使用函數(shù)1功能函數(shù)2功能備注OSMemGet()分配一個(gè)內(nèi)存塊OSMemPut()釋放一個(gè)內(nèi)存塊必須配對使用OSTaskCreate()或OSTaskCreateExt()建立任務(wù)OSTaskDel()刪除任務(wù)動態(tài)使用任務(wù)時(shí)必須配對使用OSTaskSuspend()掛起任務(wù)OSTaskResume()恢復(fù)任務(wù)必須配對使用OSTimeDly()或OSTimeDlyHMSM()延時(shí)OSTimeDlyResume(

11、)恢復(fù)延時(shí)的任務(wù)不必配對使用。OSTimeDlyHMSM()可能需要多個(gè)OSTimeDlyResume()才能恢復(fù)函數(shù)1功能函數(shù)2功能備注OSFlagCreate()建立事件標(biāo)志組OSFlagDel()刪除事件標(biāo)志組動態(tài)使用事件時(shí)必須配對使用OSMboxCreate()建立消息郵箱OSMboxDel()刪除消息郵箱OSMutexCreate()建立互斥信號量OSMutexDel()刪除互斥信號量OSQCreate()建立消息隊(duì)列OSQDel()刪除消息隊(duì)列OSSemCreate()建立信號量OSSemDel()刪除信號量系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)基本原則

12、基本原則2.中斷服務(wù)程序調(diào)用函數(shù)的限制 中斷服務(wù)程序不能調(diào)用可能會導(dǎo)致任務(wù)調(diào)度的函數(shù),它們主要是一些等待事件的函數(shù),這些函數(shù)及其替代函數(shù)見下表。注意:未列入表中的函數(shù)OSTaskCreate()、OSTaskCreateExt()、OSTaskDel()、OSTaskResume()、OSTaskChangePrio()、OSTaskSuspend()、OSTimeDly()、OSTimeDlyHMSM() 、OSTimeResume()都屬于在中斷服務(wù)程序中禁止調(diào)用的函數(shù)。禁止使用的函數(shù)替代函數(shù)功能備注OSFlagPend()OSFlagAccept()無等待獲得事件標(biāo)志組的事件標(biāo)志位需要程

13、序自己判斷是否獲得了相應(yīng)的事件OSMboxPend()OSMboxAccept()無等待獲得消息郵箱中的消息OSMutexPend()OSMutexAccept() 無等待獲得一個(gè)互斥信號量OSQPend()OSQAccept()無等待獲得息隊(duì)列中的消息OSSemPend()OSSemAccept()無等待獲得一個(gè)信號量系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)基本原則基本原則1.創(chuàng)建事件和刪除事件的函數(shù)。 一些函數(shù)雖然沒有明確地規(guī)定不能被中斷服務(wù)程序調(diào)用,但因?yàn)橹袛喾?wù)程序的特性,一般不會使用。 2.與任務(wù)相關(guān)的函數(shù)OSTaskChangePrio() 、 OSTas

14、kDelReq() 、OSTaskStkChk() 和OSTaskQuery() 。至于函數(shù)OSSchedLock()和OSSchedUnlock(),在中斷服務(wù)程序中使用沒有任何意義。系統(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)先級的操作系統(tǒng),所以在一定的條件下必須出讓CPU占有權(quán)以便比自己優(yōu)先級更低的任務(wù)能夠運(yùn)行,這是通過調(diào)用部分系統(tǒng)函數(shù)來實(shí)現(xiàn)的,這些函數(shù)見下表。一般的任務(wù)必須調(diào)用表中至少一個(gè)函數(shù),只有一種情況例外,就是單次執(zhí)行的任務(wù),因?yàn)槿蝿?wù)刪除后肯定出讓CPU,所以可以不調(diào)用表中的函數(shù)。函

15、數(shù)名功能函數(shù)名功能OSFlagPend等待事件標(biāo)志組的事件標(biāo)志位OSMutexPend等待一個(gè)互斥信號量OSQPend等待消息隊(duì)列中的消息OSQPend等待消息隊(duì)列中的消息OSSemPend等待一個(gè)信號量OSTaskSuspend 掛起任務(wù)OSTimeDly延時(shí)OSTimeDlyHMSM延時(shí)一般的操作系統(tǒng)都提供時(shí)間管理的函數(shù),最基本的就是延時(shí)函數(shù),C/OS-II也不例外,C/OS-II所具有的時(shí)間管理函數(shù)見下表。C/OS-II具有簡單的動態(tài)內(nèi)存管理能力。C/OS-II的動態(tài)內(nèi)存管理函數(shù)見下表。任務(wù)管理函數(shù)是操作與任務(wù)相關(guān)功能的函數(shù),詳見下表。系統(tǒng)管理函數(shù)是一些與C/OS-II內(nèi)核或功能相關(guān)的一

16、些函數(shù),詳見下表。C/OS-II的初始化函數(shù)有2個(gè):OSInit()和OSStart(),它們不能在任何任務(wù)和中斷服務(wù)程序中使用,僅在main()函數(shù)中按照一定的規(guī)范被調(diào)用,其中OSInit()函數(shù)初始化C/OS-II內(nèi)部變量,OSStart()函數(shù)啟動多任務(wù)環(huán)境。 C/OS-II把信號量等都稱為事件,管理它們的就是事件管理函數(shù)。C/OS-II V2.52具有的事件有普通信號量、互斥信號量、事件標(biāo)志組、消息郵箱和消息隊(duì)列,這些都是C/OS-II用于同步與通訊的工具,本章后述的內(nèi)容將會詳細(xì)介紹。系統(tǒng)函數(shù)概述系統(tǒng)函數(shù)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)系統(tǒng)函數(shù)的分類系統(tǒng)函數(shù)的分類初始化初

17、始化任務(wù)管理任務(wù)管理時(shí)間管理時(shí)間管理內(nèi)存管理內(nèi)存管理根據(jù)功能分類事件管理事件管理函數(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)度器必須配對使用,一般情況不需要使用。事實(shí)上,C/OS-II不推薦使用它們OSSchedUnlock()解鎖調(diào)度器OS_ENTER_CRITICAL()進(jìn)入臨界區(qū)必須配對使用,一般通過禁止中斷和允許中斷來實(shí)現(xiàn)的。對于一些移

18、植代碼來說,不能嵌套調(diào)用OS_EXIT_CRITICAL()退出臨界區(qū)函數(shù)名功能函數(shù)名功能OSTaskChangePrio()改變?nèi)蝿?wù)優(yōu)先級OSTaskSuspend()掛起任務(wù)OSTaskCreate()建立任務(wù)OSTaskResume()恢復(fù)任務(wù)OSTaskCreateExt()建立任務(wù),比OSTaskCreate()控制任務(wù)屬性更多OSTaskStkChk()檢查堆棧OSTaskDel()刪除任務(wù)OSTaskQuery()獲得任務(wù)信息OSTaskDelReq()請求刪除任務(wù),有特殊用途系統(tǒng)管理系統(tǒng)管理函數(shù)名功能備注OSTimeDly()以時(shí)鐘節(jié)拍為單位延時(shí)OSTimeDlyHMSM()以

19、鐘時(shí)分秒毫秒為單位延時(shí)OSTimeDlyResume()恢復(fù)延時(shí)的任務(wù)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)嵌入式系統(tǒng)軟件設(shè)計(jì)系統(tǒng)函數(shù)使用場合系統(tǒng)函數(shù)使用場合時(shí)間管理時(shí)間管理行為同步行為同步資源同步資源同步123系統(tǒng)函數(shù)使用場合系統(tǒng)

20、函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(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( ) 無限循壞注意:延時(shí)函數(shù)OSTimeDly()是以系統(tǒng)節(jié)拍數(shù)為參數(shù),而延時(shí)函數(shù)OSTimeDlyHMSM()是以實(shí)際時(shí)間值為參數(shù),但在執(zhí)行過程中仍然轉(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)用OSTimeDly

21、HMSM(0,1,27,620)的實(shí)際時(shí)間是延時(shí)1分27秒600毫秒。 在任務(wù)函數(shù)的代碼中可以通過插入延時(shí)函數(shù)來控制任務(wù)周期性運(yùn)行,定時(shí)閑置CPU一段時(shí)間,供其它任務(wù)使用。 系統(tǒng)函數(shù)使用場合系統(tǒng)函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)時(shí)間管理時(shí)間管理2.控制任務(wù)的運(yùn)行節(jié)奏 在任務(wù)函數(shù)的代碼中也可以通過插入延時(shí)函數(shù)來控制任務(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)

22、的任務(wù)函數(shù)實(shí)現(xiàn)。調(diào)用OSTimeDly( )或OSTimeDlyHMSM( ) 調(diào)用OSTimeDly( )或OSTimeDlyHMSM( ) 等待信號量、消息其他任務(wù)代碼無限循環(huán)系統(tǒng)函數(shù)使用場合系統(tǒng)函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)時(shí)間管理時(shí)間管理3.狀態(tài)查詢 查詢過程是一個(gè)無限循環(huán)過程,只有當(dāng)希望的狀態(tài)出現(xiàn)以后才能退出這個(gè)無限循環(huán),這種情況在實(shí)時(shí)操作系統(tǒng)管理下是不允許的,它將剝奪低優(yōu)先級任務(wù)的運(yùn)行機(jī)會。解決這個(gè)問題的辦法是“用定時(shí)查詢代替連續(xù)查詢” 。 void MyTask (void *pdata) 進(jìn)行準(zhǔn)備工作的代碼; while(1) while (查詢的條件不

23、成立) 調(diào)用系統(tǒng)延時(shí)函數(shù); 其它處理代碼; 不成立,延時(shí)再查詢,同時(shí)讓出cpu占有權(quán),供低優(yōu)先級任務(wù)使用查詢條件成立,運(yùn)行后續(xù)代碼定時(shí)查詢條件是否成立無限循環(huán)系統(tǒng)函數(shù)使用場合系統(tǒng)函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)資源同步資源同步共享資源共享資源臨界區(qū)訪問共享資源臨界區(qū)訪問共享資源等待共享資源申請共享資源.申請共享資源.任務(wù)1任務(wù)2釋放臨界區(qū)互斥,保證共享資源的完整性和可靠性釋放1.“資源同步”圖解1.使用關(guān)中斷:使用關(guān)中斷:通過調(diào)用禁止中斷函數(shù)OS_ENTER_CRITICAL()和允許中斷函數(shù)OS_EXIT_CRITICAL()實(shí)現(xiàn)的。2.使用關(guān)調(diào)度:使用關(guān)調(diào)度:通過調(diào)用

24、禁止任務(wù)調(diào)度函數(shù)OSSchedLock()和允許任務(wù)調(diào)度函數(shù)OSSchedUnlock()實(shí)現(xiàn)的,因?yàn)榻拐{(diào)度違背了多任務(wù)的初衷,所以不建議用戶使用。3.使用信號量與互斥信號量:使用信號量與互斥信號量:通過等待信號量和發(fā)送信號量實(shí)現(xiàn)共享資源的獨(dú)享。系統(tǒng)函數(shù)使用場合系統(tǒng)函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)資源同步資源同步2.“資源同步” 實(shí)現(xiàn)方式 系統(tǒng)函數(shù)使用場合系統(tǒng)函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)行為同步行為同步消息消息收到消息.等待消息.任務(wù)1任務(wù)2發(fā)送消息 一個(gè)任務(wù)的運(yùn)行過程需要和其它任務(wù)的運(yùn)行配合,才能達(dá)到預(yù)定的效果,任務(wù)之間的這種動作配合和協(xié)調(diào)關(guān)

25、系稱為“行為同步”。 任務(wù)優(yōu)先級足夠高1.行為同步 信號量 事件標(biāo)志組 消息郵箱 消息隊(duì)列 任務(wù)之間的通訊同步系統(tǒng)函數(shù)使用場合系統(tǒng)函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)行為同步行為同步2.數(shù)據(jù)通信 數(shù)據(jù)通訊時(shí)是否需要遵守“資源同步”規(guī)則 數(shù)據(jù)通訊的同時(shí)是否具有“行為同步” 功能消息郵箱消息郵箱不需要有消息隊(duì)列消息隊(duì)列 不需要有全局變量全局變量需要無注意:盡管指針可能是局部變量,但只要指針指向的變量是全局變量,操作指針指向的變量時(shí)也需要當(dāng)作全局變量來處理。嵌入式系統(tǒng)軟件設(shè)計(jì)時(shí)間管理時(shí)間管理系統(tǒng)延時(shí)函數(shù)OSTimeDly()強(qiáng)制延時(shí)的任務(wù)結(jié)束延時(shí)OSTimeDlyResume()

26、系統(tǒng)延時(shí)函數(shù)OSTimeDlyHMSM()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)行過程中對時(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ù)只能用在對時(shí)間精度要求不高的場合,或

27、者時(shí)間間隔較長的場合。 時(shí)間管理時(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)先級為就緒態(tài)中最高延時(shí)時(shí)間到延時(shí)的長短是由時(shí)鐘節(jié)拍的數(shù)目來確定時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDly() 下面我們設(shè)計(jì)一個(gè)任務(wù),讓一個(gè)LED以50個(gè)時(shí)鐘節(jié)拍為單位閃耀,說明OSTimeDly()函數(shù)的用途。由于篇幅關(guān)系,只給出任務(wù)主要處理代碼。voi

28、d TaskLED (void *pdata) while (1) IO0CLR = LED1; OSTimeDly(25); IO0SET = LED1; OSTimeDly(25); 延時(shí)25個(gè)節(jié)拍 循壞控制LED以固定頻率閃爍點(diǎn)亮LED延時(shí)25個(gè)節(jié)拍 熄滅LED初始化代碼注意:上面的設(shè)計(jì)是OSTimeDly() 控制任務(wù)的周期性執(zhí)行,還可以用它來控制任務(wù)的運(yùn)行節(jié)拍。時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyHMSM()函數(shù)名稱函數(shù)名稱OSTimeDlyHMSM所屬文件OS_TIMC.C函數(shù)原型函數(shù)原型INT8U OSTimeDlyHMSM (INT8U

29、hours, 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ù)錯誤OS_TIME_INVALID_SECONDS:seconds參數(shù)錯誤OS_TIME_INVALID_MILLI:milli參數(shù)錯誤特殊說明特殊說明(1) 所有參數(shù)為0時(shí)不延時(shí),函數(shù)直接返回(2) 必須正確設(shè)置全局常數(shù)OS_TICKS_PER_SEC,否則延時(shí)時(shí)間

30、是錯誤的(3) 因?yàn)镺STimeDlyHMSM()是通過多次(或1次)調(diào)用OSTimeDly()實(shí)現(xiàn)的,所以延時(shí)分辨延時(shí)分辨率為時(shí)鐘節(jié)拍率為時(shí)鐘節(jié)拍(4) 因?yàn)镺STimeDlyHMSM()是通過多次(或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ù)來定義延時(shí)時(shí)間的,函數(shù)在內(nèi)部把這些參數(shù)轉(zhuǎn)換為時(shí)鐘節(jié)拍,再通過單次或多次調(diào)用OSTimeDly()進(jìn)行延時(shí)和任務(wù)調(diào)度,所以延時(shí)原

31、理和調(diào)用延時(shí)函數(shù)OSTimeDly()是一樣的。OSTimeDlyHMSM()詳細(xì)見下表。時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyHMSM() 為了說明OSTimeDlyHMSM()函數(shù)的使用方法,下面我們設(shè)計(jì)一個(gè)任務(wù),讓一個(gè)LED以2Hz的頻率閃耀。下面給出任務(wù)主要處理代碼。void TaskLED (void *pdata) while (1) IO0CLR = LED1; OSTimeDlyHMSM(0, 0, 0, 250); IO0SET = LED1; OSTimeDlyHMSM(0, 0, 0, 250); 250ms延時(shí)循壞控制LED以固定頻

32、率閃爍點(diǎn)亮LED250ms延時(shí)熄滅LED初始化代碼注意:上面的設(shè)計(jì)是OSTimeDlyHMSM()控制任務(wù)的周期性執(zhí)行,還可以用它來控制任務(wù)的運(yùn)行節(jié)拍。時(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)先級為就緒態(tài)中最高調(diào)用OSTimeDlyResume()延時(shí)期延時(shí)期 C/OS-允許用戶結(jié)束正處于延時(shí)期的任務(wù),延時(shí)的任務(wù)可以不等待延時(shí)期滿,而是通過取消其它任務(wù)的延時(shí)來使自己處于就緒態(tài),可以通過調(diào)用OSTimeDlyResume()和指定要恢復(fù)

33、的任務(wù)的優(yōu)先級來完成。時(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)先級函數(shù)返回值函數(shù)返回值OS_NO_ERR:成功,OS_PRIO_INVALID:prio錯誤OS_TIME_NOT_DLY:任務(wù)沒有延時(shí),OS_TASK_NOT_EXIST:任務(wù)不存在特殊說明特殊說明因?yàn)橐驗(yàn)镺STimeDlyHMSM()是通過多次是通過多次(

34、或或1次次)調(diào)用調(diào)用OSTimeDly()實(shí)現(xiàn)的,所以可能需要調(diào)用多次實(shí)現(xiàn)的,所以可能需要調(diào)用多次OSTimeDlyResume()才能恢復(fù)才能恢復(fù)延時(shí)的任務(wù)延時(shí)的任務(wù) OSTimeDlyResume()的具體信息見下表。 時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyResume() 為了說明OSTimeDlyResume()函數(shù)的使用方法,我們設(shè)計(jì)一個(gè)系統(tǒng),假設(shè)TaskLED的任務(wù)優(yōu)先級為2。讓一個(gè)LED以0.5Hz的頻率閃耀,但每按鍵一次,LED狀態(tài)翻轉(zhuǎn)一次。下面是兩個(gè)任務(wù)的處理流程。時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDl

35、yResume() TaskLED任務(wù)代碼如下。void TaskLED (void *pdata) while (1) IO0CLR = LED1; OSTimeDly(OS_TICKS_PER_SEC); IO0SET = LED1; OSTimeDly (OS_TICKS_PER_SEC); 1s延時(shí)循壞控制LED以固定頻率閃爍點(diǎn)亮LED1s延時(shí)熄滅LED初始化代碼時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeDlyResume() TaskKEY任務(wù)的代碼如下。void TaskKEY (void *pdata) while (1) while (IO0PIN

36、& KEY1) != 0) OSTimeDly(1); OSTimeDlyResume(2); while (IO0PIN & KEY1) = 0) OSTimeDly(1); 延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換等待按健按下等待按健釋放TaskLED優(yōu)先級為2,恢復(fù)TaskLED初始化代碼4,294,967,295 調(diào)用OSStart()時(shí)初始化計(jì)數(shù)器為0 計(jì)數(shù)器滿時(shí)從0開始計(jì)數(shù) 1324.4,294,967,294 時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() 無論時(shí)鐘節(jié)拍何時(shí)發(fā)生,C/OS-都會將

37、一個(gè)32位的計(jì)數(shù)器加1,這個(gè)計(jì)數(shù)器在用戶調(diào)用OSStart()初始化多任務(wù)和4,294,967,295個(gè)節(jié)拍執(zhí)行完一遍的時(shí)候從0開始計(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ù)器 用戶可以通過調(diào)用OSTimeGet()來獲得該計(jì)數(shù)器的當(dāng)前值, OSTimeGet()的詳細(xì)信息見下表。函數(shù)名稱函數(shù)名稱OSTimeGet所屬文件所屬文件OS_TIMC.C函數(shù)原型函數(shù)原型INT32U OSTimeGet(void)功能描述功能描述獲得系統(tǒng)時(shí)間函數(shù)參數(shù)函數(shù)參數(shù)prio:任務(wù)優(yōu)先級

38、函數(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 用戶可以通過調(diào)用OSTimeSet()來改變計(jì)數(shù)器的值,OSTimeSet()的詳細(xì)信息見下表。 函數(shù)名稱函數(shù)名稱OSTimeSet所屬文件所屬文件OS_TIMC.C函數(shù)原型函數(shù)原型void OSTimeSet(INT32U ticks)功能描述功能描述設(shè)置系統(tǒng)時(shí)間

39、函數(shù)參數(shù)函數(shù)參數(shù)ticks:需要設(shè)置的值函數(shù)返回值函數(shù)返回值無特殊說明特殊說明很少使用 時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() 為了說明OSTimeGet()函數(shù)的使用方法,我們設(shè)計(jì)一個(gè)任務(wù),計(jì)算兩次按鍵的時(shí)間間隔放在全局變量ktime中。下面是任務(wù)的處理流程。時(shí)間管理時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() TaskKEY任務(wù)代碼如下。void TaskKEY (void *pdata) while (1) while (IO0PIN & KEY1) != 0)

40、OSTimeDly(1); ktime = OSTimeGet() - ktime; while (IO0PIN & KEY1) = 0) OSTimeDly(1); 延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換等待按健按下等待按健釋放獲得按鍵間隔時(shí)間初始化代碼嵌入式系統(tǒng)軟件設(shè)計(jì)系統(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ù)和中斷都無法得到到CPU,直到退出臨

41、界段。保,直到退出臨界段。保證了臨界段代碼的運(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)入然后退出臨界段是“資源同步”的方法之一,能夠在訪問共享資源時(shí)保障信息的可靠性和完整性。 為了說明它在”資源同步”時(shí)的使用,我們設(shè)計(jì)一個(gè)系統(tǒng),假設(shè)有兩個(gè)任務(wù),它們都對全局變量sum1和sum2操作。低優(yōu)先級任務(wù)讓這兩個(gè)變量始終相等,并不斷在計(jì)數(shù);高優(yōu)先級任務(wù)不斷的判斷這兩個(gè)變量是否相等,不相等則點(diǎn)亮LED,下面是兩個(gè)任務(wù)的處理流程。系統(tǒng)管理系統(tǒng)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)進(jìn)入然后退出臨界區(qū)進(jìn)入然后退出

42、臨界區(qū)TaskLED任務(wù)代碼如下。void TaskLED (void *pdata) while (1) OS_ENTER_CRITICAL(); if (sum1 != sum2) IO0CLR = LED1; 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ù)代碼如下。void TaskAdd (void *pdata) while (1) OS_ENTER

43、_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)用,直到配對的OSSchedUnlock()調(diào)用為止。 1. OSSchedlock()和OSSchedUnlock()必須成對使用,也可以嵌套使用; 2. OSSchedlock()只是禁止了任務(wù)的調(diào)

44、度,而沒有禁止中斷,此時(shí)如果允許中斷,中斷到來時(shí)還是會執(zhí)行對應(yīng)的中斷服務(wù)程序;系統(tǒng)管理系統(tǒng)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)禁止然后允許調(diào)度禁止然后允許調(diào)度注意:對于用戶來說,極少使用禁止然后允許調(diào)度的方法。不過,很多操作系統(tǒng)內(nèi)部和驅(qū)動程序使用它來減少中斷響應(yīng)時(shí)間。 給調(diào)度器上鎖OSSchedlock()函數(shù)用于禁止任務(wù)調(diào)度,直到任務(wù)完成后調(diào)用給調(diào)度器開鎖OSSchedUnlock()函數(shù)為止。使用它有3點(diǎn)需要注意。 嵌入式系統(tǒng)軟件設(shè)計(jì)事件的一般使用規(guī)則事件的一般使用規(guī)則 相似性配對使用先創(chuàng)建后使用123在ISR中使用4事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)

45、計(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ù)見下表。功能功能信號量信號量互斥信號量互斥信號量事件標(biāo)志組事件標(biāo)志組消息郵箱消息郵箱消息隊(duì)列消息隊(duì)列建立事件建立事件OSSemCreateOSMutexCreateOSFlagCreateOSMboxCreateOSQCreate刪除事件刪除事件OSSemDelOSMutexDelOSFlagDelOSMboxDelOSQDel等待事件等待事

46、件OSSemPendOSMutexPendOSFlagPendOSMboxPendOSQPend發(fā)送事件發(fā)送事件OSSemPostOSMutexPostOSFlagPostOSMboxPostOSQPost無等待獲得事件無等待獲得事件OSSemAcceptOSMutexAcceptOSFlagAcceptOSMboxAcceptOSQAccept查詢事件狀態(tài)查詢事件狀態(tài)OSSemQueryOSMutexQueryOSFlagQueryOSMboxQueryOSQQuery另外還有4個(gè)事件管理函數(shù)為OSMboxPostOpt()、OSQPostFront()、 OSQPostOpt()、 OSQ

47、Flush(),各函數(shù)詳見后面章節(jié)。事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)先創(chuàng)建后使用先創(chuàng)建后使用 任何一個(gè)事件,必須先創(chuàng)建后使用。創(chuàng)建事件是通過調(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) /* 其它代碼 */ 定義事件防止編譯器報(bào)警創(chuàng)建事件事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-

48、II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)先創(chuàng)建后使用先創(chuàng)建后使用 一般來說,在嵌入式系統(tǒng)中,事件是靜態(tài)使用的,即創(chuàng)建后永遠(yuǎn)不刪除。但有時(shí)候需要動態(tài)使用,即根據(jù)需要創(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)建事件刪除事件刪除事件后不要再使用它配對使用事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ) 由前

49、面介紹可知,事件是動態(tài)使用時(shí),建立事件和刪除事件必須配對使用。下面給出一個(gè)示例,假設(shè)Task0為高優(yōu)先級任務(wù),Task1為低優(yōu)先級任務(wù)。 Task0代碼如下。 配對使用配對使用OS_EVENT *event;void Task0(void *pdata) pdata = pdata; event = OS?Create(); while (1) OS?Pend(event,); /* 其它代碼 */ 定義事件防止編譯器報(bào)警創(chuàng)建事件等待獲得事件無等待獲得事件OS?Accept()是等待事件的一種特殊形式,有事件時(shí)它與等待事件沒有差別,沒有事件時(shí),它不等待,直接返回錯誤信息。 因 為 已 經(jīng) 具

50、有 無 等 待 獲 得 事 件 的 功 能 , 所 以 很 少 使 用 查 詢 功 能OSSemQuery()。事件的一般使用規(guī)則事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ) Task1代碼如下。配對使用配對使用void Task1(void *pdata) pdata = pdata; while (1) /* 其它代碼 */ OS?Post(event,); /* 其它代碼 */ 防止編譯器報(bào)警發(fā)送事件注意:一些事件有多個(gè)發(fā)送事件的函數(shù),消息郵箱除OSMboxPost()外,還有增強(qiáng)型發(fā)送函數(shù)OSMboxPostOpt(),消息隊(duì)列有OSQPost()、OSQPostFr

51、ont()、 OSQPostOpt()三種發(fā)送函數(shù),各函數(shù)詳見后面章節(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è)Task0任務(wù)接收ISR發(fā)送的消息,任務(wù)代碼如下。OS_EVENT *event; void Task0(voi

52、d *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ù)程序一般不會調(diào)用建立和刪除事件函數(shù),否則要么沒有起到事件的作用,要么程序很復(fù)雜;1. 中斷服務(wù)程序不能調(diào)用等待事件的函數(shù),否則可能造成程序

53、崩潰,可以調(diào)用無等待獲得事件函數(shù)獲得信號,但事實(shí)上,在中斷中調(diào)用無等待獲得事件的情況都很少。嵌入式系統(tǒng)軟件設(shè)計(jì)互斥信號量互斥信號量 簡介 資源同步 函數(shù)列表 123互斥信號量互斥信號量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)簡介簡介 互斥信號量也稱為mutex,專用于資源同步?;コ庑盘柫烤哂幸恍┨匦裕赫加靡粋€(gè)空閑優(yōu)先級,以便解決優(yōu)先級反轉(zhuǎn)問題。 在日常生活中,出租車是一種常用的共享資源,當(dāng)出租車載客時(shí),從外面可以看到標(biāo)識為載客;當(dāng)空閑時(shí),標(biāo)識為空車。這樣等車的人就可以根據(jù)標(biāo)識知道出租車的當(dāng)前狀態(tài),判斷是否能夠座上這輛車。這個(gè)標(biāo)識牌就是一個(gè)二值信號量。由于這種二值信號量可以實(shí)現(xiàn)對共享資源的獨(dú)

54、占式處理,所以叫做互斥信號量。載客載客空車空車二值信號量可以實(shí)現(xiàn)對共享資源的獨(dú)占式處理互斥信號量 互斥信號量互斥信號量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)簡介簡介 優(yōu)先級列表任務(wù)1任務(wù)2任務(wù)3高低共享資源 假設(shè)任務(wù)1和任務(wù)3共享一個(gè)資源,任務(wù)2為優(yōu)先級介于任務(wù)1和任務(wù)3之間的一個(gè)與該共享資源無關(guān)任務(wù),分析優(yōu)先級反轉(zhuǎn)問題。任務(wù)2優(yōu)先級高于任務(wù)3而進(jìn)入運(yùn)行狀態(tài)任務(wù)1申請共享資源而處于等待狀態(tài)此時(shí),雖然任務(wù)1比任務(wù)2優(yōu)先級更高,但卻在任務(wù)2之后運(yùn)行,這種現(xiàn)象就是優(yōu)先級反轉(zhuǎn)。任務(wù)3得到共享資源而處于運(yùn)行狀態(tài)互斥信號量互斥信號量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)簡介簡介 綜上所述,可以

55、說能防止優(yōu)先級反轉(zhuǎn)現(xiàn)象的信號就是互斥信號量。優(yōu)先級列表互斥信號量任務(wù)1任務(wù)2任務(wù)3高低互斥信號量任務(wù)3互斥信號量 假設(shè)任務(wù)1和任務(wù)3共享一個(gè)資源,使用互斥信號量進(jìn)行資源同步,任務(wù)2為優(yōu)先級介于任務(wù)1和任務(wù)3之間的一個(gè)與該共享資源無關(guān)任務(wù),通過互斥信號量解決優(yōu)先級反轉(zhuǎn)問題。任務(wù)2優(yōu)先級不夠高無法獲得CPU任務(wù)1申請互斥信號量而處于等待狀態(tài)任務(wù)3此時(shí),任務(wù)2無法在任務(wù)1之前得到運(yùn)行,不發(fā)生優(yōu)先級反轉(zhuǎn)互斥信號量任務(wù)1任務(wù)3獲得CPU,且優(yōu)先級升到互斥信號量優(yōu)先級任務(wù)1獲得CPU,且優(yōu)先級升到互斥信號量優(yōu)先級3. 信號量最好在系統(tǒng)初始化的時(shí)候創(chuàng)建,不要在系統(tǒng)運(yùn)行的過程中動態(tài)地創(chuàng)建和刪除。在確保成功地創(chuàng)

56、建信號量之后,才可對信號量進(jìn)行接收和發(fā)送操作。1.在嵌入式系統(tǒng)中,經(jīng)常使用互斥信號量訪問共享資源來實(shí)現(xiàn)資源同步。而用來實(shí)現(xiàn)資源同步的互斥信號量在創(chuàng)建時(shí)初始化,這是由OSMutexCreate ()函數(shù)來實(shí)現(xiàn)的;互斥信號量互斥信號量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)簡介簡介 2. OSMutexPost ()發(fā)送互斥信號量函數(shù)與OSMutexPend ()等待互斥信號量函數(shù)必須成對出現(xiàn)在同一個(gè)任務(wù)調(diào)用的函數(shù)中,因此我們需要編寫一個(gè)公共的庫函數(shù),因?yàn)橛卸鄠€(gè)任務(wù)可能調(diào)用這個(gè)函數(shù) ; 使用互斥信號量有以下3點(diǎn)需要注意?;コ庑盘柫炕コ庑盘柫?| C/OS-II程序設(shè)計(jì)基礎(chǔ)程序設(shè)計(jì)基礎(chǔ)函數(shù)列表函

57、數(shù)列表 OSMutexQuery函數(shù)函數(shù)名稱函數(shù)名稱OSMutexQuery所屬文件OS_MUTEX.C函數(shù)原型函數(shù)原型INT8U OSMutexQuery (OS_EVENT *pevent, OS_MUTEX_DATA *pdata)功能描述功能描述取得互斥信號量的狀態(tài)取得互斥信號量的狀態(tài):用戶程序必須分配一個(gè)OS_MUTEX_DATA的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來從互斥信號量的事件控制塊接收數(shù)據(jù)。通過調(diào)用OSMutexQuery ()函數(shù)可以知道任務(wù)是否有其它任務(wù)等待互斥信號量,得到PIP,以及確認(rèn)互斥信號量是否有效函數(shù)參數(shù)函數(shù)參數(shù)pevent :指向互斥信號量的指針,OSMutexCreate

58、 ()的返回值pdata :指向OS_MUTEX_DATA數(shù)據(jù)結(jié)構(gòu)的指針,該數(shù)據(jù)結(jié)構(gòu)包含下述成員:OSValue: 0互斥信號量無效,1互斥信號量有效OSOwnerPrio:占用互斥信號量的任務(wù)優(yōu)先級OSMutexPIP:互斥信號量的優(yōu)先級繼承優(yōu)先級(PIP)OSEventTbl:互斥信號量等待隊(duì)列的拷貝OSEventGrp:互斥信號量等待隊(duì)列索引的拷貝函數(shù)返回值函數(shù)返回值OS_NO_ERR :調(diào)用成功OS_ERR_EVENT_TYPE :錯誤,pevent 不是指向互斥信號量的指針OS_ERR_PEVENT_NULL :錯誤,pevent為NULLOS_ERR_POST_ISR :在中斷中調(diào)

59、用該函數(shù)所引起的錯誤OSMutexCreate函數(shù)函數(shù)名稱OSMutexCreate所屬文件OS_MUTEX.C函數(shù)原型OS_EVENT *OSMutexCreate (INT8U prio, INT8U *err)功能描述建立并初始化一個(gè)互斥信號量建立并初始化一個(gè)互斥信號量函數(shù)參數(shù)prio:優(yōu)先級繼承值(PIP);err :用于返回錯誤碼函數(shù)返回值指向分配給所建立的互斥信號量的事件控制塊的指針。如果沒有可用的事件控制塊,則返回空指針。*err可能為以下值:OS_NO_ERR : 成功創(chuàng)建互斥信號量OS_ERR_CREATE_ISR :在中斷中調(diào)用該函數(shù)所引起的錯誤OS_PRIO_INVALI

60、D :錯誤,指定的優(yōu)先級非法OS_PRIO_EXIST :錯誤,指定的優(yōu)先級已經(jīng)有任務(wù)存在OS_ERR_PEVENT_NULL:錯誤,已經(jīng)沒有可用的事件控制塊OSMutexPend函數(shù)函數(shù)名稱OSMutexPend所屬文件OS_MUTEX.C函數(shù)原型void OSMutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)功能描述等待互斥信號量等待互斥信號量:當(dāng)互斥信號量有效時(shí),則直接返回;如果互斥信號量無效,則等待任務(wù)獲得互斥信號量后才能解除該等待狀態(tài)或在超時(shí)的情況下運(yùn)行函數(shù)參數(shù)pevent :指向互斥信號量的指針,OSMutexCreate ()的返回值timeout:超時(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論