S3C4480X平台上μC/OS-Ⅱ的中断系统设计 02
![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
S3C4480X平台上μC/OS-Ⅱ的中断系统设计 02
将中断服务程序切换到SYS模式下运行。这种处理方式能够保证产生中断嵌套时,被中断的模式是SYS模式而不是IRQ/FIQ模式自身,IRQ/FIQ模式中的LR保存着回到SYS模式的返回地址,SYS模式中的LR未被破坏,保存着函数返回地址。在移植中使用UND模式替代SYS模式作为中断服务的运行模式,这样可以实现中断嵌套的功能。
3.3 中断嵌套方式
嵌套应该采用半嵌套方式,并不需要完全嵌套方式。“半嵌套”是指不同设备中断之间可以嵌套,但是同一设备中断不能嵌套。这样设计既照顾了系统实时性的要求,又能让系统具有更明确和稳定的行为;否则,如果开发完全嵌套,中断服务的堆栈空间就存在不确定性,甚至中断响应时间上限也存在不确定性,这些显然不能满足嵌入式实时系统的需求。
通过设置CPSR寄存器的中断屏蔽位F/I来屏蔽系统的中断,这样的保护称为“硬保护”;通过设置中断屏蔽寄存器中的相应位以屏蔽某一具体的中断,这样的保护称为“设备保护”。要实现半嵌套方式,需要在中断进入和退出时,在适当的时候进行两种保护方式的切换:
①在进入设备保护后还没有读取数据时退出硬保护。
②在即将退出ISR,使能设备中断位之前,再次恢复系统的硬保护。
具体的实现过程如图4所示。
![](http://embed.chinaitlab.com/UploadFiles_4615/200905/20090505121633183.jpg) 3.4 IRQ中断设计
IRQ中断处理过程中涉及中断环境保护、处理器运行模式切换和中断环境恢复等过程。中断处理过程如下:
中断入口条件:IRQ中断屏蔽,LR是被中断模式的PC值,SPSR是被中断模式的当前处理器状态值,SP是IRQ模式的当前堆栈指针值。
①在IRQ模式下保存环境。
②判断是否为第一层中断,如果不是程序跳转到④。
③设置中断嵌套层数变量OSIntNesting值为1,切换到SVC模式以便将IRQ模式堆栈中保存的中断环境保存到任务堆栈中,当前任务SP指针保存到任务控制块中;然后切换到UND模式准备执行中断服务程序ISR,程序跳转到⑤。
④中断嵌套层数变量OSIntNesting加1,切换到UND模式,将保存在IRQ模式下的任务环境拷贝到ISR的堆栈中,即UND模式堆栈中。
⑤调用IRQ中断处理函数,执行中断服务程序。
⑥中断结束处理。屏蔽中断,递减中断嵌套计数,判断是否为最后一层。如果不是,继续执行中断服务;否则,执行任务调度,使优先级最高的任务运行。
⑦恢复上一层中断服务程序ISR的环境,执行上一层的中断服务程序。
具体的中断服务程序执行流程如图5所示。
![](http://embed.chinaitlab.com/UploadFiles_4615/200905/20090505121633240.jpg) 3.5 FIQ中断设计
μC/OS-II移植到S3C4480X之后,μC/OS-II没有对FIQ中断进行管理,这样可以为系统保留一个快速响应的中断源。如果在系统的设计过程中多个中断源都配置为FIQ中断,就要在中断入口处进行中断的分发,然后进入相应的中断服务程序中。这样会增加中断的响应时间,因此在系统设计中应该为FIQ中断设置单独的中断源。由于μC/OS-II没有对FIQ进行管理,所以FIQ中断程序需由用户单独设计。FIQ中断服务程序的执行流程如图6所示,发生FIQ中断后系统进入FIQ模式进行简单的环境保护,然后执行中断服务程序,最后恢复中断环境返回。所有这些工作都是在FIQ模式下完成的。
![](http://embed.chinaitlab.com/UploadFiles_4615/200905/20090505121634828.jpg) 4 系统测试
系统测试环境为北京恒丰锐科公司开发的hf44b0A三星arm7开发板和μC/OS-II v2.61版本。系统测试包括3个部分:定时器中断测试、IRQ中断测试和FIQ中断测试。 |
|
|
|
|
|