我是一個嵌入式程序員,嘗試使用Visual Studio 2010和MingW(作爲兩個獨立的構建環境)在Win32環境中模擬實時搶先調度程序。我在Win32調度環境中非常綠色,並且正在嘗試做的事情碰到了一堵磚牆。我不是試圖實現實時行爲 - 只是爲了讓仿真任務按照與實際目標硬件上相同的順序和順序運行。強制Win32線程調度到基於優先級的定義序列
被模擬的實時調度器有一個簡單的目標 - 總是執行能夠運行的最高優先級任務(線程)。只要任務能夠運行,它就必須搶佔當前運行的任務,如果它的優先級高於當前運行的任務。一個任務可以由於它正在等待的外部事件或超時/阻塞時間/休眠時間到期而變得能夠運行 - 具有生成時基的刻度中斷。
除了這種先發制人的行爲,任務可以產生或自願放棄其時間片,因爲正在執行睡眠或等待類型功能。
我通過爲模擬的實時調度程序創建的每個任務創建低優先級的Win32線程來模擬此線程(該線程有效地執行調度程序在真實嵌入式目標上切換的上下文),中等優先級Win32線程作爲僞中斷處理程序(處理模擬滴答中斷和產生請求,通過Win32事件對象向它發送信號),以及更高優先級的Win32線程來模擬產生滴答中斷的外設。
當僞中斷處理程序確定應該發生任務切換時,它使用SuspendThread()掛起當前正在執行的線程,並使用ResumeThread()恢復執行新選擇任務的線程。在可能創建的許多任務及其關聯的Win32線程中,只有一個管理任務的線程在任何時候都不會處於暫停狀態。
暫停的線程立即掛起SuspendThread()被調用並且一旦事件告訴它中斷掛起的時候執行僞中斷處理線程就會被執行,這一點很重要 - 但這不是行爲I我正在看。
作爲一個例子問題,我已經有了一個解決方法:當一個任務/線程產生yield事件鎖存在一個變量中,並且中斷處理線程被標記爲有需要的僞中斷(yield)處理。現在在我用於編程的實時系統中,我希望中斷處理線程立即執行,因爲它具有比發送信號的線程更高的優先級。我在Win32環境中看到的情況是,信號較高優先級線程的線程在掛起之前會持續一段時間 - 或者是因爲在信號較高的優先級線程開始執行之前需要一些時間,或者因爲掛起需要一些時間任務實際上停止運行 - 我不確定哪個。在任何情況下,通過在發信號通知Win32中斷處理線程之後在信號量上創建信號量爲Win32的線程塊,並且在完成其功能(握手)時讓中斷處理Win32線程解除對線程的阻塞時,這可以很容易地正確。有效地使用線程同步來強制調度模式到我需要的。我爲此使用SignalObjectAndWait()。
使用此技術時,模擬的實時調度程序在協作模式下運行時可以完美工作 - 但在搶先模式下不會(需要時)。
搶先式任務切換的問題我猜也是一樣的,任務在它被告知在實際停止運行之前掛起一段時間後繼續執行,因此係統無法保證在執行任務時保持一致狀態運行任務的線程暫停。然而,在搶先的情況下,因爲任務不知道什麼時候會發生,所以不能使用使用信號量來阻止Win32繼續下一次直到下一次恢復的技術。
有沒有人在這篇文章中做了這件事 - 對不起,因爲它的長度!
我的問題則是:
我怎麼能強迫的Win32(XP)調度啓動和立即停止任務的暫停和恢復線程函數的調用 - 或 - 我怎麼能強迫更高的優先級Win32線程立即開始執行,它能夠這樣做(阻塞的對象被髮送)。有效地強制Win32重新安排正在運行的進程。
有沒有某種方式異步停止任務,以等待事件,而不是任務/線程順序執行路徑。
模擬器在Linux環境下運行良好,POSIX信號被用來有效地中斷線程 - 在Win32中是否有相當的功能?
感謝任何人誰已閱讀本長職務,並事先特別感謝任何人可以通過這個迷宮的Win32握住我的'實時工程師的手的時候。
但是光纖不能同時在多個內核上運行。 – 2010-11-18 19:28:32
感謝您的提示。我明天會在纖維上查找一些參考資料。 – Richard 2010-11-18 22:11:43
@Zan:多根光纖可以在單個線程中運行,並且可以運行多個線程,每個線程一個線程。 – 2010-11-19 02:44:30