物聯網開發中,ucos系統任務間的通信是指,兩個任務之間有數據的交互,具體的一起來看看吧。
1)消息郵箱
我們還是提供兩個任務Task1和Task2,假設我們還是解決剛剛的問題,Task1進行按鍵掃描,有多個按鍵key1到key n,Task2根據掃描出來的按鍵處理LED燈1到LED燈n,上次我們使用了一個方法,這個方法使用了一個事件標志組來進行,這個時候假設我不使用事件標志組,我使用消息郵箱,這個時候,我加入一個全局變量key-value,假設這個key-value等於0,表明沒有按鍵按下,key-value於1,表明第一個按鍵按下,key-value等於2,表明第二個按鍵按下,key-value等於3,表明第三個按鍵按下,依次往下面增,那這個時候,我們的Task2要想判斷哪一個按鍵按下,就不再像我們事件標志組那樣一步一步的進行判斷,我們只需要判斷key-value的值就行了,那這個key-value的值是由誰改變呢?
是由Task1這個任務改變的,在這里我們也可以看見,Task1和Task2之間進行了一個數據的交互,它們要的是key-value這個數據的值,也就是Task1改變key-value的值,Task2使用key-value的值,在這里我們就把它叫做消息的郵箱,就像一個郵箱一樣,就像我們寫信一樣,我們把這個信放進郵箱,郵箱幫我們把信傳遞到遠方,遠方的親戚朋友呢,打開我們的信,就可以看到信中的內容,同樣,我們遠方的親戚朋友也可以使用這個郵箱,也可以寫信發送給我們。
在這個過程中我們的Task1和Task2就進行了一個數據的交互,那這個就被稱做消息的郵箱,我們可以看到,在消息的郵箱過程中,我們有個任務提供發郵箱,而另外一個,我們會接收這個郵箱任務,接收以后使用,使用完后,它有可能向Task1發送郵箱,Task1接收到了這個郵箱以后,也會進行使用,這就是消息郵箱這個概念。
2)消息隊列
事實上就是由多個消息郵箱構成的隊列,就叫做消息隊列,那既然有消息郵箱了,我們為什么葯使用消息隊列呢?
我們還是提供兩個任務Task1和Task2,假設Task1還是進行了一個按鍵的掃描,比如這個時候,它掃描的是我們windows下面的標准按鍵——鍵盤,而Task2呢進行按鍵的處理,比如應用處理,在這里我們都知道有兩個問題,Task1在進行按鍵掃描,並且在發送這個消息郵箱的時候,它發的很快,因為它必須掃描的很快,它才能保證這個按鍵不被丟失,比如說你掃描的很慢,某些人它打印鍵盤的速度很快,那這樣的話,這個按鍵就會丟失,但是應用程序它有可能處理不了那么快,就是說,它處理的速度可能會比較慢一些,那這個時候怎么辦呢?
比如Task1發出去了,Task2接收到了,但是它還沒有處理,那這個時候Task1又發送了下一個按鍵,那下一個按鍵能不能被接收到呢?
或者說上一個按鍵能不能被處理呢?這是個問題,那這個時候,我們就可以使用多個消息郵箱,比如我在Task1和Task2之間,我們建立很多個消息郵箱,第一個按鍵按下以后,我們發送到第一個消息郵箱,第二個按鍵按下以后,我們發送到第二個消息郵箱,第三個按鍵按下以后,我們發送到第三個消息郵箱,依次類推。到最后一個的時候,接下來再有按鍵按下,我們就再往第一個發送,那這個時候,對應用處理的要求稍微就要低一些,為什么呢?我只要保證在這個多次之間,我們只要把第一個按鍵處理掉以后就行了,因為處理掉第一個按鍵以后消息郵箱已經變成空啦,這個時候,我們就可以往第一個里面放,那也就是說我們假設本來有程序需要10毫秒,處理這個按鍵,但是現在如果有7個消息郵箱,我們可以每隔70毫秒處理一下,只要保證在同一時刻,只要有一個消息郵箱為空就行。
那這么多消息郵箱組合在一起,我們就把它叫做消息隊列,這個隊列滿足一個先進先出的規則,先進的隊列的成員先出去,當然這個隊列,我們也可以滿足一個后進先出。比如說這個按鍵比較緊急,你必須先處理這個按鍵,那我們可以把這個按鍵直接發送給Task2,那它就是一個后進先出的原則,這個就是我們的消息隊列和消息郵箱的不同,在這里我們可以看出消息隊列的本質,實際上多個消息的郵箱構成的一個隊列的數據結構。