調度器:
一方面,調度器可以看作是一個簡單的操作系統,允許以周期性或(更少見)單次方式來調用任務
從底層的角度看,調度器可以看作是一個由許多不同任務共享的定時器中斷服務程序,因此,只需要初始化一個定時器,而且改變定時的時候通常只需要改變一個函數。此外,無論需要運行1個、10個還是100個不同的任務,通常都可以使用同一個調度器完成。注意,這種“共用中斷服務程序”與桌面操作系統提供的共用打印功能非常類似。
合作式調度器:
合作式調度器不但可靠而且可預測的主要原因是在任一時刻只有一個任務是活動的。
搶占式調度器:
混合式調度器:
這里面一個關鍵性問題就是如何解決不可重入函數:
a、修改或讀取變量(尤其是用於任務間通信的全局變量)
b、操作單片機端口等硬件接口的代碼(volatile類型修飾符的使用)
c、調用公共函數的代碼,例如,如果同一個函數同時被多個任務調用
當然這里C的問題歸根到底還是A的問題,只要這個函數是可重入函數,都肯定沒有問題。
第一個問題的解決方法,最容易想到的是在開始訪問共享資源的時候,禁止調度器。但這也是不能完全解決這個問題,因為你不能保證訪問共享資源和禁止調度器之間不會發生中斷,該中斷恰好正要訪問這個端口。
可以考慮在訪問共享資源之前就禁止調度器,這樣就可以解決這個問題,但一旦調度器停止,整個時基就停止了,如果這個端口訪問很頻繁,調度器不斷的停止,對於整個系統的運行影響會非常的大。