小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ucos II 任務(wù)間 通信之一:全局變量

 昵稱7324690 2014-03-26
    

                         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ù)如下

void OSSchedLock (void)

{

    if (OSRunning == TRUE) {

        OS_ENTER_CRITICAL();

        OSLockNesting++;

        OS_EXIT_CRITICAL();

    }

}

給任務(wù)調(diào)度器解鎖的函數(shù)如下

void OSSchedUnlock (void)

{

    if (OSRunning == TRUE) {

        OS_ENTER_CRITICAL();

        if (OSLockNesting > 0) {

            OSLockNesting--;

            if ((OSLockNesting | OSIntNesting) == 0) {                    (1)

                OS_EXIT_CRITICAL();

                OSSched();                                                     (2)

            } else {

                OS_EXIT_CRITICAL();

            }

        } else {

            OS_EXIT_CRITICAL();

        }

    }

}

它實現(xiàn)的原理大致是這樣的。

調(diào)用一次OSSchedLock(),就會對全局變量OSLockNesting加1,調(diào)用OSSchedUnlock ()一次就對全局變量OSLockNesting減1。當(dāng)OSLockNesting是零的時候,系統(tǒng)才能進(jìn)行任務(wù)調(diào)度。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多