本文讲解一下使用中断实现sleep,纯正的 sleep 应该做到 CPU占用率几乎为0(与使用while实现的sleep完全不同), sleep完成恢复准时(也就相差几个指令周期)。
先来说明一下软中断, 本文只是以形象的方式讲解,具体的每个操作系统、软件工具的实现以实际为准
1. 程序调试、系统API调用(软中断实现)
程序调试设置了断点,这种调试可以使用中断("软中断通常是硬中断服务程序对内核的中断","信号则是由内核(或其他进程)对某个进程的中断")来实现。或者系统API调用一般需要软中断。
程序调试:首先通过操作系统调度的调度启动了程序,然后当到达设置的断点后就可以出发软中断,使CPU不再处理当前下面的指令,而是执行其他的指令(如sleep或者空转)。
系统API调用:软中断调用时将返回地址和CPU状态寄存器内容压栈,修改特权级,根据中断号查找中断向量表,找到ISR中断服务例程地址,跳转执行。
信号:信号是一般是内核触发的应用程序(对某个程序的中断),当某个事件(指令行)到达后,内核通过软中断向量表查询程序指令地址,然后压栈,然后就会执行程序中的指令了,即完成了信号的作用。
2. 硬中断
CPU有很多阵脚,每个硬件(如打印机、声卡、网卡)等也都有自己的逻辑处理器,如打印机产生一个硬中断时,就会通过CPU的某个针脚传入,然后硬中断被送到内核,然后内核通过软中断对打印机驱动程序中断(事件触发),然后在往上层应用传输和调用处理。
下面使用硬中断实现sleep
首先使用一个高频率的硬件定时器,然后每次定时器
伪代码:
如sleep( n ms), 假设定时器设定每0.1ms一次中断
i = 0;
times = n * 10;
while(i++ < times){
sjmp $ ; 等待中断
}
ORG 00H LJMP START ORG 0BH LJMP INT0X START: MV A,#1 ;设置A初始值 CJNE A, #100, $ ;在不等于100的情况下等待中断 RET INT0X: INC A RETI
参考:
http://www.tuicool.com/articles/MzENra
http://baike.baidu.com/link?url=IWbpJc2O15yE2Q2b2ibHZdCGUBCph5JowFO5yA66dkFeWj28bqMEt-PxD_-Q5J_HfA8KRrI0IRrHfXDoKf66poSlgpXXDVyl9XdmsRFhYzW
http://baike.baidu.com/view/197370.htm
http://wenku.baidu.com/link?url=9C40AoCTrSNIfGCVB3nwTdJY8L-BN85wPs5UczuVSfbuQT_yuYljz-EsKAhG0yL2oEgL_FXuEbv4qv-U6pyc1l8p7sbBqo68EpMF1KlBZ4W