2012-09-10 101 views
1

我已經給出了一些供應商提供的驅動程序代碼,用C語言編寫,在DOS上運行(是DOS)以訪問硬件。我正在努力研究此代碼的功能,迄今爲止沒有取得太大的成功。特別是我有問題理解下面的代碼有人可以解釋這個函數指針語法嗎?

void (interrupt *oldcan)(void); 

void interrupt far can_isr(void) 
{ 
    /* function body */ 
} 

我猜,第一行定義一個函數指針,但我從來沒有見過的interrupt字我是這樣假設是某種DOS API函數。我以前從未使用DOS,上面的函數定義在我看來它有3種返回類型 - void,interruptfar,這顯然是不可能的。該函數實際上具有void返回類型,但interrupt far的含義是什麼?任何援助將受到感謝。

+0

如果我沒有記錯,'far'與被調用的函數的內存地址有關,在正常頁面之外。 –

回答

4

中斷關鍵字被用於創建中斷處理程序 - 即,此函數旨在被中斷調用。 far意味着它返回時,它期望CS和IP都在堆棧上(對於通過中斷調用的任何東西)。

最常見的用法可能是要使用串口的代碼 - BIOS/DOS串口處理程序會在更高的速度下丟失字符(本來約爲300 bps),因此您必須安裝你自己的處理程序。當一個字符出現在串口上時,串口硬件會斷言一條中斷處理器的線路。基於此,您的中斷處理程序將被調用。您的代碼需要將數據從串口讀入內存(並執行一些操作,例如重新啓用中斷)並返回。

+1

呃。我記得FAR指針。 –

+2

+1這就是即使你將自己的個人資料隱藏起來也能說明你年齡的問題之一:) – dasblinkenlight

+0

感謝你的回答,它給了我一個出發點。這種代碼不再使用嗎?我只在全場比賽5年,但我從未見過這樣的事情。 – mathematician1975

1

這很可能是一個編譯器特定的擴展,用於以某種平臺特定的方式將該函數「安裝」爲中斷處理程序。

標準C語言中沒有interrupt關鍵字。

相關問題