1、中断的概念
中断的概念是在20世纪50年代中期提出的,是计算机中的一个很重要的技术,它既和硬件有关,也和软件有关。正是因为有了中断技术,才使得计算机的工作更加灵活、效率更高。中断技术的出现使得计算机的发展和应用大大的推进了一步。所以,中断功能的强弱已成为衡量一台计算机功能完善与否的重要指标。
最初引进中断技术的目的是为了提高计算机输入输出的效率,改善计算机的整体性能。
当CPU需要与外部设备交换一批数据时,由于CPU的工作速度远远高于外设的工作速度,每传送一组数据后,CPU等待“很长”时间才能传送下一组数据,在等待期间CPU处在空运行状态,造成CPU的浪费。
所谓中断是指计算机在执行其他程序的过程中,当出现了某些异常事件或某种请求时,CPU暂时中止正在执行的程序,而转去执行对异常事件或某种请求的服务程序。当服务完毕后,CPU再回到被暂时中止的程序继续执行。
用汇编语言和中断函数,细微差别还是有的:
汇编的RETI ,相等于C语言的最后一个}
中断一般是由硬件触发,不是CPU主动执行的
主程序是响应,中断服务完成后回到断点继续执行主程序
3、中断的优先级
计算机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为其服务的时候,就存在CPU优先响应哪一个中断源请求的问题。通常根据中,断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它更高的中断源请求,CPU暂停原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低优先级中断的服务程序,这样的过程称为中断嵌套。
实际就是主线程被中断打断
看看汇编的中断过程:
这里如果正在执行高优先级中断的时候
低优先级中断来了,会不会丢失?
姚总补充,不会的,会全部挂起,等高优先级处理完再处理低优先级..........
注意最早的8051没有能力挂起,就丢失了低优先级的响应
而现在STC的芯片改进了,低优先级的也会响应,不过是要
排队等待............姚总补充:现在STC芯片的响应时钟大约是6个
已经很快了,就算当前执行的是LCALL,执行完也是马上响应新的中断
新中断也是LCALL,3个时钟+3个时钟=6个时钟
指令是不能分割的,只要下条指令没有执行,收到中断,肯定是保护现场后去执行中断了
2个中断优先级存在竞争的时候,对数据的采集可能会有影响
例如生物信息检测,数据量很大,并且实时性要求高
用ADC采集模拟量转换为数字量存储,或者同时通过串口上传的PC机
由PC上位机程序去处理。这2件事都很耗时间,ADC中断设最高,串口就经常被打断
造成通讯不可靠,如果倒过来串行通信的优先级高,ADC的采集就不均匀(漏数据)
光靠中断就不行,要加上DMA功能,解放CPU!
姚总的8位单片机都有DMA功能!ADC采集数据工作,启动后不需要反复中断CPU,
采集到一定程度,我通过DMA直接传输数据后再报告CPU。
挂起这个概念就和ARM芯片类似了,不会丢失!
再一个就是自动保护断点:
中断的优势:
开关中断:
6、保护现场和恢复现场
在主程序调用子程序或中断处理过程时,分别要保存返回地址(断点地址)和保护现场,以便在返回时能够回到调用前的程序段,继续运行原来的程序。进入子程序或中断处理程序后保护相关寄存器中的值的操作,叫做保护现场;子程序返回或中断处理返回前,恢复相关寄存器中的值的操作,叫做恢复现场。保护现场的方法是将现场条件(寄存器的值)先推入(使用PUSH命令)堆栈保存,然后再使用这些寄存器,返回主程序前,弹出(使用POP指令)寄存器的值
。这些功能都要通过堆栈操作来实现。
其中通用寄存器的保存和恢复需要由堆栈操作指令来完成;返回地址的保存与恢复的堆栈操作都是在相应的子程序的调用和返回指令的操作中自动完成的,无需再用专门的堆栈操作指令。
堆栈是后进先出的:
和子弹夹子一样
基本上,汇编程序第一句就是指定堆栈地址:
8051堆栈的默认值是07H,刚好和工作寄存器的R7(0区的R7)重合
我肯定不希望堆栈把R7工作寄存器占用了,所以上来就 MOV SP, #80H
特别是STC的单片机 ,把高128个字节(内部RAM),都可以使用了
如果堆栈不需要很大,可以MOV SP, #D0H
实际堆栈就是保护现场的数据存储的地方............
8、中断的撤除
在响应中断请求后,返回主程序之前,该中断请求标志应该撤除,否则,单,片机执行完中断服务程序会误判为又发生了中断请求而错误地再次进入中断服务程序。单片机中有些中断请求标志会自动撤除,有些不能自动撤除,必须用户使用相应的指令撤除。