嵌入式實時操作系統(tǒng)_第1頁
嵌入式實時操作系統(tǒng)_第2頁
嵌入式實時操作系統(tǒng)_第3頁
嵌入式實時操作系統(tǒng)_第4頁
免費預覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、.ecos中斷機制分析(1)    不同的微處理器提供的中斷處理機制不相同,ecos對各種處理機制作了一定的抽象,提供了一種通用的中斷處理機制。下面以m68k的mcf52xx系列處理器為例分析。當中斷產(chǎn)生時,ecos的一段跳轉(zhuǎn)程序使處理器跳轉(zhuǎn)到相應的VSR,對mcf52xx處理器來說這段跳轉(zhuǎn)程序就是中斷向量表,當然不同處理器的跳轉(zhuǎn)程序有不同的實現(xiàn)方式。VSR作了一些簡單處理后,會調(diào)用中斷服務程序(ISR)作進一步處理,對ISR的調(diào)用采用尋找中斷服務程序向量表的方式。有些中斷在ISR結(jié)束后還會調(diào)用延遲服務程序(DSR)作進一步處理。以下是構(gòu)成mcf52xx的中斷向量表的匯編代

2、碼:/*/*      ROM vector table   */        .macro  hw_vsr name        .long   hw_vsr_name        .endm        .s

3、ection ".romvec","ax"        .globl  rom_vsr_tablerom_vsr_table:        /*   0 - Initial SSP                 &

4、#160;          */        hw_vsr  stack                     /*   1 - Initial PC     &#

5、160;                       */        hw_vsr  reset        /*   2-24 - Default exception handlers 

6、60;        */        .rept   24-2+1        hw_vsr  default        .endr        /*   25-31 - Autovect

7、or interrupts 1-7          */        .rept   31-25+1        hw_vsr  autovec        .endr        /*&#

8、160;  32-63 - Default exception handlers         */        .rept   63-32+1        hw_vsr  default        .endr     

9、   /*   64-255 - User interrupt vectors            */        .rept   255-64+1        hw_vsr  interrupt      &#

10、160; .endr        .equ    rom_vsr_table_size, . - rom_vsr_table  這段代碼構(gòu)成了中斷向量表,假設(shè)處理器按rom方式啟動,通過鏈接腳本.ld文件將該中斷向量表的起始位置放在復位后PC入口位置(假設(shè)為0xFFE00000),該向量表在rom中的存儲示意圖如下圖:              

11、                       當復位中斷產(chǎn)生時,處理器首先從0xFFE00000取出一個長字來初始化堆棧寄存器SP,然后取出緊跟著的一個長字來初始化PC,此時PC值為hw_vsr_reset,也即一段向量服務程序(VSR)的入口地址。同樣,當其他中斷(或例外)產(chǎn)生時,mcf52xx處理器自動將一個32位狀態(tài)字和PC壓棧,如下圖所示:其中VECTOR7:0為當前中斷的中斷向

12、量號,SR(STATUSREGISTER) 10:8三位為當前中斷級別,用于屏蔽低于或等于當前級別的中斷,之后處理器會根據(jù)中斷號從中斷向量表中獲得相應向量服務程序(VSR)的入口地址。這里重點分析64到255號中斷的向量服務程序。        .equ      int_pres_regs_sz,(2+3)*4)        .macro    int_pres_regs&

13、#160;       lea.l     -int_pres_regs_sz(%sp),%sp        movem.l   %d0-%d2/%a0-%a1,(%sp)        .endm        .macro    in

14、t_rest_regs        movem.l   (%sp),%d0-%d2/%a0-%a1        lea.l     int_pres_regs_sz(%sp),%sp        .endm  首先定義了兩個宏int_pres_regs和int_rest_regs分別用于壓棧和恢復d0,d1,d2

15、,a0,a1五個寄存器,即對CPU狀態(tài)進行一定程度的保存。        .text        .balign 4hw_vsr_interrupt:        int_pres_regs                move.l

16、#(-64+7)*4,%d0  hw_vsr_int_common:                                         move.w  in

17、t_pres_regs_sz(%sp),%d1           and.l   #0x000003fc,%d1                              

18、60;    add.l   %d1,%d0            asr.l   #2,%d1         這里獲取65-255號中斷ISR入口地址在中斷服務程序(ISR)向量表存放的位置。前面提到VSR作了一些簡單處理后,會調(diào)用中斷服務程序(ISR)作進一步處理,對ISR的調(diào)用采用從中斷服務程序向量表

19、獲取ISR入口地址的方式。 mcf52xx系列ISR向量表實際是一個數(shù)組cyg_hal_interrupt_handlers,那么數(shù)組里保存的ISR入口地址是什么時候存進去的呢?,原來用戶在添加ISR的時候會通過cyg_drv_interrupt_attach()函數(shù),該函數(shù)將該ISR的入口地址按中斷向量號順序存入ISR向量表數(shù)組。具體實現(xiàn)如下:#define HAL_INTERRUPT_ATTACH( _vector_, _isr_, _data_, _object_ )        CYG_MACRO_START   

20、                                                   cyg_

21、uint32 _index_;                                                 

22、HAL_TRANSLATE_VECTOR(_vector_), _index_);                           if (cyg_hal_interrupt_handlers_index_             &#

23、160;                    =(CYG_ADDRESS)&hal_arch_default_isr)                          

24、                                                   

25、;                      cyg_hal_interrupt_handlers_index_ = (CYG_ADDRESS)(_isr_);         cyg_hal_interrupt_data_index_ = (CYG_ADDRWORD)(_data_);     &

26、#160;      cyg_hal_interrupt_objects_index_ = (CYG_ADDRESS)(_object_);                                    

27、;                                       CYG_MACRO_END其中HAL_TRANSLATE_VECTOR宏又定義為:#define HAL_TRANSLATE_VECTOR(_vect

28、or_,_index_)                              CYG_MACRO_START                   

29、0;                                      switch (_vector_)            &

30、#160;                                                   

31、;                                                  

32、;          case CYGNUM_HAL_VECTOR_AUTOVEC1 . CYGNUM_HAL_VECTOR_AUTOVEC7:              (_index_) = (_vector_) - CYGNUM_HAL_VECTOR_AUTOVEC1);            

33、0;      break;                                            &#

34、160;                  case CYGNUM_HAL_VECTOR_INTRFIRST . CYGNUM_HAL_VECTOR_INTRLAST:             (_index_) = (_vector_)         &#

35、160;                                                  &

36、#160; - CYGNUM_HAL_VECTOR_INTRFIRST                                            + (CYGNUM_HAL_VE

37、CTOR_AUTOVEC7                                               - CYGNUM_HAL_VECTOR_

38、AUTOVEC1                                             + 1);      &

39、#160;                                           break;       

40、0;                                                  

41、60;   default:                                               

42、;                     CYG_FAIL("Unknown Interrupt!");                        

43、60;              (_index_) = (typeof(_index_)-1;                                 

44、0;                                                  

45、60;                     CYG_MACRO_END   上面兩段宏顯示了ISR向量表數(shù)組的構(gòu)成,cyg_hal_interrupt_handlers0到cyg_hal_interrupt_handlers6為25-31號Autovector interrupts1-7的ISR程序入口地址,cyg_hal_interrupt_handlers7到cyg_hal_in

46、terrupt_handlers198為64-255號User interrupt的ISR程序入口地址。      例如產(chǎn)生的是第70號中斷,那么是剛才那段匯編程序獲得ISR程序入口地址在cyg_hal_interrupt_handlers 數(shù)組中存放位置?   當70號中斷產(chǎn)生時,MCU將自動壓棧32位狀態(tài)字和PC,因為狀態(tài)字里VECTOR7:0保存了中斷向量號,所以根據(jù)這個向量號就可以換算出ISR放在cyg_hal_interrupt_handlers數(shù)組的位置了。  hw_vsr_interrupt

47、:        int_pres_regs                move.l #(-64+7)*4,%d0     hw_vsr_int_common:                &#

48、160;                        move.w int_pres_regs_sz(%sp),%d1    /出棧32位狀態(tài)字        and.l   #0x000003fc,%d1    &#

49、160; /獲取VECTOR7:0              add.l   %d1,%d0      /d0為ISR程序入口地址在                     

50、60;       /cyg_hal_interrupt_handlers數(shù)組的相對位置        asr.l   #2,%d1       /d1為中斷向量號   獲取了ISR入口地址,接下來該調(diào)用ISR了。             

51、 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT        .extern cyg_scheduler_sched_lock                addq.l #1,cyg_scheduler_sched_lock    /將調(diào)度器上鎖次數(shù)增加1#endif    

52、;    pea     (%sp)                              .extern cyg_hal_interrupt_objects         

53、    lea     cyg_hal_interrupt_objects,%a0           move.l (%a0,%d0.l),-(%sp)        .extern cyg_hal_interrupt_data             &#

54、160;   lea     cyg_hal_interrupt_data,%a0              move.l (%a0,%d0.l),-(%sp)        .extern cyg_hal_interrupt_handlers          

55、60;   lea     cyg_hal_interrupt_handlers,%a0          move.l (%a0,%d0.l),%a0        move.l %d1,-(%sp)                 &#

56、160; 這一段主要為調(diào)用static cyg_uint32 isr(CYG_ADDRWORD vector, CYG_ADDRWORD data)以及void interrupt_end(cyg_uint32 isr_ret, Cyg_Interrupt *intr,HAL_SavedRegisters *regs)作準備, 將函數(shù)需要的參數(shù)*intr,vector和data壓棧                                           jbsr   (%a0)     &

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論