熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

WinCE中OEM適配層編程點滴之創建OAL[1]

2013-11-13 12:41:53  來源: SQL語言 
    正如CE的幫助文檔所言創建OAL是一個非常復雜的任務而通常的辦法是復制原有的相同平台的OAL代碼然後修改來適應平台的特殊要求也就是說對於沒有特殊要求的平台復制原有相同平台的OAL代碼就足夠了由於OAL的復雜性在這篇文章中我只講解常用的部分

  實現ISR

   ISR的概念

  ISR(interrupt service routine)是處理IRQs(interrupt request line)的程序Windows CE用一個ISR來處理所有的IRQ請求當一個中斷發生時內核的異常處理程序先調用內核ISR內核ISR禁用所有具有相同優先級和較低優先級的中斷然後調用已經注冊的OAL ISR程序一般ISR有下列特征

  ) 執行最小的中斷處理最小的中斷處理指能夠檢驗答復產生中斷的硬件而把更多的處理工作留給IST(interrupt service thread)

  ) 當ISR完成時返回中斷ID(中斷ID大部分是預定義的)

   X平台的ISR結構

  X平台的ISR保存在%_WINCEROOT%\PUBLIC\COMMON\OAK\CSP\I      \OAL\fwpcc中函數名為PeRPISR下面分析一下此函數的主要代碼

 ULONG PeRPISR(void)
 {
  ULONG ulRet = SYSINTR_NOP; ///返回值既中斷ID(以SYSINTR_為前綴)
  UCHAR ucCurrentInterrupt; ///當前中斷號
  if (fIntrTime) ////// fIntrTime 用於測試SR和IST的延時時間測試工具為ILTimingexe
   
   ucCurrentInterrupt = PICGetCurrentInterrupt(); ////返回當前中斷IRQ
  if (ucCurrentInterrupt == INTR_TIMER) ///IRQIRQ為系統時鐘(system tick)中斷具體見實現系統時鐘
  
  if (dwRebootAddress) ////是否需要重啟動
   RebootHandler();
   
  if(ucCurrentInterrupt == INTR_RTC) ////IRQrealtime clock的中斷
   
  else if (ucCurrentInterrupt <= INTR_MAXIMUM) ///如果中斷小於 INTR_MAXIMUM
  {
   ulRet = NKCallIntChain(ucCurrentInterrupt); ////調用中斷鏈
   if (ulRet == SYSINTR_CHAIN) ///如果中斷鏈未包含中斷
    ulRet = OEMTranslateIrq(ucCurrentInterrupt); ////在IRQ 和SYSINTR之間轉換此函數返回IRQ對應的SYSINTR
    
    PICEnableInterrupt(ucCurrentInterrupt FALSE); ///啟用除當前中斷以外的所有中斷
  } ///else if
  OEMIndicateIntSource(ulRet); ///通知內核已經發生SYSINTR中斷
 }

[]  []  []  


From:http://tw.wingwit.com/Article/program/SQL/201311/16412.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.