ucos全域性變數

2021-07-25 22:21:24 字數 1313 閱讀 2403

任務建立之後,只是完成系統程式設計的一小部分,更為重要的是任務鍵的通訊,在ucos裡任務通訊可以採用以下幾種方式

1.共享全域性變數,這是最快捷有效的方式,實現這種通訊可以採用以下兩種方式,一是利用巨集os_enter_critical和

os_exit_critical來關中斷和開啟中斷,二是利用函式osschedlock和osschedunlock對ucos的任務排程上鎖和開鎖

2. 使用訊號量

3.使用郵箱

4.使用訊息佇列

下面介紹共享全域性變數的而實現過程

1.巨集os_enter_critical()和os_exit_critical是在移植ucos過程中游使用者定義的,在os_cpu.h這個檔案彙總,**如下

這部分**的作用是關,開中斷,具體和cpu有關,當我們呼叫os_enter_critical()時,系統中斷被關,我們知道,任務切換時基於定時器中斷,

當系統中斷沒關閉是,任務切換也不可能發生,所以確保在訪問變數的時候,不會有其它的任務或中斷也在同時訪問這個變數,

尤其在中斷函式裡,因為現在很多cpu是支援中斷巢狀的,為了防止中斷執行上的時候不被其它的中斷打斷,就可以呼叫這兩個巨集。

2.第二種方法是給任務排程函式上鎖開鎖,這種方法和使用巨集os_enter_critical和os_eixt_critical最大區別是:中斷可以執行的,儘管不執行任務切換,變數依然可以被中斷函式訪問

給任務排程器上鎖函式如下:

void osschedlock(void)

if(osrunnign==true)

os_enter_critical();

oslocknesting++;

os_exit_critical();

給任務排程器解鎖的函式如下

void osschedunlokc(void)

if(osrunning==true)

os_enter_critical();

if(oslocknesting>0)

oslocknesting--;

if((oslocknesting|osintnesting)==0)

os_exit_ctitical();

ossched();

else

os_exit_critical();

else

os_exit_critical();

它實現的原理大致是這樣的.

排程一次osschedlock(),就會對全域性變數oslocknesting加1,呼叫osschedunlock一次就對全域性變數oslocknesting減1

當oslocknesting是零的時候,系統才能進行任務排程

ucos中的全域性變數

在uc os ii的 中,應用了一種讓人耳目一新的全域性變數定義方法。在 uc os ii 中,作者給出了解釋,但是這裡還是忍不住要討論一番。我們知道,全域性變數的使用有兩個問題 按照平時的定義,如果安排得不好,總是會出問題,extern起來沒完。而在uc os ii採用了一種比較聰明的做法。uc ...

static全域性變數 全域性變數

1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...

全域性變數和靜態全域性變數

全域性變數和區域性變數是從變數的作用域的角度劃分。靜態變數和動態變數是從變數的記憶體分配的角度劃分。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同,區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原...