偶然看到这么一句话:中断是“轮询” ! 当时第一感觉:嗯 肯定不是 中断是在发生的时候,保护好现场后,自动跳转到中断处理程序。 然而进一步思考,到底cpu是怎么知道什么时候发生中断的?? 这时候给我的第一感觉就是这是硬件的事情,软件不需要管。。。 是的 写驱动和app都不用关心这些,但是心里还是有种莫名的失落感。。。(ps:国庆玩太久,需要充实一下 哈哈)
于是继续找资料看,如下一段话很好的解释了中断的本质:虽然人们在谈到中断(Interrupt)时,总会拿轮询(Polling)来做“反面”例子,但中断和轮询并不是完全对立的两个概念,呃,它们是对立统一的。
“CPU执行完每条指令时,都会去检查一个中断标志位(ps:只不过用的微代码,在应用程序中存在指令开销!)”,这句话是所有关于中断长篇大论的开场白,但很容易被人忽略,其实,这就是中断的本质。
举个例子,CPU老板是一家公司的光杆司令,所有的顾客都要他亲自跑去处理,还要跟有关部门打点关系,CPU觉得顾客和公关这两样事它一个人搞不来,这就是轮询;终于这家公司升级发展了,CPU老板请了一个秘书,所有的顾客都先由秘书经手,CPU心情好的时候就去看一下,大部分时间都忙着去公关了,这时它觉得轻松了很多,这就是中断了~~
也就是说,中断和轮询是从CPU老板的角度来看的,不管怎样,事件都还是有人来时刻跟踪才能被捕获处理,不过是老板还是秘书的问题。所有的中断(或者异步,回调等)背后都有一个轮询(循环,listener)!
当然不同的CPU,不同的内核,对于中断的处理是不同的。比如:cortex—M3内核的CPU,当外设请求一个中断时,nvic会启动中断服务,cortex-M3的MCU进入中断模式的同时会把一组寄存器压入堆栈中,最重要的是这个压入过程也是由微指令完成!!! 这样相比arm7等其他内核,中断延迟的时间会减少,当然还有很多其他改善的地方,具体要看内核相关资料。
ps伪指令、微代码、伪代码:
伪指令就是没有对应的机器码的指令,它是用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行!
微代码(Microcode):用简单的硬件操作来模拟当时无法用技术直接实现的复杂指令
微代码首先于1951年由英国的M.V.Wilkes引入,它是计算机工程学上的重大创新.
它把计算机清楚的分成了两个概念层:体系结构和实现.
伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是使被描述的算法
可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必
须结构清晰、代码简单、可读性好,并且类似自然语言。 介于自然语言与编程语言
之间。以编程语言的书写形式指明算法职能。使用伪代码, 不用拘泥于具体实现。
相比程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。它是半角式化、
不标准的语言。可以将整个算法运行过程的结构用接近自然语言的形式(可以使用
任何一种你熟悉的文字,关键是把程序的意思表达出来)描述出来。
以上纯属个人理解,如有错误,请见谅!
独钓千古愁:2013.10.10