任務建立之後,只是完成系統程式設計的一小部分,更為重要的是任務鍵的通訊,在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 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...
全域性變數和靜態全域性變數
全域性變數和區域性變數是從變數的作用域的角度劃分。靜態變數和動態變數是從變數的記憶體分配的角度劃分。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同,區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原...