亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 650 | 回復(fù): 0
打印 上一主題 下一主題

嵌入式操作系統(tǒng)內(nèi)核實現(xiàn)(七) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-04-22 11:10 |只看該作者 |倒序瀏覽

3.1中斷概述
       簡單地說就是當(dāng)前的工作被一個突發(fā)事件打斷。例如,您正在看一本小說,突然電話鈴響了,你放下小說去接電話,在接電話的過程中,送快遞的人按響了您家的門鈴,您又暫時放下電話去開門。這樣一個事例已經(jīng)蘊含了所有的中斷相關(guān)的概念了。下面仔細(xì)的分析一下這個例子,看看它蘊含了那些中斷概念。首先,看小說是一個正常工作,電話鈴響表示一個中斷發(fā)生,您放下手中的書,并在書上做上標(biāo)簽記號(保存現(xiàn)場),然后,去接電話(電話響的中斷處理),門鈴響起(中斷嵌套了),再次放下電話(第二次保存現(xiàn)場),打開門(關(guān)于門鈴響的中斷處理),最后,回到電話旁繼續(xù)接電話(中斷恢復(fù)),打完電話繼續(xù)從標(biāo)簽處讀書(中斷恢復(fù))。
       為什么需要中斷呢?
       回答這個問題只需回答中斷的好處就行了?在中斷出現(xiàn)以前的計算機系統(tǒng)中,計算機采用查詢的方式監(jiān)控外部事件,由于外部事件一般為非周期事件,且外部設(shè)備相對CPU來說速度較慢,從而導(dǎo)致了CPU浪費大量的時間查詢或者等待I/O操作。中斷的引入使CPU不需要在I/O上花費大量的時間,CPU只在需要的時候處理I/O操作,這大大提高了CPU的利用率。
隨著計算機技術(shù)的發(fā)展,中斷概念得到進一步的擴展,被定義為導(dǎo)致程序正常執(zhí)行流程改變的事件。在實際的計算機系統(tǒng)中,中斷又可細(xì)分為以下三種類型:
· 中斷:相當(dāng)于傳統(tǒng)意義上的中斷,由CPU外部原因而改變程序執(zhí)行流程的過程,屬于異步事件,又稱為硬件中斷;
· 陷入:表示通過處理器所擁有的軟件指令,可預(yù)期地使處理器正在執(zhí)行的程序流程發(fā)生變化,有些處理器還伴隨著處理器運行模式的改變。在現(xiàn)代32位處理器核中基本上都帶有陷入指令,比如Motorola 6800系列中Trap指令,ARM中SWI指令,和Intel80x86中的INT指令。陷入指令的執(zhí)行是有意安排的,所以陷入操作屬于顯式事件。陷入在操作系統(tǒng)內(nèi)核中有著廣泛的應(yīng)用,操作系統(tǒng)的系統(tǒng)調(diào)用一般都基于陷入;
· 異常:異常事件是指CPU在運行過程中遇到諸如被0除,執(zhí)行非法指令,內(nèi)存保護故障等操作。異常沒有對應(yīng)的處理器指令,當(dāng)異常發(fā)生時,當(dāng)前運行的程序被無條件掛起,處理器的PC指向一個特定的地址,并開始執(zhí)行特定的程序。
對于實時嵌入式內(nèi)核來講,中斷是必不可少的機制,中斷有效地保證了具有時限要求的部分能夠得到及時的響應(yīng)。實時嵌入式內(nèi)核都應(yīng)該提供管理中斷機制,該機制應(yīng)該方便中斷處理程序開發(fā),并能使中斷服務(wù)程序與任務(wù)有效地結(jié)合起來。
3.2 中斷處理過程
       當(dāng)中斷發(fā)生后,到底需要哪些處理步驟呢?典型的步驟如下(摘自William Stallings的《操作系統(tǒng)內(nèi)核與設(shè)計原理》):
       1. 中斷事件給處理器發(fā)送一個中斷請求信號;
2. 處理器在響應(yīng)中斷請求信號前掛起當(dāng)前指令;
3. 處理器對中斷進行判定,確定中斷的存在,并給提交中斷的設(shè)備發(fā)送確認(rèn)信號;
4. 處理器為轉(zhuǎn)移到中斷處理程序做準(zhǔn)備。首先,需要保存從中斷點恢復(fù)所需的信息,這些信息至少包括程序狀態(tài)字(PSW)和程序計數(shù)器(PC)的下一條指令位置;
5. 處理器把響應(yīng)這個中斷的中斷處理程序入口地址裝入程序寄存器。一旦完成對程序計數(shù)器的裝入,處理器則繼續(xù)下一個指令周期,這時中斷服務(wù)程序開始執(zhí)行;
到目前為止,完成了中斷檢測和現(xiàn)場保護階段的工作,中斷處理部分主要完成中斷服務(wù)程序的執(zhí)行,中斷服務(wù)程序一般由用戶編寫。當(dāng)中斷服務(wù)程序結(jié)束時,中斷處理進入中斷恢復(fù)步驟,這主要細(xì)分為以下兩步:
6. 恢復(fù)中斷前被保存在相應(yīng)棧中的寄存器內(nèi)容;
7. 最后的動作從棧中恢復(fù)PSW和程序計數(shù)器的值。這時程序恢復(fù)到被中斷前的狀態(tài),并開始運行。
3.3 中斷管理的實現(xiàn)
       對于應(yīng)用程序而言,應(yīng)用人員希望只需編寫中斷處理程序,對于其他的中斷處理步驟都不需要了解和關(guān)心,比如中斷現(xiàn)場保護,中斷恢復(fù)等等,這應(yīng)該算是中斷管理的第一個目標(biāo);第二目標(biāo)就是對于一個中斷(如定時器中斷),它可以有多余一個的中斷處理程序。為了達(dá)到這個效果,內(nèi)核應(yīng)該怎樣來實現(xiàn)呢?
在談及實現(xiàn)之前,有必要先看看向量中斷和非向量中斷。多數(shù)處理器都提供向量中斷和非向量中斷,向量中斷是指芯片為每個中斷分配一個入口地址,當(dāng)中斷發(fā)生時直接就能進入相應(yīng)的服務(wù)程序,因此有較快中斷響應(yīng)時間。非向量中斷為一類中斷分配一個入口地址,這類中斷共享一個入口地址,當(dāng)中斷發(fā)生時,還需要確定具體的中斷。例如,三星公司的S3C44B0X處理器,該芯片采用ARM7TDMI核,提供26個中斷源,可以配置成向量中斷和非向量中斷。向量中斷有很好的中斷響應(yīng)時間,但可移植性差,如同樣采用ARM7TDMI核的S3C44B0X和LPC2114對向量中斷的實現(xiàn)都相差很大。所以ByCore沒有采用向量中斷。
下面可以看看ByCore的具體實現(xiàn)了。
       ByCore對中斷管理的實現(xiàn)很簡潔(主要是復(fù)雜的我還設(shè)計不出來!~_~),由于中斷管理與具體的硬件有關(guān),所以在該小節(jié)中的論述是建立在這樣一個前提下,該前提就是當(dāng)前已經(jīng)完成了中斷現(xiàn)場保護,除此之外沒有涉及到中斷恢復(fù),因為這些和處理器有關(guān),所以將這些內(nèi)容放到內(nèi)核移植一章中敘述。
前面提到,中斷實現(xiàn)的最終目的之一是讓一個中斷可以對應(yīng)多個不同的中斷處理程序。實現(xiàn)的基本思想為,首先將中斷源按順序編號,然后,當(dāng)中斷發(fā)生時,根據(jù)中斷源調(diào)用相應(yīng)的中斷處理程序。為此,內(nèi)核中設(shè)計了描述中斷的數(shù)據(jù)類型如下所示:
typedef struct isr_desc{
list_t link;
void (*pisr)();
}isr_t;
這個結(jié)構(gòu)體包括兩個成員,link和(*pisr)( ),link主要起到連接作用,通過link域可以把ist_t類型連成雙鏈表。(*pisr)( )是函數(shù)指針,它指向中斷處理程序的入口地址。對于一個有n個中斷源的處理器,首先,將n個中斷源從0開始編號,初始化時創(chuàng)建一個list_t israrry [n]的數(shù)組(lsit_t對應(yīng)第i號中斷)。該數(shù)組中的israrry 就是中斷源為i編號相關(guān)中斷處理程序隊列的隊頭。其結(jié)構(gòu)如圖3.1所示。

  
圖3.1 中斷處理結(jié)構(gòu)
       有了圖3.1的描述,就可以實現(xiàn)一個中斷處理程序來回調(diào)每個isr_t結(jié)構(gòu)中的(*pisr)( ),而(*pisr)( )所指向的正式用戶編寫的中斷處理程序。ByCore中使用了isrHandler( )函數(shù)來實現(xiàn)這個回調(diào)。isrHandler( )的實現(xiàn)如下所示:
void isrHandler(void){
  uword_t isrnum;
  list_t *plist;
  isr_t *phdl;

  int_cnt++;
  int_flag = TRUE;

  isrnum = get_isr_num();                          ①
  plist = israrry[isrnum].prev;                      ②
  do{
    if(plist != &israrry[isrnum]){
      phdl = mac_find_entry(plist,isr_t,link);
      phdl->pisr();
      plist = plist->prev;
    }
  }while(plist != israrry[isrnum].prev);
  isr_clr_pending(isrnum);                              ③
  scheduler();
}
       在①處的get_isr_num()函數(shù)和具體的處理器有關(guān),它的功能是得到中斷源,在ARM中,實際上是查詢I_ISPR寄存器,該寄存器記錄了中斷源。從②處開始,根據(jù)得到的中斷號,檢索israrry[]數(shù)組,并回調(diào)pisr()指向的用戶中斷處理函數(shù)。③處的isr_clr_pending()函數(shù)是清楚硬件的中斷標(biāo)志位,保證下次中斷。下面的代碼為get_isr_num()和isr_clr_pending()的實現(xiàn),它們的實現(xiàn)與處理器有關(guān)。
uword_t get_isr_num(void){
  uword_t tmp;
  uword_t renum = 0;

  tmp = rI_ISPR;
  while(tmp != 0){
    tmp >>= 1;
    renum++;
  }
  return renum-1;
}

void isr_clr_pending(uword_t isr_num){
  uword_t tmp = 1;
  
  while(isr_num-- > 0)
    tmp

  rI_ISPC |= tmp;
}
       現(xiàn)在留下最后一個問題沒解決了,當(dāng)一個中斷處理程序編寫完畢以后,怎樣讓它注冊到內(nèi)核中呢?具體的說就是在israrry[]中的適當(dāng)位置添加一個節(jié)點。ByCore實現(xiàn)了一個這樣的函數(shù)isrInstall(),它的原型與實現(xiàn)如下:

void isrInstall(uword_t IntNum, void (*phdl)()){
  isr_t *ptmp;

  ptmp = (isr_t*)kmalloc(sizeof(isr_t));
  if(ptmp != NULL){
    ptmp->pisr = phdl;
    add_node_seque_rear(&israrry[IntNum],&ptmp->link);
  }
}
       isrInstall()需要兩個參數(shù),一個是IntNum和phdl指針,前者說明了中斷編號,后者指向該中斷號的處理程序。isrInstall()的實現(xiàn)非常簡單,申請一個isr_t類型的空間,然后將isr_t的pisr指針指向phdl,然后,將此isr_t類型添加到israrry[]數(shù)組。
       到此為止,中斷部分也差不多結(jié)束了。最后需要說明的是中斷編號問題,至于怎樣去將一個處理器的中斷編號,ByCore不會很在意,只需注意的是israrry[]數(shù)組的編號與實際的中斷的編號應(yīng)該一一對應(yīng)。還有就是israrry[]數(shù)組的大小為實際處理器中斷的個數(shù)。
OK!see you next time!


本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u1/59291/showart_572382.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP