虽然所以单片机原理类似,但是不同的单片机其实硬件都不相同,偏硬件势必要把所有的单片机硬件都要深入的了解(当然也可以深究原理,针对不同的单片机加以运用,但是很少有人能达到这种程度),而偏软件的话,很多单片机一发售,一般都会有配套的库函数,这样只要只要掌握了软件的逻辑,即使对底层不怎么精通,也可以写出很多高质量的代码。
但其实只要入了单片机这一行,硬件和软件多少都要了解些,不然很多时候除了问题都不知道问题出在哪,所以即使是偏软件,硬件这一块也是绕不过去的,只是说不需要那么精通。
当然,如果想要在单片机这一块深入发展,最后还是要全部精通的,这样才能编写出高质量精简有效的代码,但这都是后话了。
上面说到硬件应该保存当前信息,那么保存在哪里是个问题,一种选择是将其放入到内部寄存器中,在需要时操作系统可以读出这些内部寄存器。这种方法会造成的问题是:一段时间内设备无法响应,直到所有的内部寄存器中存储的信息被读出后,才能恢复运行,以免第二个内部寄存器重写内部寄存器的状态。
第二种方式是在堆栈中保存信息,这也是大部分 CPU所使用的方式。但是,这种方法也存在问题,因为使用的堆栈不确定,如果使用的是当前堆栈,则它很可能是用户进程的堆栈。堆栈指针甚至不合法,这样当硬件试图在它所指的地址处写入时,将会导致致命错误。如果使用的是内核堆栈,堆栈指针是合法的并且指向一个固定的页面,这样的机会可能会更大。然而,切换到内核态需要切换 MMU上下文,并且可能使高速缓存或者 TLB失效。静态或动态重新装载这些东西将增加中断处理的时间,浪费 CPU时间。
使机器处于良好状态的中断称为精确中断(precise interrupt)。这样的中断具有四个属性:
·PC(程序计数器)保存在一个已知的地方
·PC所指向的指令之前所有的指令已经完全执行
·PC所指向的指令之后所有的指令都没有执行
·PC所指向的指令的执行状态是已知的
不满足以上要求的中断称为不精确中断
实操上,有很多办法解决你的问题,只是需要把问题描述为:如何有效记录外部事件/p>
使用中断方式记录外部事件相对来说是非常低效率的一种方法。比如一个外部事件计数器(随便一个简单的MCU都有这个功能)就可以按处理器时钟周期的精度来记录外部事件。这比中断方式至少快10倍以上。

硬中断的处理流程如下:
·1、外设将中断请求发送给中断控制器;
·2、中断控制器根据中断优先级,有序地将中断传递给 CPU;
·3、CPU终止执行当前程序流,将 CPU所有寄存器的数值保存到栈中;
·4、CPU根据中断向量,从中断向量表中查找中断处理程序的入口地址,执行中断处理程序;
·5、CPU恢复寄存器中的数值,返回原程序流停止位置继续执行。
对单片机感兴趣的朋友可以找我,我录制了一些关于单片机的入门教程,有需要的童鞋找我拿就行,免费的,私信我“林老师”就可以拿~点击打开我的头像就能领取
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114012 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!