Interrupt in Linux(硬件篇)—— PIC
本文来自:http://blog.chinaunix.net/u2/66786/showart.php?id=601766
1.1史前的PIC
8259A是即我们通常说的PIC,如图1-1所示:
图1-1 8259A
其中最重要的管脚是IR0~IR7(Interrupt Request0~7,用于连接设备)、INT(连接CPU,当有中断请求时,拉高该管脚以通知CPU中断的到来)、INTA(连接CPU,CPU通过该管脚应答中断请求,并通知PIC提交中断的vector到数据线)。此外,由于一片8259A只能连接8个设备,对于现代PC架构来说显得过少,通常会通过CS(片选)将两个8259A连在一起构成一个可以连接15个设备(有一个管脚用于串联另一片8259A)的PIC。
既然是可编程的芯片,8259A当然少不了寄存器。除了ICW(Initialization Command Word,初始化命令寄存器,用于初始化8259A)和OCW(Operation Command Word,操作命令字,用于控制8259A)外,最重要的有3个寄存器:
u IRR:Interrupt Request Register,中断请求寄存器,共8bit,对应IR0~IR7八个中断管脚。当某个管脚的中断请求到来后,若该管脚没有被屏蔽,IRR中对应的bit被置一。表示PIC已经收到设备的中断请求,但还未提交给CPU。
u ISR:In Service Register,服务中寄存器,共8bit,每bit意义同上。当IRR中的某个中断请求被发送给CPU后,ISR中对应的bit被置一。表示中断已发送给CPU,但CPU还未处理完。
u IMR:Interrupt Mask Register,中断屏蔽寄存器,共8bit,每bit意义同上。用于屏蔽中断。当某bit置一时,对应的中断管脚被屏蔽。
与APIC不同,PIC的每个管脚具有优先级,以0号管脚最高。也就说,连接号码较小的设备具有较高的中断优先级。通过对PIC的ICW寄存器编程,可以设定起始vector号,以计算当前中断的vector。例如,起始vector号设为16,IR3管脚产生了中断请求,则IR3对应的vector = 16+3 =19。通过PIC发起中断的典型流程如下:
1、 一个或多个IR管脚上产生电平信号,若对应的中断没有被屏蔽,IRR中相应的bit被置一。
2、 PIC拉高INT管脚通知CPU中断发生。
3、 CPU通过INTA管脚应答PIC,表示中断请求收到。
4、 PIC收到INTA应答后,将IRR中具有最高优先级的bit清零,并设置ISR中对应的bit。
5、 CPU通过INTA管脚第二次发出脉冲,PIC收到后计算最高优先级中断的vector,并将它提交到数据线上。
6、 等待CPU写EO
相关文档:
#!/bin/bash
while getopts "ab:cd:" Option
# b and d take arguments
#
do
case $Option in
a) echo -e "a = $OPTIND";;
b) echo -e "b = $OPTIND $OPTARG";;
c) echo -e "c = $OPTIND";;
d) echo -e "d = $OPTIND $OPTARG";;
esac
done
shift $(($OPTIND - 1)) ......
[转]Linux定时器
核主要需要两种类型的时间:
1.
在内核运行期间持续记录当前的时间与日期,以便内核对某些对象和事件作时间标记(
timestamp
,也称为
“
时间戳
”
),或供用
户通过时间
syscall ......
我们知道,从CMOS中读出来的系统时间并不是time_t类型,而是类似于struct tm那样,年月日时分秒是分开存储的。
那么,要把它转化为系统便于处理的time_t类型,就需要算法进行转换。
我们都知道我们的公历还是比较复杂的,有大月小月,有闰年非闰年,处理起来会很麻烦。
&n ......
在看LKD(第二版)第六章(中断和中断处理程序)的时候,刚开始接触到中断线号和共享中断线的时候半天愣是没有想明白,原来理解的中断和中断和中断处理程序就是通过中断线号来进行关联,硬件发生中断,然后通过中断线号查找对应的中断处理程序,最后中断处理程序返回,此次中断则处理完毕,没想 ......