2012-08-29 29 views
4

我想知道是否有可能從c + +代碼訪問處理器中斷(我想我需要使用匯編代碼)。訪問處理器中斷與c + +和x86和x64架構

這是事情。我習慣於使用嵌入式系統(PIC,ARM7和Atmel處理器),並且可以編程我的中斷而不出現任何問題(我使用C)。所有的寄存器都是映射的,總而言之,這很容易,取決於應用程序。現在我正在使用x86和x64體系結構,並且我希望(強調WANT)能夠在這些處理器中執行相同的操作。

例如:我想在C++中有一個線程運行一個代碼,該代碼在不按回車鍵(cin,getchar等)的情況下不斷驗證當前按下的鍵。我想編程一個計時器中斷,這樣我就可以在特定的時間執行操作。我明白,我想要做的很多事情都可以通過操作系統來完成,但我真的希望自己有這樣的自由。

目前我使用的Linux(Ubuntu的),但我肯定會與Windows工作不久,如果這是回答這個問題

+7

相信我,這只是走下坡路。學習如何在Linux上以正確的方式執行此操作。如果您堅持以適合完全不同環境的方式在一個環境中編寫代碼,您永遠不會編寫出好的代碼。 OS擁有中斷。這就是桌面操作系統的工作方式。 –

+0

@DavidSchwartz所以...我應該以某種方式從操作系統中獲取中斷?我在哪裏可以獲得這些信息?正如你可能已經注意到,我對C++和更高級別的編碼頗爲陌生。 – morcillo

+0

你爲什麼想中斷?想想如何做你想做的事。中斷是你完成任務的方式之一 - 你想要做的事情是什麼? (例如,要在特定時間執行某些操作,可以使用線程或'setitimer'。) –

回答

5

對於用戶級進程所需要的信息,中斷由信號所取代。您可以通過撥打setitimer來安排發送信號給您的流程。但最有可能的是,做你正在嘗試做的最好的方法是兩件事之一:

  1. 使用事件循環。基本上,把你的程序編寫成一個巨大的循環,定期檢查是否有任何需要做的事情。在循環中,檢查時間,檢查按鍵,等等。根據需要做一些工作,然後再循環。

  2. 使用線程。你可以有一個線程來觀察時間和觸發計時器的工作。你可以在read上有一個線程阻塞數據到達時像中斷一樣。

有可能鑽到你的頭,你做最少的工作在中斷處理程序本身,通常只是傳遞信息,在一個正常的環境中運行其他代碼。那麼,操作系統已經爲你做了這部分。您只需編寫等待中斷處理程序(或任何需要的)的代碼來檢測並開始處理事件。

我想在C++中有一個線程運行一個代碼,該代碼在不按回車鍵(cin,getchar等)的情況下不斷驗證被按下的鍵。

這樣做。這需要一個線程,並且需要將終端的輸入模式更改爲不需要輸入密鑰的模式。這與中斷無關。

+0

這意味着我可以間接訪問處理器的標誌。這實際上幫了我很多。如果你可以稍微編輯一下你的問題(這樣每個人都會清楚地看到它),如果這些信號依賴於操作系統,那麼這對我和其他所有其他問題都是完美的。還有......關於這個話題的任何推薦文獻?我知道谷歌是我的朋友,我應該使用它,但這樣做可能會使我開始錯誤的方式,我真的想獲得知識,將堅持在我的大腦供以後使用。 – morcillo

0

對於Windows:

Windows卻躲在低級硬件的訪問(比如訪問CPU中斷)一個很好的工作,其原因就是因爲贏內核使用他們的流程和其他內部的東西之間的切換。 因此,您需要編寫驅動程序才能獲得直接硬件訪問權限,或者讓您在執行環中執行代碼< 3(用戶模式)。

但是出於教育目的,您可以使用DOS甚至Windows DOS窗口,甚至中斷都是模擬的。當然你會使用一些編譯器,比如Borland C++ 3.x(dos 16bit)。 setvect和getvect可用於中斷掛鉤。