欢迎来到天天文库
浏览记录
ID:37322850
大小:365.84 KB
页数:26页
时间:2019-05-21
《C语言进阶-第六讲中断与驱动》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第六讲第六讲中断与设备驱动中断与设备驱动((Interrupt&DeviceDriverInterrupt&DeviceDriver))凌明trio@seu.edu.cn东南大学国家专用集成电路系统工程技术研究中心www.cnasic.com中断的分类硬件中断(HardwareInterrupt):一般是由外部(相对CPU内核而言)的硬件引起的事件,比如串口来数据,键盘击键等;软件中断(SoftInterrupt):通过在程序中执行的中断指令引起的中断,又叫软陷;80X86:int指令68000:trap指令ARM:SWI指令软中断指令
2、一般用于操作系统的系统调用入口;异常(Exception):由于CPU内部在运行过程中引起的事件,比如指令预取错,数据中止,未定义指令等等,异常事件一般由操作系统接管。www.cnasic.com中断的处理过程虽然中断产生的原因不同,但是中断响应的硬件过程基本上是相同的。拷贝CPSR到SPSR_设置正确的CPSR位硬件完成切换到ARM状态切换到异常模式禁止中断保存返回地址在LR_设置PC到异常向量地址中断服务程序可能保存需要使用的寄存器(堆栈中)中断服务用户服务程序可以打开中断,以接受中断嵌套程序完成恢复保存的寄
3、存器通过调用Reti(或其他相应指令)指令将PSR和PC出栈,从而恢复原来的执行流程。www.cnasic.com如何强调中断的重要性都不过份,我们将在内核的中断的重要性!!实现中详细介绍!理解处理器对中断的管理以及这其中的堆栈管理对于理解操作系统是至关重要的!中断是操作系统的入口,用户访问操作系统提供的服务的唯一途径是依靠中断来实现的。实时系统对异步事件的处理,依靠的是中断!任务的调度靠的是中断系统调用的实现靠的是中断在有MMU的系统中,虚存的管理也是依靠中断!中断是理解操作系统的入口!!www.cnasic.com调用栈和中断栈的不
4、同HighHighLastargReturnAddress……PSRFirstargSavedRegsReturnAddressAutomaticorScratchVars……中断栈AutomaticorScratchVarsSavedRegsLowLow调用栈www.cnasic.comC语言中的中断处理在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序(ISR),类似于__interrupt、#programinterrupt当一个函数被定义为ISR的时候,编译器会自动为该函数增加中
5、断服务程序所需要的中断现场入栈和出栈代码。www.cnasic.com用C编写中断服务程序应该注意的不能返回值;不能向ISR传递参数;ISR应该尽可能的短小精悍;printf(char*lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。(在ARM平台上由于半主机机制,该函数的速度更慢!)其实还包括所有的不可重入的函数都不应该在中断中使用。程序员应该仔细地评估ANSIC库函数和OS的系统调用浮点运算以及其他的耗时操作都不应该在中断程序中使用www.cnasic.com加快中断处理程序的方法在中断处理程序中只进
6、行最基本的硬件操作,比如读出硬件寄存器的数据,或者改变状态寄存器的值然后通过一定的方法将中断的事件做一个标志,在离开中断处理程序后,由其他代码根据中断标志进行后续的处理这样做的好处是大大加快了中断的处理时间常见的方法:在没有OS的情况下可以使用自定义的队列,在中断处理程序之外的主循环中对中断的事件进行处理。Linux下的Bottomhalf&TophalfASIXOS中的系统任务www.cnasic.com没有OS的中断服务队列/*存放中断的队列*/While(1)//在主循环中检查中断并处理之typedefstructtagIntQu
7、eue{{If(!IsIntQueueEmpty())intintType;/*中断类型*/{structtagIntQueue*next;intType=GetFirstInt();}IntQueue;switch(intType)/*是不是很象WIN32程序的消息解析函数?*/IntQueuelpIntQueueHead;{/*对,我们的中断类型解析很类似于消息驱动*/__interruptISRexample()casexxx:/*我们称其为"中断驱动"吧?*/{…intintType;break;intType=GetSyste
8、mType();casexxx:QueueAddTail(lpIntQueueHead,intType)…;/*在队列尾加入新的中断*/break;}…}}}www.cnasic.com有OS的情况下中断将
此文档下载收益归作者所有