完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
想全面了解一个事物:首先问几个问题:
1.本质是什么? 2.第一原则是什么? 3.结构是什么? 要解决上面的问题,需要从3W开始做起: What? How? Why? what? 维基百科给的一句话定义:在计算机科学中,中断是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。 举个很简单的例子:假如你是CPU,你正在执行的任务是——坐在沙发上看电影,但同时你叫了外卖(可以看成一个外设启动),那么你肯定需要在某个时刻,暂停电影去取外卖(执行的操作)。这时,你有两种选择: 1.从叫外卖的时刻起,就暂停电影,一直在门口等着,直到外卖送过来。 2.送餐员给你打电话后,你才暂停电影,去取外卖。 作为一个正常人,我们肯定会选择后者。但对于CPU来讲他却没那么智能,前者就是所谓的轮询方式(polling),后者就是所谓中断方式(interrupt)。 再通过wiki百科的解释加深一下印象: 引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只需要付出一些很小的切换所引发的时间代价。(这段话读起来和并行的系统调度有点像) 对于【中断】,是一个比较大的范畴,想要研究它,需要按照不同的特性进行【分类】 从中断的【产生方式】分类: 硬件中断:由电路/外围设备产生的中断 软件中断:也成为软中断,是一条CPU指令,经过这个中断后,会被切换到一个子例程中,实现【系统调用】(system call) 硬件中断又根据【必要性】分为: 可屏蔽中断 非可屏蔽中断 how? 中断触发方式: 状态触发方式: 在依状态触发的中断系统中,一个等待响应的中断会在中断请求线路上以特定 的电位标示,如高电位(1)或低电位(0)。 边沿触发方式 中断设备向中断线路发送一个脉冲作为中断信号,可以是通过上升沿还是下降 沿来选择。 混合模式 状态触发与边沿触发兼顾 消息信号 类似于边沿触发方式,是一种瞬间产生的中断请求,不过这是通过计算机总线, 发送一串比特码来实现中断请求。 在stm32进行开发时,有一个文件:stm32xx_it.c存放中断服务函数,例如: 在这里面,会调用HAL库函数进行中断处理,而HAL_PPP_IRQHandler(&huart1);最中会调用用户自定义的CallBack回调函数,从而完成特定的事件。那么,程序是如何进入中断服务函数PPP_IRQHandler的呢? 按照对C语言的理解,在main函数中,理应会存在一个入口,用以进入某个函数,但实际上却没能发现这个入口。 经过查阅可知,程序进入中断服务函数的方法,是通过某种触发(大部分是硬件触发) 程序找到他的方式是怎样的? 以串口中断为例,在启动文件startup_stm32f10x_md.s中有这样三句与串口中断相关的代码 DCD USART1_IRQHandler EXPORT USART1_IRQHandler [WEAK] USART1_IRQHandler 汇编指令:DCD USART1_IRQHandler DCD 是一条数据定义的【伪指令】,用于分配一篇连续的【字】存储单元,并用指定的数据初始化。 例如: DataTest DCD 4 , 5 ;分配一片连续的字存储单元并初始化。 汇编指令:EXPORT USART1_IRQHandler EXPORT ,表示本程序里面用到的变量提供给其他模块调用的 也就是说声明了一个USART1_IRQHandler标签供外部引用 可能是用来供stm32f4xx_it.c文件中进行引用的。 由此一来, 当配置好USART1的控制寄存器中断使能时,当发生中断(异常)时,该异常被Cortex-M3内核接受,对应的异常Handler就会执行。而这个响应过程都是硬件来完成的,当然为了决定Handler的入口地址,Cortex-M3使用了“向量表查表机制”。通过启动文件查询到其地址。 所以在异常发生后,CPU进入异常模式,同时程序计数器PC自动指向异常入口地址,也就是USART1_IRQHandler,进而执行中断服务函数中的应用。 总结一下,就是说, 1.中断是由某个事件触发的,可以将正在进行的程序打断。 2.stm32中,中断服务函数一般是公共入口,进入中断服务函数后,需要查询是哪种中断,再进行相应的处理。 3.中断处理前,先清除中断标志。这样一方面保证中断不会被其他低级中断源打断,一方面保证中断在执行后不会重复执行 这里解释一下为什么放在最后,一般来讲,在软件清中断后,需要等待硬件执行,然而硬件可能有延迟,这样导致,虽然在程序里执行了清中断指令,但是硬件并没有清除中断,而软件已经跳出了中断,并且进行下一次中断的判断(此时硬件仍没有清中断),因此会再次进入该中断,导致中断重复。4.中断服务函数应该尽量简短,一般是做一些标识,不要在中断中做延时之类的 占用CPU很长时间的工作。----快进快出 5. 中断服务函数不会被任何一个函数调用,当中断条件满足后,NVIC控制把CPU拉到中断服务函数中执行。 why? 目前的理解,中断适用于管理多任务系统的一种方式(在这种情况下,中断和系统进程仍然是线性执行,而不是并行)中断所减少的是系统等待外部进程所用的时间,如下图所示: 可以看出,中断方式下只用了25s,而轮询方式下需要35s,中断方式在某种程度上可以提高系统的执行效率。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9002 浏览 16 评论
4051 浏览 18 评论
1113浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 07:29 , Processed in 0.962831 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号