中断 定时器 实现 sleep

时间:2022-12-07 23:30:11

本文讲解一下使用中断实现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