



下載本文檔
版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025新版工程裝修合同8篇
- 專題節(jié)目許可使用協(xié)議范本7篇
- 上海市二手車買賣合同書范本5篇
- 浙江雙邊框護欄網(wǎng)施工方案
- 小學二年級數(shù)學三位數(shù)加減三位數(shù)計算質(zhì)量自測題大全附答案
- 虞美人(春花秋月何時了)(教學設(shè)計)-2024-2025學年高一語文必修上冊同步備課系列(統(tǒng)編版2019)
- 企業(yè)廣告設(shè)計服務合同模板
- 大理石瓷磚地面施工方案
- 平口混凝土攪拌機施工方案
- 18 老人車(教學設(shè)計) -小學科學二年級機械結(jié)構(gòu)課程
- 《服裝品牌策劃》課件
- 近五年陜西中考數(shù)學真題及答案2024
- 二零二五年度集團公司內(nèi)部項目專項借款合同范本3篇
- 低空飛行旅游觀光項目可行性實施報告
- 2024年版:煤礦用壓力罐設(shè)計與安裝合同
- 2024年貴州云巖區(qū)總工會招聘工會社會工作者筆試真題
- 廉潔應征承諾書
- 胎心監(jiān)護及判讀學習教案
- SAP-ABAP-實用培訓教程
- 風電場220kV升壓站及風場電氣設(shè)備預防性試驗及維護技術(shù)措施
- [方案]隱框玻璃幕墻施工方案
評論
0/150
提交評論