关键字volatile与全局变量jiffies
------------------------------------------------------
long volatile jiffies = 0
jiffes是个全局变量, 系统开机后每1毫秒加1(1毫秒为1个系统滴答)。发生一次系统时钟中断即为一个滴答。 -- HZ = 1000表示系统1秒发生1000次时钟中断,也就是1毫秒发生一次时钟中断,jiffies同时也会递增1。
volatile的含义是向编译器指明变量的内容可能会由于被其他程序修改而变化。要求代码在引用该变量时一定要从指定的内存位置取值。即是要求gcc不要对jiffies进行优化处理,也不要挪动位置,并且要从内存中取值。因为时钟中断处理程序会修改它的值。
注:通常在程序中声明一个变量时(没有volatile修饰),编译器会尽量把它存放在通用寄存器中(如ebx),以提高访问效率。当CPU把其值放到 ebx中后一般就不会再关心该变量对应内存位置中的内容。若此时其他程序(如内核程序或一个中断过程)修改了内存中该变量的值,ebx中的值并不会随之更新。
时钟中断与jiffies
------------------------------------------------------
jiffies用来统计系统自运行以来的时钟中断的次数,每次时钟中断都会使jiffies的加1,jiffies超过最大值后就会溢出,循环为0。
时钟中断是可以屏蔽的,当使用关中断指令关闭系统中断后,时钟中断将被屏蔽,jiffies的值也就停止不变化。而在关闭了系统中断后,时钟中断被屏蔽,也就不会发生新的任务调度。除非有不可屏蔽的中断被检测到,执行完中断后,执行调度程序。因此,可以使用关/开系统中断来达到使用不可重入变量或者代码的目的,但是要注意关闭中断的时间要尽量短,不然会增加系统的响应时间。
printk("<1>HZ = %d\n", HZ); // 1000
printk("<1>jiffies_to_msecs(HZ) = %d ms\n", jiffies_to_msecs(HZ)); // 1000 ms
printk("<1>msecs_to_jiffies(10) = %ld jiffies\n", msecs_to_jiffies(10)); // 10 jiffies
printk("<1>jiffies_to_usecs(10) = %d us\n", jiffies_to_usecs(10)); // 10000 us
printk("<1>usecs_to_jiffies(2000) = %ld jiffies\n", usecs_to_jiffies(2800)); // 3 jiffies
阅读(1208) | 评论(0) | 转发(0) |