找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 4092|回復: 0
打印 上一主題 下一主題
收起左側

uC/OS-II任務間的同步通信

[復制鏈接]
跳轉到指定樓層
樓主
ID:51024 發(fā)表于 2014-8-10 12:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    當你開始去學習uC/OS-ii的時候,心里面肯定有底,覺得自己的單片機或者某些語言學的還算是可以,然后當接到復雜的系統(tǒng),或者在某些邏輯方面難以用簡單的過程控制去實現(xiàn)的時候,很多時候心里面總有一個想法,如果有某樣一種方法能夠使我很容易的搞定那該多好��!在很大程度上操作系統(tǒng)不是說你想讓自己的項目中添加就一定可以添加的(拿uC/OS-ii為例),因為在使用OS的時候,工程師們往往會面臨很多的問題,是否會?是否熟悉?這個項目是否一定得去使用,有時候我自己都被這個問題所困擾,因為我也是剛剛開始接觸uC/OS-ii,其實我們并不用時刻去考慮這個問題,還是得把重心放在學習這個系統(tǒng)上面,當自己確實對其可以駕馭的時候,同時某個項目搞不定了,那么你一定會想到應該使用OS了,那么就很順其自然的運用到了,用的好或者差就是自己所掌握的情況了。上面是我自己學習uC/OS-ii以來一直難以想通的地方,在學習的過程中時刻想著在自己以前做過的項目里面加入uC/OS-ii,也許這樣就感覺十分的“高大上”了,其實不然,用的好確實厲害,如果生搬硬套可能會導致系統(tǒng)都沒法工作,而且不知道自己究竟想干嘛……
    由于平時也很忙,所以沒有太多的時間去寫一些東西,只能利用周末了,這次的主題是“通信”和“同步”,對于這兩個詞我們并不陌生,通信嘛……不就是相互交換東西,你的給我,我的給你,同步---說白了就是相對靜止,共同進步的意思,在uC/OS-ii中的通信和同步是相對任務而言的,需要記住的地方是在OS中,所有的對象都是任務,一切的工作都是圍繞任務在轉動,對于task而言,我們所想到的是OSTCB(任務控制塊),后面會具體講到這個的作用,對于通信而言,需要靠事件(EVENT)來完成,那么就有了一個新的名詞(OSECB),在uC/OS-ii中事件包括:信號量(semaphore其中互斥信號量留在后面進行說明)、消息郵箱(mail-box)、消息隊列(query)。
    信號量(Sem):通過字面意思可以了解到是信號(flag),作為標志使用,主要做判斷,就好比是只能有了鑰匙才可以開門這樣子,所以sem就如同這個鑰匙,任務只有得到了sem才可以運行,換句話說就處在了Running狀態(tài),沒有得到sem的任務處于waiting或者pending狀態(tài)。
    消息郵箱(M-box):郵箱就是傳消息的,任務與任務之間可以通過郵箱來交換信息,其實這個時間和sem也挺像的,只有獲得了消息才可以使任務處于Running狀態(tài),只不過相比sem而言可能會高端一點點,功能多了一些----可以傳值了,因為畢竟是郵箱嘛,可以裝東西。
    消息隊列(Query):消息隊列,一聽就是一整個隊列,很多很多的意思,其實它的功能和m-box的功能差不多,只不過是m-box的升級版,傳遞的值變得很多了,畢竟是隊列嘛……m-box有的功能,query都存在!這就是它的優(yōu)勢,可以傳遞很多的值。
    對于初學者來說關于事件處理的函數(shù)有很多,一下在都不知道從何下手去看和實驗,這里介紹在uC/OS-ii任務間通信最為關鍵的兩個函數(shù):OS***Pend()和OS***Post(),其中的***表示具體事件。對于他們的執(zhí)行過程我們可以通過Debug來理清楚,具體如下:當事件控制塊(OSECB)中的相關量為空,例如sem中的cnt為0或者m-box為null的時候,只要有任務調用OS***Pend()的時候會引發(fā)任務切換(不是處在中斷中),當前任務被掛起,如果事件控制塊中的相關量不為空則任務正常運行,當任務中調用了OSTimeDly()函數(shù)(前面講過其作用),則會進行一次任務調度。如果ECB中的相關量為空,任務調用OS***Pend()的時候會產(chǎn)生任務切換,當前任務執(zhí)行被斷開了,假設斷開點為A,并將當前任務掛起,如果在另一個任務中調用OS***Post()時,會對事件的相關量進行改變,例如sem中的cnt加1或者m-box不在為空,則同時會切換到waiting狀態(tài)下等待這些信號的最高優(yōu)先級任務中,并且在斷開點處繼續(xù)運行該任務,如果說沒有任務處于waiting狀態(tài),則任務會正常運行。事件操作的基本流程如上所述。有一點需要注意,出了空閑任務之外的所有任務必須在任務中合適的位置調用系統(tǒng)提供的函數(shù)OSTimeDly(),使當前任務的運行延時一段時間并進行一次任務調度,以讓出CPU的使用權,使低優(yōu)先級的任務得以運行。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表