



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.ecos中断机制分析(1) 不同的微处理器提供的中断处理机制不相同,ecos对各种处理机制作了一定的抽象,提供了一种通用的中断处理机制。下面以m68k的mcf52xx系列处理器为例分析。当中断产生时,ecos的一段跳转程序使处理器跳转到相应的VSR,对mcf52xx处理器来说这段跳转程序就是中断向量表,当然不同处理器的跳转程序有不同的实现方式。VSR作了一些简单处理后,会调用中断服务程序(ISR)作进一步处理,对ISR的调用采用寻找中断服务程序向量表的方式。有些中断在ISR结束后还会调用延迟服务程序(DSR)作进一步处理。以下是构成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 这段代码构成了中断向量表,假设处理器按rom方式启动,通过链接脚本.ld文件将该中断向量表的起始位置放在复位后PC入口位置(假设为0xFFE00000),该向量表在rom中的存储示意图如下图:
11、 当复位中断产生时,处理器首先从0xFFE00000取出一个长字来初始化堆栈寄存器SP,然后取出紧跟着的一个长字来初始化PC,此时PC值为hw_vsr_reset,也即一段向量服务程序(VSR)的入口地址。同样,当其他中断(或例外)产生时,mcf52xx处理器自动将一个32位状态字和PC压栈,如下图所示:其中VECTOR7:0为当前中断的中断向
12、量号,SR(STATUSREGISTER) 10:8三位为当前中断级别,用于屏蔽低于或等于当前级别的中断,之后处理器会根据中断号从中断向量表中获得相应向量服务程序(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状态进行一定程度的保存。 .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作了一些简单处理后,会调用中断服务程序(ISR)作进一步处理,对ISR的调用采用从中断服务程序向量表
19、获取ISR入口地址的方式。 mcf52xx系列ISR向量表实际是一个数组cyg_hal_interrupt_handlers,那么数组里保存的ISR入口地址是什么时候存进去的呢?,原来用户在添加ISR的时候会通过cyg_drv_interrupt_attach()函数,该函数将该ISR的入口地址按中断向量号顺序存入ISR向量表数组。具体实现如下:#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向量表数组的构成,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程序入口地址。 例如产生的是第70号中断,那么是刚才那段汇编程序获得ISR程序入口地址在cyg_hal_interrupt_handlers 数组中存放位置? 当70号中断产生时,MCU将自动压栈32位状态字和PC,因为状态字里VECTOR7:0保存了中断向量号,所以根据这个向量号就可以换算出ISR放在cyg_hal_interrupt_handlers数组的位置了。 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位状态字 and.l #0x000003fc,%d1
49、160; /获取VECTOR7:0 add.l %d1,%d0 /d0为ISR程序入口地址在
50、60; /cyg_hal_interrupt_handlers数组的相对位置 asr.l #2,%d1 /d1为中断向量号 获取了ISR入口地址,接下来该调用ISR了。
51、 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT .extern cyg_scheduler_sched_lock addq.l #1,cyg_scheduler_sched_lock /将调度器上锁次数增加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; 这一段主要为调用static cyg_uint32 isr(CYG_ADDRWORD vector, CYG_ADDRWORD data)以及void interrupt_end(cyg_uint32 isr_ret, Cyg_Interrupt *intr,HAL_SavedRegisters *regs)作准备, 将函数需要的参数*intr,vector和data压栈 jbsr (%a0)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届江苏省新沂市第四中学七下数学期末检测模拟试题含解析
- 内部控制与风险评估试题及答案
- 2025届江苏省苏州市新草桥中学八下数学期末教学质量检测试题含解析
- 计算机VB考试挑战突破试题及答案
- 课题研究与教学创新计划
- 领导力发展培训的重点方向计划
- 人才发展与继任计划
- 2024年云南省水利厅下属事业单位真题
- 保密排查报告
- 客户需求分析与市场定位总结计划
- 销售商品收入
- 《做一只努力向上的蜗牛》励志教育主题班会
- 电子商务教学中的信息沟通与互动表现试题及答案
- 科研项目风险管理与防范措施
- 2025年江西省三支一扶考试真题
- 青马工程笔试题库及答案
- 乐理考试题及答案2024
- Unit1 Making friends A Let's talk(教学设计)-2024-2025学年人教PEP版英语三年级上册
- 2025年云南省文山州事业单位招聘历年自考难、易点模拟试卷(共500题附带答案详解)
- 2025届新高考物理冲刺复习:用动量定理解决带电粒子在磁场中的运动问题
- 2025年春沪科版七年级数学下册 第9章 分式 小结与复习
评论
0/150
提交评论