2012-12-11 79 views
-1

我想在一個函數運行時產生一箇中斷,然後我希望CPU執行一些特定的ISR,並且在完成ISR之後,該函數將繼續執行。我正在使用Windows XP和MinGW編譯器。如何在C中打斷一個正在運行的函數?

+0

您是否在談論硬件中斷和硬件ISR? – ChrisW

+1

請更具體。你想完成什麼? – cxxl

+0

@ChrisW沒有硬件在那裏實際上我想首先產生中斷並稍後處理,我會在實際的硬件上做到這一點。 – user1871762

回答

1

沒有硬件是有其實我想先以某種方式產生中斷,並處理它以後,我會做它在實際硬件

一個真正的硬件中斷將切換CPU引腳之一,並使其派遣到ISR。我想不出有什麼真正透明的方法來模擬它。暫停當前​​正在運行的功能

一種方式是使用SuspendThread function,然後用不同的線程來運行ISR。

不同的可能性,調查可能是使用Fibers


編輯

由於cxxl's answer建議,另一種可能是使用實時優先級的線程:

  • 有兩個線程,一個運行你的函數,而另一個線程來運行仿真ISR
  • 使用「CPU親和力」功能在兩個線程,以確保它們在同一個CPU上運行兩個
  • 設置ISR線程的優先級爲「實時」

之後,當允許ISR-模擬線程運行時,會搶先其他線程。

+0

可否請您詳細說明您的答案。我想這樣做,但如何繼續? – user1871762

+0

@ user1871762「如何繼續」將閱讀我提到的API函數的文檔(請參閱[線程函數](http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847( v = vs.85).aspx#thread_functions)),並決定它們是否可以滿足您的要求。除非你更清楚你想要實施什麼解決方案,並且/或者更具體地說明你的困難是什麼,否則我無法詳述。另請參閱cxxl答案下的評論/問題。 – ChrisW

0

正如有人說,相當模糊的問題。

有些CPU的有辦法強制/通過軟件假中斷,你可以調查這一點。 (我不知道x86,我是嵌入式開發人員)

在OS中,您可能/應該能夠中斷一個進程/線程與另一個進程/線程。再次,我不是一個Win程序員,所以不能真正說。否則,根據具體情況,可以調用一些主循環,調用子程序,每次它檢查「中斷條件」(不管可能如何),並且分支或設置一個標誌爲表明發生了某些事情/需要發生。

+0

x86有一個稱爲「軟件中斷」的「int」操作碼,但它調度調用該操作碼的線程。 – ChrisW

1

獲得Windows驅動程序工具包從這裏:http://msdn.microsoft.com/en-us/library/windows/hardware/gg487428.aspx。它包含用於編寫設備驅動程序的標題和庫。如果你要處理中斷,那麼你需要寫一個設備驅動程序。

你可以編寫一個設備驅動程序並使用DPC,這就是ISR的輔助功能。這些DPC可以用軟件調用,並且仍然以比任何用戶模式代碼更高的優先級執行。 ISR本身通常非常短,只處理中斷,將其數據和控制權交給DPC。

我懷疑你可以在MinGW中做到這一點,但我想你需要MS Visual C,但有一個免費的快捷版。看到這裏:http://www.microsoft.com/visualstudio/eng/products/visual-studio-express-products

肯定你需要一箇中斷?您可以在用戶模式下執行很多操作,具有管理權限和實時優先級...

+0

是的,我相信。 – user1871762

+0

@ user1871762 cxxl的答案是編寫一個設備驅動程序:當且僅當您想要在Windows上處理硬件中斷時,才需要它。相反,如果您希望編寫在Windows上運行的模擬代碼,但您稍後會將其移植到嵌入式非Windows系統中,則不應編寫設備驅動程序,而應考慮使用多線程用戶模式應用程序的答案爲你的模擬。 – ChrisW

+0

@ChrisW我認爲在Windows中使用線程模擬另一個平臺的硬件中斷並不合理。硬件,操作系統和時間將完全不同,Windows和嵌入式系統之間幾乎沒有相似之處,所以我不認爲它會有任何收益。 – Lundin

相關問題