




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、嵌入式系統(tǒng)軟件(x tn run jin)設(shè)計(jì)共一百三十八頁嵌入式系統(tǒng)軟件(x tn run jin)設(shè)計(jì)緒論(xln) 本章重點(diǎn)介紹C/OS-II V2.52版本嵌入式實(shí)時(shí)操作系統(tǒng)常用函數(shù)的基本用法,其最大的特點(diǎn)不僅示例程序簡潔明了,而且電路也非常簡單(如下圖),希望初學(xué)者一看就懂、一學(xué)就會(huì),達(dá)到快速入門的目的。注意:本章所有應(yīng)用示例都全部默認(rèn)采用這個(gè)圖,主要是為了盡量簡化示例程序,提高可讀性,使用簡單明了的語言和方法來解析復(fù)雜的理論知識(shí),這是作者在多年的學(xué)習(xí)、工作和教學(xué)中一直倡導(dǎo)的風(fēng)格和習(xí)慣性的行為,同時(shí)這也是寫作本書的出發(fā)點(diǎn)。硬件去抖共一百三十八頁目 錄任務(wù)(rn wu)設(shè)計(jì)系統(tǒng)函數(shù)使用
2、(shyng)場合系統(tǒng)函數(shù)概述時(shí)間管理事件的一般使用規(guī)則系統(tǒng)管理1互斥信號(hào)量信號(hào)量事件標(biāo)志組消息郵箱動(dòng)態(tài)內(nèi)存管理消息隊(duì)列23465789101211共一百三十八頁嵌入式系統(tǒng)軟件(x tn run jin)設(shè)計(jì)任務(wù)(rn wu)設(shè)計(jì)任務(wù)的分類任務(wù)的優(yōu)先級(jí)任務(wù)的劃分123共一百三十八頁任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)任務(wù)(rn wu)設(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ì)(shj)| C/OS-II程序設(shè)計(jì)基礎(chǔ)任務(wù)
3、(rn wu)的分類任務(wù)單次執(zhí)行類事件觸發(fā)類 周期執(zhí)行類按照?qǐng)?zhí)行方式分類共一百三十八頁任務(wù)(rn wu)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)任務(wù)(rn wu)的分類1.單次執(zhí)行類任務(wù)void MyTask (void *pdata) 進(jìn)行準(zhǔn)備工作的代碼; 任務(wù)實(shí)體代碼; 調(diào)用任務(wù)刪除函數(shù);運(yùn)行創(chuàng)建刪除單次執(zhí)行類任務(wù)定義和初始化變量及硬件設(shè)備 完成該任務(wù)的具體功能 將自己刪除,操作系統(tǒng)將不再管理它 共一百三十八頁任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)任務(wù)(rn wu)的分類執(zhí)行狀態(tài)等待狀態(tài)就緒狀態(tài)void MyTask (void *pdata) 進(jìn)行準(zhǔn)備工作的代碼; wh
4、ile (1) 任務(wù)實(shí)體代碼; 調(diào)用系統(tǒng)延時(shí)函數(shù); 延時(shí)時(shí)間到2.周期執(zhí)行類任務(wù)任務(wù)優(yōu)先級(jí)足夠高共一百三十八頁任務(wù)設(shè)計(jì)(shj)| C/OS-II程序設(shè)計(jì)基礎(chǔ)任務(wù)(rn wu)的分類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)等待狀態(tài)運(yùn)行狀態(tài)就緒狀態(tài) 任務(wù)優(yōu)先級(jí)足夠高消息完成具體功能共一百三十八頁任務(wù)設(shè)計(jì)| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)任務(wù)(rn wu)的劃分1.任務(wù)劃分的目標(biāo) 在對(duì)一個(gè)具體的嵌入式應(yīng)用系統(tǒng)進(jìn)行任務(wù)劃分時(shí),可以有不同的任務(wù)劃
5、分方案。為了選擇最佳劃分方案,就必須知道任務(wù)劃分的目標(biāo)。高效率的系統(tǒng)43211.首要目標(biāo)是滿足“實(shí)時(shí)性”指標(biāo):即使在最壞的情況下,系統(tǒng)中所有對(duì)實(shí)時(shí)性有要求的功能都能夠正常實(shí)現(xiàn);3.簡化軟件系統(tǒng):一個(gè)任務(wù)要實(shí)現(xiàn)其功能,除了需要操作系統(tǒng)的調(diào)度功能支持外,還需要操作系統(tǒng)的其它服務(wù)功能支持,合理劃分任務(wù),可以減少對(duì)操作系統(tǒng)的服務(wù)要求,簡化軟件系統(tǒng);4.降低資源需求:合理劃分任務(wù),減少或簡化任務(wù)之間的同步和通信需求,就可以減少相應(yīng)數(shù)據(jù)結(jié)構(gòu)的內(nèi)存規(guī)模,從而降低對(duì)系統(tǒng)資源的需求。2.任務(wù)數(shù)目合理:對(duì)于同一個(gè)應(yīng)用系統(tǒng),合理的合并一些任務(wù),使任務(wù)數(shù)目適當(dāng)少一些還是比較有利;共一百三十八頁任務(wù)(rn wu)設(shè)計(jì)|
6、 C/OS-II程序設(shè)計(jì)基礎(chǔ)任務(wù)(rn wu)的劃分2.任務(wù)劃分的方法 任務(wù)的劃分方法,請(qǐng)參考下一章“基于LPC2000的電腦自動(dòng)打鈴器設(shè)計(jì)與實(shí)現(xiàn)”。共一百三十八頁傳遞性:信息傳遞(chund)的上游任務(wù)的優(yōu)先級(jí)高于下游任務(wù)的優(yōu)先級(jí)。如信號(hào)采集任務(wù)的優(yōu)先級(jí)高于數(shù)據(jù)處理任務(wù)的優(yōu)先級(jí)。緊迫性:因?yàn)?yn wi)緊迫任務(wù)對(duì)響應(yīng)時(shí)間有嚴(yán)格要求,在所有緊迫任務(wù)中,按響應(yīng)時(shí)間要求排序,越緊迫的任務(wù)安排的優(yōu)先級(jí)越高。緊迫任務(wù)通常與ISR關(guān)聯(lián);關(guān)鍵性:任務(wù)越關(guān)鍵安排的優(yōu)先級(jí)越高,以保障其執(zhí)行機(jī)會(huì);中斷關(guān)聯(lián)性:與中斷服務(wù)程序(ISR)有關(guān)聯(lián)的任務(wù)應(yīng)該安排盡可能高的優(yōu)先級(jí),以便及時(shí)處理異步事件,提高系統(tǒng)的實(shí)時(shí)性。
7、如果優(yōu)先級(jí)安排得比較低,CPU有可能被優(yōu)先級(jí)比較高的任務(wù)長期占用,以致于在第二次中斷發(fā)生時(shí)連第一次中斷還沒有處理,產(chǎn)生信號(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ì)| C/OS-II程序設(shè)計(jì)基礎(chǔ)任務(wù)的優(yōu)先級(jí) 任務(wù)的優(yōu)先級(jí)安排原則如下: 緊迫性任務(wù)優(yōu)先級(jí) 關(guān)鍵性中斷關(guān)聯(lián)性快捷性頻繁性傳遞性共一百三十八頁嵌入式系統(tǒng)軟件(x tn run jin)設(shè)計(jì)系統(tǒng)函數(shù)(hnsh)概述基本原則系統(tǒng)函數(shù)的分類12共一百三十八
8、頁系統(tǒng)函數(shù)概述(i sh)| C/OS-II程序設(shè)計(jì)基礎(chǔ)基本(jbn)原則1.配對(duì)性原則 對(duì)于C/OS-II來說,大多數(shù)API都是成對(duì)的,而且一部分必須配對(duì)使用。當(dāng)然,查詢狀態(tài)的系統(tǒng)函數(shù)一般不需要配對(duì)使用,而且部分API如延時(shí),也不需要配對(duì)使用。配對(duì)的函數(shù)見下表。函數(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ā)送消息O
9、SQPend()等待消息隊(duì)列中的消息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()
10、給調(diào)度調(diào)度必須在一個(gè)任務(wù)中配對(duì)使用OS_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ì)使用。OS
11、TimeDlyHMSM()可能需要多個(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ù)(hnsh)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)基本(jbn)原則2.中斷服務(wù)程序調(diào)用函
12、數(shù)的限制 中斷服務(wù)程序不能調(diào)用可能會(huì)導(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)志位需要程序自己判斷是否獲得了相應(yīng)的事件
13、OSMboxPend()OSMboxAccept()無等待獲得消息郵箱中的消息OSMutexPend()OSMutexAccept()無等待獲得一個(gè)互斥信號(hào)量OSQPend()OSQAccept()無等待獲得息隊(duì)列中的消息OSSemPend()OSSemAccept()無等待獲得一個(gè)信號(hào)量共一百三十八頁系統(tǒng)函數(shù)概述(i sh)| C/OS-II程序設(shè)計(jì)基礎(chǔ)基本(jbn)原則1.創(chuàng)建事件和刪除事件的函數(shù)。 一些函數(shù)雖然沒有明確地規(guī)定不能被中斷服務(wù)程序調(diào)用,但因?yàn)橹袛喾?wù)程序的特性,一般不會(huì)使用。 2.與任務(wù)相關(guān)的函數(shù)OSTaskChangePrio() 、 OSTaskDelReq() 、OST
14、askStkChk() 和OSTaskQuery() 。至于函數(shù)OSSchedLock()和OSSchedUnlock(),在中斷服務(wù)程序中使用沒有任何意義。共一百三十八頁系統(tǒng)函數(shù)(hnsh)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)基本(jbn)原則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)行,這是通過調(diào)用部分系統(tǒng)函數(shù)來實(shí)現(xiàn)的,這些函數(shù)見下表。一般的任務(wù)必須調(diào)用表中至少一個(gè)函數(shù),只有一種情況例外,就是單次執(zhí)行的任務(wù),因?yàn)槿蝿?wù)刪除后肯定出讓CPU,所以可以不調(diào)用表中的函數(shù)。函數(shù)名功能函數(shù)名功能OSF
15、lagPend等待事件標(biāo)志組的事件標(biāo)志位OSMutexPend等待一個(gè)互斥信號(hào)量OSQPend等待消息隊(duì)列中的消息OSQPend等待消息隊(duì)列中的消息OSSemPend等待一個(gè)信號(hào)量OSTaskSuspend 掛起任務(wù)OSTimeDly延時(shí)OSTimeDlyHMSM延時(shí)共一百三十八頁一般的操作系統(tǒng)(co zu x tn)都提供時(shí)間管理的函數(shù),最基本的就是延時(shí)函數(shù),C/OS-II也不例外,C/OS-II所具有的時(shí)間管理函數(shù)見下表。C/OS-II具有簡單的動(dòng)態(tài)內(nèi)存管理(gunl)能力。C/OS-II的動(dòng)態(tài)內(nèi)存管理函數(shù)見下表。任務(wù)管理函數(shù)是操作與任務(wù)相關(guān)功能的函數(shù),詳見下表。系統(tǒng)管理函數(shù)是一些與C/O
16、S-II內(nèi)核或功能相關(guān)的一些函數(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ù)啟動(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ù)概述| C/OS-II程序設(shè)計(jì)基礎(chǔ)系統(tǒng)函數(shù)的分類初始化任務(wù)管理時(shí)間管
17、理內(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)度器必須配對(duì)使用,一般情況不需要使用。事實(shí)上,C/OS-II不推薦使用它們OSSchedUnlock()解鎖調(diào)度器OS_ENTER_CRITICAL()進(jìn)入臨界區(qū)必須配對(duì)使用,一般通過禁止中斷和允許中斷來實(shí)現(xiàn)的。對(duì)于一些移植代碼來說,不能嵌套調(diào)用OS_EXIT_CRITI
18、CAL()退出臨界區(qū)函數(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)管理函數(shù)名功能備注OSTimeDly()以時(shí)鐘節(jié)拍為單位延時(shí)OSTimeDlyHMSM()以鐘時(shí)分秒毫秒為單位延時(shí)OSTimeDlyResume()恢
19、復(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)軟件(x tn run jin)設(shè)計(jì)系統(tǒng)函數(shù)使用(shyng)場合時(shí)間管理行為同步資源同步123共一百三十八頁系統(tǒng)函數(shù)(hnsh)使用場合| C/OS-II程
20、序設(shè)計(jì)基礎(chǔ)時(shí)間(shjin)管理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)用OSTimeDlyHMSM(0,1,27,620)的實(shí)際
21、時(shí)間是延時(shí)1分27秒600毫秒。 在任務(wù)函數(shù)的代碼中可以通過插入延時(shí)函數(shù)來控制任務(wù)周期性運(yùn)行,定時(shí)閑置CPU一段時(shí)間,供其它任務(wù)使用。 共一百三十八頁系統(tǒng)(xtng)函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)時(shí)間(shjin)管理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)的任務(wù)函數(shù)實(shí)現(xiàn)。調(diào)用OSTimeD
22、ly( )或OSTimeDlyHMSM( ) 調(diào)用OSTimeDly( )或OSTimeDlyHMSM( ) 等待信號(hào)量、消息其他任務(wù)代碼無限循環(huán)共一百三十八頁系統(tǒng)函數(shù)(hnsh)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)時(shí)間(shjin)管理3.狀態(tài)查詢 查詢過程是一個(gè)無限循環(huán)過程,只有當(dāng)希望的狀態(tài)出現(xiàn)以后才能退出這個(gè)無限循環(huán),這種情況在實(shí)時(shí)操作系統(tǒng)管理下是不允許的,它將剝奪低優(yōu)先級(jí)任務(wù)的運(yùn)行機(jī)會(huì)。解決這個(gè)問題的辦法是“用定時(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í)查詢條件是否成立無限循環(huán)共一百三十八頁系統(tǒng)(xtng)函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)資源(zyun)同步共享資源臨界區(qū)訪問共享資源臨界區(qū)訪問共享資源等待共享資源申請(qǐng)共享資源.申請(qǐng)共享資源.任務(wù)1任務(wù)2釋放臨界區(qū)互斥,保證共享資源的完整性和可靠性釋放1.“資源同步”圖解共一百三十八頁1.使用關(guān)中斷:通過調(diào)用禁止中斷函數(shù)OS_ENTER_CRITICAL()和允許(ynx)中斷函數(shù)OS_EXIT_CRITICAL()實(shí)現(xiàn)的。2.使用關(guān)調(diào)度:通過調(diào)用(dioyng)禁止任務(wù)調(diào)度函數(shù)OS
24、SchedLock()和允許任務(wù)調(diào)度函數(shù)OSSchedUnlock()實(shí)現(xiàn)的,因?yàn)榻拐{(diào)度違背了多任務(wù)的初衷,所以不建議用戶使用。3.使用信號(hào)量與互斥信號(hào)量:通過等待信號(hào)量和發(fā)送信號(hào)量實(shí)現(xiàn)共享資源的獨(dú)享。系統(tǒng)函數(shù)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)資源同步2.“資源同步” 實(shí)現(xiàn)方式 321共一百三十八頁系統(tǒng)函數(shù)使用(shyng)場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)行為(xngwi)同步消息收到消息.等待消息.任務(wù)1任務(wù)2發(fā)送消息 一個(gè)任務(wù)的運(yùn)行過程需要和其它任務(wù)的運(yùn)行配合,才能達(dá)到預(yù)定的效果,任務(wù)之間的這種動(dòng)作配合和協(xié)調(diào)關(guān)系稱為“行為同步”。 任務(wù)優(yōu)先級(jí)足夠高1.行為同步 信號(hào)量事件標(biāo)志組消息
25、郵箱消息隊(duì)列任務(wù)之間的通訊同步共一百三十八頁系統(tǒng)函數(shù)(hnsh)使用場合| C/OS-II程序設(shè)計(jì)基礎(chǔ)行為(xngwi)同步2.數(shù)據(jù)通信 數(shù)據(jù)通訊時(shí)是否需要遵守“資源同步”規(guī)則 數(shù)據(jù)通訊的同時(shí)是否具有“行為同步” 功能消息郵箱不需要有消息隊(duì)列 不需要有全局變量需要無注意:盡管指針可能是局部變量,但只要指針指向的變量是全局變量,操作指針指向的變量時(shí)也需要當(dāng)作全局變量來處理。共一百三十八頁嵌入式系統(tǒng)軟件(x tn run jin)設(shè)計(jì)時(shí)間(shjin)管理系統(tǒng)延時(shí)函數(shù)OSTimeDly()強(qiáng)制延時(shí)的任務(wù)結(jié)束延時(shí)OSTimeDlyResume() 系統(tǒng)延時(shí)函數(shù)OSTimeDlyHMSM()123獲得
26、系統(tǒng)時(shí)間OSTimeGet()和設(shè)置系統(tǒng)時(shí)間OSTimeSet() 4共一百三十八頁時(shí)間管理| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)概述(i sh) C/OS-II提供了若干個(gè)時(shí)間管理服務(wù)函數(shù),可以滿足任務(wù)在運(yùn)行過程中對(duì)時(shí)間管理的需求。在使用時(shí)間管理服務(wù)函數(shù)時(shí),必須十分清楚一個(gè)事實(shí):時(shí)間管理服務(wù)函數(shù)是以系統(tǒng)節(jié)拍為處理單位的,實(shí)際的時(shí)間與希望的時(shí)間是有誤差的,最壞的情況下誤差接近一個(gè)系統(tǒng)節(jié)拍。因此時(shí)間管理服務(wù)函數(shù)只能用在對(duì)時(shí)間精度要求不高的場合,或者時(shí)間間隔較長的場合。 共一百三十八頁時(shí)間管理| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)OSTimeDly()系統(tǒng)延時(shí)函數(shù)(
27、hnsh)OSTimeDly()調(diào)用圖解任務(wù)進(jìn)入運(yùn)行狀態(tài)進(jìn)入延時(shí),同時(shí)發(fā)生任務(wù)調(diào)度任務(wù)調(diào)用OSTimeDly()任務(wù)進(jìn)入就緒狀態(tài) 當(dāng)前任務(wù)優(yōu)先級(jí)為就緒態(tài)中最高延時(shí)時(shí)間到延時(shí)的長短是由時(shí)鐘節(jié)拍的數(shù)目來確定共一百三十八頁時(shí)間(shjin)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)OSTimeDly() 下面我們?cè)O(shè)計(jì)一個(gè)任務(wù),讓一個(gè)LED以50個(gè)時(shí)鐘節(jié)拍為單位閃耀,說明OSTimeDly()函數(shù)的用途。由于篇幅關(guān)系,只給出任務(wù)主要處理(chl)代碼。void TaskLED (void *pdata) while (1) IO0CLR = LED1; OSTimeDly(25); IO0SET = LED1
28、; 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í)間(shjin)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)OSTimeDlyHMSM()函數(shù)名稱OSTimeDlyHMSM所屬文件OS_TIMC.C函數(shù)原型INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)功能描述延時(shí),指定的延時(shí)時(shí)間為時(shí)、分、秒、毫秒函數(shù)參數(shù)hour
29、s:小時(shí),minutes:分鐘,seconds:秒,milli:毫秒函數(shù)返回值OS_TIME_INVALID_MINUTES:minutes參數(shù)錯(cuò)誤OS_TIME_INVALID_SECONDS:seconds參數(shù)錯(cuò)誤OS_TIME_INVALID_MILLI:milli參數(shù)錯(cuò)誤特殊說明(1) 所有參數(shù)為0時(shí)不延時(shí),函數(shù)直接返回(2) 必須正確設(shè)置全局常數(shù)OS_TICKS_PER_SEC,否則延時(shí)時(shí)間是錯(cuò)誤的(3) 因?yàn)镺STimeDlyHMSM()是通過多次(或1次)調(diào)用OSTimeDly()實(shí)現(xiàn)的,所以延時(shí)分辨率為時(shí)鐘節(jié)拍(4) 因?yàn)镺STimeDlyHMSM()是通過多次(或1次)調(diào)用O
30、STimeDly()實(shí)現(xiàn)的,所以可能需要調(diào)用多次OSTimeDlyResume()才能恢復(fù)延時(shí)的任務(wù) C/OS-提供(tgng)了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í)原理和調(diào)用延時(shí)函數(shù)OSTimeDly()是一樣的。OSTimeDlyHMSM()詳細(xì)見下表。共一百三十八頁時(shí)間管理(gunl)| C/OS-II程序設(shè)計(jì)基礎(chǔ)OSTimeDlyHMSM() 為了說明OSTimeDlyHMSM()函數(shù)的使用方法
31、,下面我們?cè)O(shè)計(jì)一個(gè)任務(wù),讓一個(gè)LED以2Hz的頻率(pnl)閃耀。下面給出任務(wù)主要處理代碼。void TaskLED (void *pdata) while (1) IO0CLR = LED1; OSTimeDlyHMSM(0, 0, 0, 250); IO0SET = LED1; OSTimeDlyHMSM(0, 0, 0, 250); 250ms延時(shí)循壞控制LED以固定頻率閃爍點(diǎn)亮LED250ms延時(shí)熄滅LED初始化代碼注意:上面的設(shè)計(jì)是OSTimeDlyHMSM()控制任務(wù)的周期性執(zhí)行,還可以用它來控制任務(wù)的運(yùn)行節(jié)拍。共一百三十八頁時(shí)間管理| C/OS-II程序設(shè)計(jì)(chn x sh j
32、)基礎(chǔ)OSTimeDlyResume() 任務(wù)進(jìn)入運(yùn)行狀態(tài)任務(wù)調(diào)用延時(shí)函數(shù)任務(wù)進(jìn)入就緒狀態(tài) 當(dāng)前任務(wù)優(yōu)先級(jí)為就緒(jix)態(tài)中最高調(diào)用OSTimeDlyResume()延時(shí)期 C/OS-允許用戶結(jié)束正處于延時(shí)期的任務(wù),延時(shí)的任務(wù)可以不等待延時(shí)期滿,而是通過取消其它任務(wù)的延時(shí)來使自己處于就緒態(tài),可以通過調(diào)用OSTimeDlyResume()和指定要恢復(fù)的任務(wù)的優(yōu)先級(jí)來完成。共一百三十八頁時(shí)間管理| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)OSTimeDlyResume() 函數(shù)名稱OSTimeDlyResume所屬文件OS_TIMC.C函數(shù)原型INT8U OSTimeDlyResume
33、(INT8U prio)功能描述讓延時(shí)的任務(wù)結(jié)束延時(shí)函數(shù)參數(shù)prio:任務(wù)優(yōu)先級(jí)函數(shù)返回值OS_NO_ERR:成功,OS_PRIO_INVALID:prio錯(cuò)誤OS_TIME_NOT_DLY:任務(wù)沒有延時(shí),OS_TASK_NOT_EXIST:任務(wù)不存在特殊說明因?yàn)镺STimeDlyHMSM()是通過多次(或1次)調(diào)用OSTimeDly()實(shí)現(xiàn)的,所以可能需要調(diào)用多次OSTimeDlyResume()才能恢復(fù)延時(shí)的任務(wù) OSTimeDlyResume()的具體(jt)信息見下表。 共一百三十八頁時(shí)間管理(gunl)| C/OS-II程序設(shè)計(jì)基礎(chǔ)OSTimeDlyResume() 為了說明OSTi
34、meDlyResume()函數(shù)的使用方法(fngf),我們?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í)間(shjin)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)OSTimeDlyResume() TaskLED任務(wù)代碼(di m)如下。void TaskLED (void *pdata) while (1) IO0CLR = LED1; OSTimeDly(OS_TICKS_PER_SEC); IO0SET = LED1; OSTimeDly (OS_TICKS_PER_SEC); 1
35、s延時(shí)循壞控制LED以固定頻率閃爍點(diǎn)亮LED1s延時(shí)熄滅LED初始化代碼共一百三十八頁時(shí)間管理(gunl)| C/OS-II程序設(shè)計(jì)基礎(chǔ)OSTimeDlyResume() TaskKEY任務(wù)(rn wu)的代碼如下。void TaskKEY (void *pdata) while (1) while (IO0PIN & 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)先級(jí)為2,恢
36、復(fù)TaskLED初始化代碼共一百三十八頁4,294,967,295 調(diào)用(dioyng)OSStart()時(shí)初始化計(jì)數(shù)器為0 計(jì)數(shù)器滿時(shí)從0開始(kish)計(jì)數(shù) 1324.4,294,967,294 時(shí)間管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() 無論時(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開始計(jì)數(shù)。 發(fā)生時(shí)鐘節(jié)拍32位計(jì)數(shù)器共一百三十八頁12n.時(shí)間(shjin)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeS
37、et() 發(fā)生(fshng)時(shí)鐘節(jié)拍32位計(jì)數(shù)器 用戶可以通過調(diào)用OSTimeGet()來獲得該計(jì)數(shù)器的當(dāng)前值, OSTimeGet()的詳細(xì)信息見下表。函數(shù)名稱OSTimeGet所屬文件OS_TIMC.C函數(shù)原型INT32U OSTimeGet(void)功能描述獲得系統(tǒng)時(shí)間函數(shù)參數(shù)prio:任務(wù)優(yōu)先級(jí)函數(shù)返回值系統(tǒng)時(shí)間ticks = n;調(diào)用OSTimeGet()ticks = OSTimeGet();return(n)共一百三十八頁時(shí)間管理| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)OSTimeGet()、OSTimeSet() 101102n.發(fā)生時(shí)鐘(shzhng)節(jié)拍32
38、位計(jì)數(shù)器調(diào)用OSTimeSet(101) 設(shè)置計(jì)數(shù)器值為101 用戶可以通過調(diào)用OSTimeSet()來改變計(jì)數(shù)器的值,OSTimeSet()的詳細(xì)信息見下表。 函數(shù)名稱OSTimeSet所屬文件OS_TIMC.C函數(shù)原型void OSTimeSet(INT32U ticks)功能描述設(shè)置系統(tǒng)時(shí)間函數(shù)參數(shù)ticks:需要設(shè)置的值函數(shù)返回值無特殊說明很少使用 共一百三十八頁時(shí)間管理(gunl)| C/OS-II程序設(shè)計(jì)基礎(chǔ)OSTimeGet()、OSTimeSet() 為了說明OSTimeGet()函數(shù)的使用方法,我們(w men)設(shè)計(jì)一個(gè)任務(wù),計(jì)算兩次按鍵的時(shí)間間隔放在全局變量ktime中。下
39、面是任務(wù)的處理流程。共一百三十八頁時(shí)間管理| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)OSTimeGet()、OSTimeSet() TaskKEY任務(wù)(rn wu)代碼如下。void TaskKEY (void *pdata) while (1) while (IO0PIN & KEY1) != 0) OSTimeDly(1); ktime = OSTimeGet() - ktime; while (IO0PIN & KEY1) = 0) OSTimeDly(1); 延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換延時(shí)1個(gè)節(jié)拍,用于任務(wù)切換等待按健按下等待按健釋放獲得按鍵間隔時(shí)間初始化代碼共一百三十八頁
40、嵌入式系統(tǒng)軟件(x tn run jin)設(shè)計(jì)系統(tǒng)管理進(jìn)入(jnr)然后退出臨界區(qū)禁止然后允許調(diào)度12共一百三十八頁CPU共享進(jìn)入臨界段OS_ENTER_CRITICAL()CPU共享退出臨界段OS_EXIT_CRITICAL() 當(dāng)前任務(wù)獨(dú)占CPU 其他任何任務(wù)和中斷都無法得到CPU,直到退出臨界(ln ji)段。保證了臨界(ln ji)段代碼的運(yùn)行完整性系統(tǒng)管理| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)進(jìn)入然后退出臨界區(qū) 進(jìn)入然后退出臨界段是“資源同步”的方法之一,能夠在訪問共享資源時(shí)保障信息的可靠性和完整性。共一百三十八頁 為了說明它在”資源同步”時(shí)的使用,我們?cè)O(shè)計(jì)一個(gè)系統(tǒng),
41、假設(shè)有兩個(gè)任務(wù),它們都對(duì)全局變量sum1和sum2操作。低優(yōu)先級(jí)任務(wù)讓這兩個(gè)變量始終相等,并不斷(bdun)在計(jì)數(shù);高優(yōu)先級(jí)任務(wù)不斷(bdun)的判斷這兩個(gè)變量是否相等,不相等則點(diǎn)亮LED,下面是兩個(gè)任務(wù)的處理流程。系統(tǒng)管理| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)進(jìn)入然后退出臨界區(qū)共一百三十八頁TaskLED任務(wù)代碼(di m)如下。void TaskLED (void *pdata) while (1) OS_ENTER_CRITICAL(); if (sum1 != sum2) IO0CLR = LED1; OS_EXIT_CRITICAL(); OSTimeDly(2);
42、判斷兩個(gè)全局變量是否相等延時(shí)2個(gè)節(jié)拍,任務(wù)切換進(jìn)入臨界段退出臨界段兩個(gè)全局變量不等,點(diǎn)亮LED初始化代碼系統(tǒng)管理| C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)進(jìn)入然后退出臨界區(qū)共一百三十八頁TaskAdd任務(wù)代碼(di m)如下。void 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)管理| C/OS-II程序設(shè)計(jì)(chn x sh j)
43、基礎(chǔ)進(jìn)入然后退出臨界區(qū)共一百三十八頁3.調(diào)用OSSchedLock()以后,用戶的應(yīng)用程序不得使用任何能將現(xiàn)行(xinxng)任務(wù)掛起的系統(tǒng)調(diào)用,直到配對(duì)的OSSchedUnlock()調(diào)用為止。 1. OSSchedlock()和OSSchedUnlock()必須(bx)成對(duì)使用,也可以嵌套使用; 2. OSSchedlock()只是禁止了任務(wù)的調(diào)度,而沒有禁止中斷,此時(shí)如果允許中斷,中斷到來時(shí)還是會(huì)執(zhí)行對(duì)應(yīng)的中斷服務(wù)程序;系統(tǒng)管理| C/OS-II程序設(shè)計(jì)基礎(chǔ)禁止然后允許調(diào)度注意:對(duì)于用戶來說,極少使用禁止然后允許調(diào)度的方法。不過,很多操作系統(tǒng)內(nèi)部和驅(qū)動(dòng)程序使用它來減少中斷響應(yīng)時(shí)間。 給調(diào)
44、度器上鎖OSSchedlock()函數(shù)用于禁止任務(wù)調(diào)度,直到任務(wù)完成后調(diào)用給調(diào)度器開鎖OSSchedUnlock()函數(shù)為止。使用它有3點(diǎn)需要注意。 321共一百三十八頁嵌入式系統(tǒng)軟件(x tn run jin)設(shè)計(jì)事件的一般(ybn)使用規(guī)則 相似性配對(duì)使用先創(chuàng)建后使用123在ISR中使用4共一百三十八頁事件的一般使用(shyng)規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)相似性 事件管理函數(shù)是C/OS-II中最多的系統(tǒng)函數(shù),在C/OS-II V2.52中總共有34個(gè),而且每種事件具有的管理函數(shù)數(shù)目不同(b tn)。但是所有的事件都有類似的6個(gè)函數(shù),它們是所有事件的基本功能,其函數(shù)名類似,使用方法
45、也類似,詳細(xì)函數(shù)見下表。功能信號(hào)量互斥信號(hào)量事件標(biāo)志組消息郵箱消息隊(duì)列建立事件OSSemCreateOSMutexCreateOSFlagCreateOSMboxCreateOSQCreate刪除事件OSSemDelOSMutexDelOSFlagDelOSMboxDelOSQDel等待事件OSSemPendOSMutexPendOSFlagPendOSMboxPendOSQPend發(fā)送事件OSSemPostOSMutexPostOSFlagPostOSMboxPostOSQPost無等待獲得事件OSSemAcceptOSMutexAcceptOSFlagAcceptOSMboxAcceptO
46、SQAccept查詢事件狀態(tài)OSSemQueryOSMutexQueryOSFlagQueryOSMboxQueryOSQQuery另外還有4個(gè)事件管理函數(shù)為OSMboxPostOpt()、OSQPostFront()、 OSQPostOpt()、 OSQFlush(),各函數(shù)詳見后面章節(jié)。共一百三十八頁事件(shjin)的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)基礎(chǔ)先創(chuàng)建(chungjin)后使用 任何一個(gè)事件,必須先創(chuàng)建后使用。創(chuàng)建事件是通過調(diào)用函數(shù)OS?Create()實(shí)現(xiàn)的,其中?為事件的類型。創(chuàng)建事件可以在main()函數(shù)中,但更多的是在任務(wù)初始化部分。使用方法如下。OS_EVENT
47、 *event; void Task0(void *pdata) pdata = pdata; event = OS?Create(); while (1) /* 其它代碼 */ 定義事件防止編譯器報(bào)警創(chuàng)建事件共一百三十八頁事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)先創(chuàng)建(chungjin)后使用 一般來說,在嵌入式系統(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 = pda
48、ta; while (1) event = OS?Create(); /* 其它代碼 */ OS?Del(event,); 定義事件防止編譯器報(bào)警創(chuàng)建事件刪除事件刪除事件后不要再使用它配對(duì)使用共一百三十八頁事件的一般使用規(guī)則 | C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ) 由前面介紹可知,事件是動(dòng)態(tài)使用時(shí),建立事件和刪除事件必須配對(duì)使用。下面(xi mian)給出一個(gè)示例,假設(shè)Task0為高優(yōu)先級(jí)任務(wù),Task1為低優(yōu)先級(jí)任務(wù)。 Task0代碼如下。 配對(duì)使用OS_EVENT *event;void Task0(void *pdata) pdata = pdata; event = O
49、S?Create(); while (1) OS?Pend(event,); /* 其它代碼 */ 定義事件防止編譯器報(bào)警創(chuàng)建事件等待獲得事件無等待獲得事件OS?Accept()是等待事件的一種特殊形式,有事件時(shí)它與等待事件沒有差別,沒有事件時(shí),它不等待,直接返回錯(cuò)誤信息。 因?yàn)橐呀?jīng)具有無等待獲得事件的功能,所以很少使用查詢功能OSSemQuery()。共一百三十八頁事件的一般使用規(guī)則(guz) | C/OS-II程序設(shè)計(jì)基礎(chǔ) Task1代碼(di m)如下。配對(duì)使用void Task1(void *pdata) pdata = pdata; while (1) /* 其它代碼 */ OS?P
50、ost(event,); /* 其它代碼 */ 防止編譯器報(bào)警發(fā)送事件注意:一些事件有多個(gè)發(fā)送事件的函數(shù),消息郵箱除OSMboxPost()外,還有增強(qiáng)型發(fā)送函數(shù)OSMboxPostOpt(),消息隊(duì)列有OSQPost()、OSQPostFront()、 OSQPostOpt()三種發(fā)送函數(shù),各函數(shù)詳見后面章節(jié)。共一百三十八頁事件的一般使用規(guī)則(guz) | C/OS-II程序設(shè)計(jì)基礎(chǔ)在ISR中使用(shyng)中斷服務(wù)程序不能等待中斷服務(wù)程序總體是順序結(jié)構(gòu)中斷與所有的任務(wù)異步中斷服務(wù)程序需要盡快退出中斷特點(diǎn)1324 要掌握事件 函數(shù)在中斷服務(wù)程序中的調(diào)用規(guī)則,我們必須清楚中斷服務(wù)有哪些特點(diǎn)。
51、共一百三十八頁事件的一般使用規(guī)則(guz) | C/OS-II程序設(shè)計(jì)基礎(chǔ)在ISR中使用(shyng) 下面給出事件在中斷服務(wù)程序中使用方法,假設(shè)Task0任務(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ī)則(guz) | C/OS-II程序設(shè)計(jì)基礎(chǔ)在ISR中使用(shyng) ISR中的代碼如下。void
52、 ISR(void) /* 其它代碼 */ OS?Post(event,); /* 其它代碼 */發(fā)送事件注意:中斷服務(wù)程序一般不會(huì)調(diào)用建立和刪除事件函數(shù),否則要么沒有起到事件的作用,要么程序很復(fù)雜;中斷服務(wù)程序不能調(diào)用等待事件的函數(shù),否則可能造成程序崩潰,可以調(diào)用無等待獲得事件函數(shù)獲得信號(hào),但事實(shí)上,在中斷中調(diào)用無等待獲得事件的情況都很少。共一百三十八頁嵌入式系統(tǒng)軟件(x tn run jin)設(shè)計(jì)互斥信號(hào)量 簡介(jin ji) 資源同步 函數(shù)列表 123共一百三十八頁互斥信號(hào)量 | C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)簡介(jin ji) 互斥信號(hào)量也稱為mutex,專用于
53、資源同步?;コ庑盘?hào)量具有一些特性:占用一個(gè)空閑優(yōu)先級(jí),以便解決優(yōu)先級(jí)反轉(zhuǎn)問題。 在日常生活中,出租車是一種常用的共享資源,當(dāng)出租車載客時(shí),從外面可以看到標(biāo)識(shí)為載客;當(dāng)空閑時(shí),標(biāo)識(shí)為空車。這樣等車的人就可以根據(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)量 | C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)簡介(jin ji) 優(yōu)先級(jí)列表任務(wù)1任務(wù)2任務(wù)3高低共享資源 假設(shè)任務(wù)1和任務(wù)3共享一個(gè)資源,任務(wù)2
54、為優(yōu)先級(jí)介于任務(wù)1和任務(wù)3之間的一個(gè)與該共享資源無關(guān)任務(wù),分析優(yōu)先級(jí)反轉(zhuǎ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í)反轉(zhuǎn)。任務(wù)3得到共享資源而處于運(yùn)行狀態(tài)共一百三十八頁互斥信號(hào)量 | C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)簡介(jin ji) 綜上所述,可以說能防止優(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è)與該共享
55、資源無關(guān)任務(wù),通過互斥信號(hào)量解決優(yōu)先級(jí)反轉(zhuǎn)問題。任務(wù)2優(yōu)先級(jí)不夠高無法獲得CPU任務(wù)1申請(qǐng)互斥信號(hào)量而處于等待狀態(tài)任務(wù)3此時(shí),任務(wù)2無法在任務(wù)1之前得到運(yùn)行,不發(fā)生優(yōu)先級(jí)反轉(zhuǎn)互斥信號(hào)量任務(wù)1任務(wù)3獲得CPU,且優(yōu)先級(jí)升到互斥信號(hào)量優(yōu)先級(jí)任務(wù)1獲得CPU,且優(yōu)先級(jí)升到互斥信號(hào)量優(yōu)先級(jí)共一百三十八頁3. 信號(hào)量最好在系統(tǒng)初始化的時(shí)候創(chuàng)建,不要在系統(tǒng)運(yùn)行的過程中動(dòng)態(tài)地創(chuàng)建和刪除。在確保成功地創(chuàng)建信號(hào)量之后,才可對(duì)信號(hào)量進(jìn)行(jnxng)接收和發(fā)送操作。1.在嵌入式系統(tǒng)中,經(jīng)常使用互斥信號(hào)量訪問共享資源來實(shí)現(xiàn)資源同步。而用來實(shí)現(xiàn)資源同步的互斥信號(hào)量在創(chuàng)建(chungjin)時(shí)初始化,這是由OSMute
56、xCreate ()函數(shù)來實(shí)現(xiàn)的;互斥信號(hào)量 | C/OS-II程序設(shè)計(jì)基礎(chǔ)簡介 2. OSMutexPost ()發(fā)送互斥信號(hào)量函數(shù)與OSMutexPend ()等待互斥信號(hào)量函數(shù)必須成對(duì)出現(xiàn)在同一個(gè)任務(wù)調(diào)用的函數(shù)中,因此我們需要編寫一個(gè)公共的庫函數(shù),因?yàn)橛卸鄠€(gè)任務(wù)可能調(diào)用這個(gè)函數(shù) ;321 使用互斥信號(hào)量有以下3點(diǎn)需要注意。共一百三十八頁互斥信號(hào)量 | C/OS-II程序設(shè)計(jì)(chn x sh j)基礎(chǔ)函數(shù)(hnsh)列表 OSMutexQuery函數(shù)函數(shù)名稱OSMutexQuery所屬文件OS_MUTEX.C函數(shù)原型INT8U OSMutexQuery (OS_EVENT *pevent
57、, OS_MUTEX_DATA *pdata)功能描述取得互斥信號(hào)量的狀態(tài):用戶程序必須分配一個(gè)OS_MUTEX_DATA的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來從互斥信號(hào)量的事件控制塊接收數(shù)據(jù)。通過調(diào)用OSMutexQuery ()函數(shù)可以知道任務(wù)是否有其它任務(wù)等待互斥信號(hào)量,得到PIP,以及確認(rèn)互斥信號(hào)量是否有效函數(shù)參數(shù)pevent :指向互斥信號(hào)量的指針,OSMutexCreate ()的返回值pdata :指向OS_MUTEX_DATA數(shù)據(jù)結(jié)構(gòu)的指針,該數(shù)據(jù)結(jié)構(gòu)包含下述成員:OSValue: 0互斥信號(hào)量無效,1互斥信號(hào)量有效OSOwnerPrio:占用互斥信號(hào)量的任務(wù)優(yōu)先級(jí)OSMutexPIP:互斥信
58、號(hào)量的優(yōu)先級(jí)繼承優(yōu)先級(jí)(PIP)OSEventTbl:互斥信號(hào)量等待隊(duì)列的拷貝OSEventGrp:互斥信號(hào)量等待隊(duì)列索引的拷貝函數(shù)返回值OS_NO_ERR :調(diào)用成功OS_ERR_EVENT_TYPE :錯(cuò)誤,pevent 不是指向互斥信號(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)功能描述建立并初始化一
59、個(gè)互斥信號(hào)量函數(shù)參數(shù)prio:優(yōu)先級(jí)繼承值(PIP);err :用于返回錯(cuò)誤碼函數(shù)返回值指向分配給所建立的互斥信號(hào)量的事件控制塊的指針。如果沒有可用的事件控制塊,則返回空指針。*err可能為以下值:OS_NO_ERR : 成功創(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)沒有可用的事件控制塊OSMutexPend函數(shù)函數(shù)名稱OSMutexPend所屬文件OS_MUTEX.C函數(shù)原型void OS
60、MutexPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)功能描述等待互斥信號(hào)量:當(dāng)互斥信號(hào)量有效時(shí),則直接返回;如果互斥信號(hào)量無效,則等待任務(wù)獲得互斥信號(hào)量后才能解除該等待狀態(tài)或在超時(shí)的情況下運(yùn)行函數(shù)參數(shù)pevent :指向互斥信號(hào)量的指針,OSMutexCreate ()的返回值timeout:超時(shí)時(shí)間,以時(shí)鐘節(jié)拍為單位;err:用于返回錯(cuò)誤碼函數(shù)返回值*err可能為以下值:OS_NO_ERR :調(diào)用成功OS_ERR_EVENT_TYPE :pevent 不是指向互斥信號(hào)量的指針OS_ERR_PEVENT_NULL :錯(cuò)誤,pevent
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度企業(yè)年報(bào)封面協(xié)議封皮圖片制作合同
- 商業(yè)空間內(nèi)部裝修承包合同
- 2025年江漢藝術(shù)職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫新版
- 2025年度文化創(chuàng)意產(chǎn)業(yè)資金托管合同
- 2025年農(nóng)村土地承包經(jīng)營權(quán)流轉(zhuǎn)合同模板
- 2025年度抖音短視頻內(nèi)容原創(chuàng)保護(hù)與維權(quán)合同
- 2025年度房產(chǎn)購房意向金確認(rèn)書
- 2025年度手工藝非物質(zhì)文化遺產(chǎn)保護(hù)合同
- 2025年度房產(chǎn)抵押債務(wù)清償與產(chǎn)權(quán)變更及資產(chǎn)處置合同
- 2025年度藝術(shù)培訓(xùn)機(jī)構(gòu)與電商平臺(tái)合作協(xié)議
- 非公開發(fā)行公司債券的法律意見書模版
- 汽車空調(diào)技術(shù)與維修教案
- 企業(yè)管理概論-課件全書課件完整版ppt全套教學(xué)教程最全電子教案電子講義(最新)
- 圍手術(shù)期肺部感染
- 餐飲服務(wù)食品安全監(jiān)督量化分級(jí)動(dòng)態(tài)等級(jí)評(píng)定檢查表
- 北師大版語文選修《蕭蕭》ppt課件1
- 大學(xué)生職業(yè)素養(yǎng)課件-5第五單元學(xué)會(huì)有效溝通-PPT課件
- 《談骨氣》課文閱讀(共2頁)
- 病原生物與免疫學(xué)(中職)緒論P(yáng)PT課件
- 新起點(diǎn)小學(xué)英語一年級(jí)上冊(cè)單詞卡片(共23頁)
- 蝴蝶蘭PPT課件
評(píng)論
0/150
提交評(píng)論