RT-Thread
1.RT-Thread Studio
RT-Thread | RT-Thread Studio初體驗
移植RT-Thread 3.1.3到STM32F2上
2.鎖、任務間同步及通信
linux內核并發和竟態 (解決竟態的5種方式屏蔽中斷,原子操作,自旋鎖,信號量,互斥體)
RT-thread 鎖、任務間同步及通信
1.中斷鎖
????????使用中斷鎖來操作系統的方法可以應用于任何場合,且其他幾類同步方式都是依賴于中斷鎖而實現的,可以說中斷鎖是最強大的和最高效的同步方法。
????????只是使用中斷鎖最主要的問題在于,由于關閉中斷會導致整個系統不能響應外部中斷,所以在使用關閉中斷做為互斥訪問臨界區的手段時,首先必須需要保證關閉中斷的時間非常短,例如數條機器指令。
????????所以中斷鎖對系統的實時性影響非常巨大,當使用不當的時候會導致系統完全無實時性可言(可能導致系統完全偏離要求的時間需求);而使用得當,則會變成一種快速、高效的同步方式。 例如,為了保證一行代碼(例如賦值)的互斥運行,最快速的方法是使用中斷鎖而不是信號量或互斥量。
/* 關閉中斷*/ level = rt_hw_interrupt_disable(); a = a + value; /* 恢復中斷*/ rt_hw_interrupt_enable(level);2.調度器鎖
????????同中斷鎖一樣把調度器鎖住也能讓當前運行的任務不被換出,直到調度器解鎖。但和中斷鎖有一點不相同的是,對調度器上鎖,系統依然能響應外部中斷,中斷服務例程依然能進行相應的響應。所以在使用調度器上鎖的方式進行任務同步時,需要考慮好任務訪問的臨界資源是否會被中斷服務例程所修改,如果可能會被修改,那么將不適合采用此種方式進行同步。
調度器鎖能夠方便地使用于一些線程與線程間同步的場合,由于輕型,它不會對系統中斷響應造成負擔;但它的缺陷也很明顯,就是它不能被用于中斷與線程間的同步或通知,并且如果執行調度器鎖的時間過長,會對系統的實時性造成影響(因為使用了調度器鎖后,系統將不再具備優先級的關系,直到它脫離了調度器鎖的狀態)。
void rt_enter_critical(void); /* 進入臨界區*/void rt_exit_critical(void); /* 退出臨界區*/3.信號量
????????信號量在作為鎖來使用時,通常應將信號量資源實例初始化成1,代表系統默認有一個資源可用。當線程需要訪問臨界資源時,它需要先獲得這個資源鎖。當這個線程成功獲得資源鎖時,其他打算訪問臨界區的線程將被掛起在該信號量上,這是因為其他線程在試圖獲取這個鎖時,這個鎖已經被鎖上(信號量值是0)。當獲得信號量的線程處理完畢,退出臨界區時,它將會釋放信號量并把鎖解開,而掛起在鎖上的第一個等待線程將被喚醒從而獲得臨界區的訪問權。因為信號量的值始終在1和0之間變動,所以這類鎖也叫做二值信號量。
????????警告: 中斷與線程間的互斥不能采用信號量(鎖)的方式,而應采用中斷鎖
4.互斥量
????????互斥量又叫相互排斥的信號量,是一種特殊的二值性信號量。它和信號量不同的是,它支持互斥量所有權、遞歸訪問以及防止優先級翻轉的特性。互斥鎖和信號量,一個有中間管理,一個沒有中間管理。互斥量的狀態只有兩種,開鎖或閉鎖(兩種狀態值)。當有線程持有它時,互斥量處于閉鎖狀態,由這個線程獲得它的所有權。相反,當這個線程釋放它時,將對互斥量進行開鎖,失去它的所有權。當一個線程持有互斥量時,其他線程將不能夠對它進行開鎖或持有它,持有該互斥量的線程也能夠再次獲得這個鎖而不被掛起。這個特性與一般的二值信號量有很大的不同,在信號量中,因為已經不存在實例,線程遞歸持有會發生主動掛起(最終形成死鎖)。
優先級翻轉問題與內核調度有關(不同內核,優先級翻轉問題不同)
3.................................
4............................
總結
- 上一篇: 演练VC中的COMMON一族(转贴)之一
- 下一篇: 用C语言解决迷宫问题