arm硬件定时器

**********************************************************
硬件定时器:一般硬件定时器集成在CPU的内部,有的可以使用外置的硬件定时器芯片;
特点:
可以人为通过编程来设置硬件定时器的工作频率;
硬件定时器一旦设定好了工作频率,只要上电,那么硬件定时器就会周期性的给CPU输出一个中断信号,称这个中断信号为时钟中断;
linux内核已经实现好了时钟中断对应的服务程序,这个服务程序也称之为时钟中断服务函数;
既然硬件定时器周期性的给CPU产生时钟中断,那么对应的中断服务程序就会被内核周期性的调用;
时钟中断服务函数做如下内容:
1.更新系统的运行时间,更新jiffies_64(jiffies)
2.更新实际时间
3.检查进程的时间片是否用完,决定是否需要重新调度新进程
4.检查是否有超时的软件定时器,如果有处理这个超时的软件定时器
5...

概念:
HZ:常数,最终会将这个常数设置为硬件定时器的工作频率,对于ARM平台,HZ=100,表明一秒钟产生100次的时钟中断;
tick:1/HZ,表明产生一次时钟中断的时间间隔为10ms
jiffies:是linux内核的全局变量,在内核任何一个文件中都能访问这个变量(unsigned long),它用来记录自开机以来发生了多少次时钟中断,没发生一次时钟中断,jiffies加1;一般linux内核用jiffies来表示时间!例如:
unsigned long timeout = jiffies + HZ/2;
jiffies:表示当前系统运行时间;
HZ/2:表示时间间隔为500ms
timeout:表示500ms以后的系统运行时间;

注意:
jiffies是一个32位的变量,如果HZ=100,497天以后就会发生溢出(回绕)问题,一般内核使用jiffies_64(64位的变量)用来记录系统运行时间,而jiffies用来描述时间间隔。
jiffies = jiffies_64 & 0xFFFFFFFF;

linux内核解决jiffies回绕问题使用:
time_after/time_before

切记:硬件定时器处理的最小时间为10ms,那么jiffies它能处理的时间也就是10ms。

猜你喜欢

转载自blog.csdn.net/coolperl/article/details/81272807