從以上代碼不難看出ISR的任務就是返回以
SYSINTR_
為前綴的中斷ID
如果不需要進一步執行IST
那麼就返回SYSINTR_NOP
中斷注冊步驟
參考X平台的代碼中斷注冊步驟如下
) 用SETUP_INTERRUPT_MAP宏關聯SYSINTR和IRQ以SYSINTR_為前綴的常量由內核使用用於唯一標識發生中斷的硬件在Nkintrh文件中預定義了一些SYSINTROEM可以在Oalintrh文件中自定義SYSINTR
) 用HookInterrupt函數關聯硬件中斷號和ISR這裡的硬件中斷號為物理中斷號而非邏輯中斷號IRQ在InitPICs函數(和上述ISR位於同一文件)的最後調用了HookInterrupt函數如下
for (i = ; i < ; i++)
HookInterrupt(i (void *)PeRPISR); ///用ISR關聯個中斷號
中斷處理步驟
) 調用InterruptInitialize函數關聯SYSINTR和IST具體是關聯IST等待的事件一般在驅動程序中按如下編寫
hEvent = CreateEvent() ///創建一個事件對象
InterruptInitialize(SYSINTR_SERIAL hEvent ) ///關聯一個串口中斷ID和這個事件
hThd = CreateThread( MyISTRoutine hEvent ) ///創建一個線程(IST)
CeSetThreadPriority(hThd ); ///提高此線程的優先級
) IST執行I/O操作一般IST按如下編寫
for(;;) ///驅動程序一直處於服務狀態
{
WaitForSingleObject(hEvent INFINITE); ////無限等待事件
//// I/O操作
InterruptDone(InterruptId); ///結束當前中斷處理
}
) ISR和IST之間數據傳輸
假如我們要從一個設備頻繁的讀取數據而每次讀取量非常少那麼每次讀取都要調用IST會降低性能作為解決方案ISR可以做讀取工作(存放到緩沖區)並在緩沖區存放滿後由IST到緩沖區讀取因為ISR運行在內核模式而IST運行在用戶模式IST不能輕易地訪問ISR的緩沖區為此CE提供了一個辦法(參見標題為Passing Data between an ISR and an IST的幫助文檔)您也可以到天極網嵌入式開發論壇詢問
二實現系統時鐘
系統時鐘(system tick)概念
系統時鐘是內核需要的唯一中斷(IRQ)系統時鐘每毫秒產生一個中斷當發生中斷時內核在ISR中累計到的倍數就是過了一秒鐘在處理系統時鐘的ISR中不僅要累計計數還要決定是否通知內核開始重新調度當前所有的線程要實現一個OAL系統時鐘是第一個必須做的事
[] [] []
From:http://tw.wingwit.com/Article/program/SQL/201311/16413.html