



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
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)成了中斷向量表,假設處理器按rom方式啟動,通過鏈接腳本.ld文件將該中斷向量表的起始位置放在復位后PC入口位置(假設為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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 海洋生物入侵種防控考核試卷
- 精密陶瓷制造設備考核試卷
- 針織服裝的設計與產(chǎn)品生命周期管理考核試卷
- 連續(xù)搬運設備人機交互設計考核試卷
- 國培學習成果總結(jié)匯報
- 白血病疾病查房
- 口腔護理工藝流程圖解
- 胸部CT常見疾病診斷要點
- 口腔黏膜炎護理
- Gilvusmycin-生命科學試劑-MCE
- 【企業(yè)薪酬管理研究國內(nèi)外文獻綜述4400字】
- 市政公用工程設計文件編制深度規(guī)定(2013年高清版)
- GB/T 19139-2012油井水泥試驗方法
- GB/T 18314-2001全球定位系統(tǒng)(GPS)測量規(guī)范
- 工貿(mào)行業(yè)重點可燃性粉塵目錄(2022版)
- 鐵道概論試題及答案重要
- 空間幾何中的平行與垂直 新高考 數(shù)學 一輪復習專項提升 精講精練
- 近代史期末復習試題
- 教學設計 完整版:Summer holiday plans
- 2022年武漢市法院書記員招聘考試題庫及答案解析
- DB34-T 4010-2021 水利工程外觀質(zhì)量評定規(guī)程-高清現(xiàn)行
評論
0/150
提交評論