我想在一個函數運行時產生一箇中斷,然後我希望CPU執行一些特定的ISR,並且在完成ISR之後,該函數將繼續執行。我正在使用Windows XP和MinGW編譯器。如何在C中打斷一個正在運行的函數?
回答
沒有硬件是有其實我想先以某種方式產生中斷,並處理它以後,我會做它在實際硬件
一個真正的硬件中斷將切換CPU引腳之一,並使其派遣到ISR。我想不出有什麼真正透明的方法來模擬它。暫停當前正在運行的功能
一種方式是使用SuspendThread function,然後用不同的線程來運行ISR。
不同的可能性,調查可能是使用Fibers。
編輯
由於cxxl's answer建議,另一種可能是使用實時優先級的線程:
- 有兩個線程,一個運行你的函數,而另一個線程來運行仿真ISR
- 使用「CPU親和力」功能在兩個線程,以確保它們在同一個CPU上運行兩個
- 設置ISR線程的優先級爲「實時」
之後,當允許ISR-模擬線程運行時,會搶先其他線程。
可否請您詳細說明您的答案。我想這樣做,但如何繼續? – user1871762
@ user1871762「如何繼續」將閱讀我提到的API函數的文檔(請參閱[線程函數](http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847( v = vs.85).aspx#thread_functions)),並決定它們是否可以滿足您的要求。除非你更清楚你想要實施什麼解決方案,並且/或者更具體地說明你的困難是什麼,否則我無法詳述。另請參閱cxxl答案下的評論/問題。 – ChrisW
正如有人說,相當模糊的問題。
有些CPU的有辦法強制/通過軟件假中斷,你可以調查這一點。 (我不知道x86,我是嵌入式開發人員)
在OS中,您可能/應該能夠中斷一個進程/線程與另一個進程/線程。再次,我不是一個Win程序員,所以不能真正說。否則,根據具體情況,可以調用一些主循環,調用子程序,每次它檢查「中斷條件」(不管可能如何),並且分支或設置一個標誌爲表明發生了某些事情/需要發生。
x86有一個稱爲「軟件中斷」的「int」操作碼,但它調度調用該操作碼的線程。 – ChrisW
獲得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
你是肯定你需要一箇中斷?您可以在用戶模式下執行很多操作,具有管理權限和實時優先級...
是的,我相信。 – user1871762
@ user1871762 cxxl的答案是編寫一個設備驅動程序:當且僅當您想要在Windows上處理硬件中斷時,才需要它。相反,如果您希望編寫在Windows上運行的模擬代碼,但您稍後會將其移植到嵌入式非Windows系統中,則不應編寫設備驅動程序,而應考慮使用多線程用戶模式應用程序的答案爲你的模擬。 – ChrisW
@ChrisW我認爲在Windows中使用線程模擬另一個平臺的硬件中斷並不合理。硬件,操作系統和時間將完全不同,Windows和嵌入式系統之間幾乎沒有相似之處,所以我不認爲它會有任何收益。 – Lundin
- 1. 如何在python中的另一個def函數中運行一個def函數?
- 2. 停止一個函數,如果另一個正在運行
- 3. 用^ C打斷正在運行的`npm install`安全嗎?
- 4. 如何在編譯時在C#中運行一個函數或一段代碼
- 5. 如何在constexpr函數中執行運行時斷言?
- 6. 如何在另一個線程中運行一個函數
- 7. 這個遞歸函數是如何在C++中運行的?
- 8. 如何在AngularJs的每個頁面中運行一個函數
- 9. 如何在斷點處運行gdb中的程序函數?
- 10. 如何在同一個表中的SQL中運行vlookup函數?
- 11. N次在另一個函數中運行一個函數
- 12. 在console.log中運行一個函數?
- 13. 在codeigniter中運行一個init函數
- 14. 在PowerShell中運行一個函數
- 15. 在另一個線程中運行函數的C#泛型
- 16. 如何中斷一個正在等待的C++ 0x線程?
- 17. 在正在運行的java jar中打開一個文件
- 18. 我該如何運行一個我在C++中有指針的函數?
- 19. 從另一個程序或終端中斷正在運行的C++程序
- 20. 如何在另一個完成後運行一個lambda函數
- 21. 中斷正在運行的線程
- 22. 如何在C#中運行主函數一段時間後調用函數
- 23. 如果進程正在運行,我如何讓timer2只運行一次函數?
- 24. 如何在codeigniter的每個頁面上運行一個函數
- 25. 如何判斷openoffice的哪個應用程序正在運行?
- 26. 在另一個函數中只運行一次點擊函數
- 27. 如何在c中的richtextbox中爲特定字符打斷行#
- 28. C在另一個線程中運行函數
- 29. 在C#中運行時構建一個函數
- 30. 如何在另一個函數中調用多個函數C
您是否在談論硬件中斷和硬件ISR? – ChrisW
請更具體。你想完成什麼? – cxxl
@ChrisW沒有硬件在那裏實際上我想首先產生中斷並稍後處理,我會在實際的硬件上做到這一點。 – user1871762