round_jiffies函数功能描述:函数round_jiffies( )用于将参数j表示的节拍变成HZ(250)的整数倍,即表示的时间是整秒。对于不同的CPU取整的结果是不一样的,对于CPU 0,结果是250的整数倍,对于CPU 1,结果加3是250的整数倍。如果取整的结果不大于当前的节拍数,则返回参数j,如果取整的结果大于当前的节拍数,则返回取整的结果。
round_jiffies文件包含
#include<linux/timer.h>
round_jiffies函数定义
在内核源码中位置:linux-3.19.3/kernel/time/timer.c
函数定义格式:
unsigned long round_jiffies(unsigned long j)
round_jiffies输入参数说明
- 函数round_jiffies( )的参数j表示的是输入的节拍数,需要取整的节拍数。
round_jiffies返回参数说明
函数的返回结果是对参数j取整之后的结果,表示的是整秒对应的节拍数,如果结果大于当前节拍数,则取整成功。
对于取整结果如果是250的整数倍,则取整成功,并且是对应CPU 0的;如果取整结果不是250的整数倍,但加3之后是250的整数倍,则取整成功,并且是对应CPU 1的;其他返回结果都代表取整失败,取整失败时返回的是参数j的值。
round_jiffies实例解析
编写测试文件:round_jiff ies.c
头文件引用:
#include <linux/module.h>
#include<linux/timer.h>
MODULE_LICENSE("GPL");
模块加载函数定义:
int __init round_jiffies_init(void)
{
printk("the round_jiffies test begin\n");
unsigned long j=jiffies; //记录当前节拍
unsigned long __result1=__round_jiffies(j,0); //参数j代表当前节拍数,0是CPU编号
unsigned long __result2=__round_jiffies(j,1); //参数j代表当前节拍数,1是CPU编号
unsigned long result1=round_jiffies(j); //参数j代表当前节拍数
unsigned long result2=round_jiffies(j); //参数j代表当前节拍数
printk("the jiffies is :%ld\n", j); //显示当前节拍数
// 显示函数调用结果
printk("the __result1 of __round_jiffies(j,0) is :%ld\n", __result1);
printk("the __result2 of __round_jiffies(j,1) is :%ld\n", __result2);
printk("the result1 of round_jiffies(j) is :%ld\n", result1);
printk("the result2 of round_jiffies(j) is :%ld\n", result2);
printk("out round_jiffies_init");
return 0;
}
模块退出函数定义:
void __exit round_jiffies_exit(void)
{
printk("Goodbye round_jiffies\n");
}
模块加载、退出函数调用:
module_init(round_jiffies_init);
module_exit(round_jiffies_exit);
实例运行结果及分析:
执行命令insmod round_jiff ies.ko插入模块,然后输入命令dmesg -c,出现如图A
所示结果。
图B
和图C
是另外两种可能的结果。
结果分析:
图B
是取整不成功的情况,四次函数调用结果都相同,和输入的参数j表示的节拍相同,并且不能被250整除。图A
和图C
可以说明对于CPU 0如果取整成功,结果肯定是250的整数倍,对于CPU 1如果取整成功结果加3肯定是250的整数倍。对于函数round_jiffies( )的调用结果是不确定的,取整成功情况下,如果返回的结果是250的整数倍,说明此结果是对于CPU 0的,如果不是250的整数倍,说明此结果是对于CPU 1的。
取整成功的情况下,对于相同的节拍数CPU 0总比CPU 1多3个节拍,这样不会使两个CPU同时处于某一状态,达到两个CPU之间的轮换。至于为什么相差3个时钟节拍,请读者查阅相关资料进行分析。
函数比较:
- 函数__round_jiffies( )比函数round_jiffies( )多一个参数,因此它能够确定操作是对于哪一个CPU的,使用更灵活,而函数round_jiffies( )只能对于目前正在活动的CPU,不够灵活。