ucos II 任務(wù)間通信之一 :全局變量
任務(wù)創(chuàng)建好了之后,只是完成了系統(tǒng)編程的一小步,更為重要的是任務(wù)間的通信。比如在mcu21的項目里,有通信任務(wù),有液晶顯示任務(wù),有控制任務(wù)??刂迫蝿?wù)需要用到通信任務(wù)接受到的數(shù)據(jù),液晶顯示任務(wù)也顯示控制任務(wù)的數(shù)據(jù)。這就需要用到任務(wù)間的通信了。 Mcu21總結(jié)了一下,在ucos II 里任務(wù)間通信可以采用以下幾種方式。 1. 共享全局變量,這是最快捷有效的方式,實現(xiàn)這種通信可以采用以下兩種方式:一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()來關(guān)閉中斷和打開中斷,二是利用函數(shù)OSSchedLock()和OSSchedUnlock()對μC/OS-II中的任務(wù)調(diào)度函數(shù)上鎖和開鎖. 2. 使用信號量 3. 使用郵箱 4. 使用消息隊列 下面介紹下共享全局變量的實現(xiàn)過程。
(1)宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是在移植ucos II過程中由用戶定義的。在os_cpu.h這個文件中。代碼如下,這部分代碼的作用是關(guān),開中斷,具體和CPU有關(guān)。當(dāng)我們調(diào)用OS_ENTER_CRITICAL()時,系統(tǒng)中斷被關(guān)閉,我們知道,任務(wù)切換時基于定時器中斷的,當(dāng)系統(tǒng)中斷別關(guān)閉時,其它中斷,包括定時器中斷也就被關(guān)閉,任務(wù)切換也不可能發(fā)生,所以確保在訪問變量的時候,不會有其它的任務(wù)或中斷也在同時訪問這個變量。 這兩個宏非常好用,在mcu21的項目里經(jīng)常用到。尤其在中斷處理函數(shù)里面。 因為現(xiàn)在的很多CPU是支持中斷嵌套的,為了防止中斷執(zhí)行的時候不被其它的中斷打斷,就可以調(diào)用這兩個宏。 (2)第二種方法是給任務(wù)調(diào)度函數(shù)上鎖,開鎖。這種方法和使用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()最大的區(qū)別是:中斷是可以執(zhí)行的。盡管不執(zhí)行任務(wù)切換,變量依然有可以被中斷函數(shù)訪問。 給任務(wù)調(diào)度器上鎖的函數(shù)如下
給任務(wù)調(diào)度器解鎖的函數(shù)如下
它實現(xiàn)的原理大致是這樣的。 調(diào)用一次OSSchedLock(),就會對全局變量OSLockNesting加1,調(diào)用OSSchedUnlock ()一次就對全局變量OSLockNesting減1。當(dāng)OSLockNesting是零的時候,系統(tǒng)才能進(jìn)行任務(wù)調(diào)度。 |
|