__round_jiffies函数功能描述:函数__round_jiff ies( )用于将参数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_jiff ies(unsigned long j, int cpu)
__round_jiffies输入参数说明
- 函数__round_jiff ies( )的第一个参数表示的是输入的节拍数,要取整的节拍数。
- 第二个参数是对应的CUP对象,可以取0、1两个值(注:根据机器的CPU个数确定,本机两个CPU,如果4个CPU,可取0、1、2、3四个值,以此类推)。
__round_jiffies返回参数说明
- 函数的返回结果是对参数j取整之后的结果,表示的是整秒对应的节拍数。如果结果大于当前节拍数,则取整成功,对于CPU 0,则结果是250的整数倍,对于CPU 1,则结果加3是250的整数倍,如果取整不成功,则返回的结果是参数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编号
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("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
是一种取整失败的结果。
结果分析:
图B
是取整不成功的情况,两次函数调用返回的结果都相同,和输入的参数j表示的节拍相同,并且不能被250整除。图A
可以说明对于CPU 0如果取整成功,结果肯定是250的整数倍,对于CPU 1如果取整成功,结果加3肯定是250的整数倍。
取整成功的情况下,对于相同的节拍数CPU 0总比CPU 1多3个节拍,这样不会使两个CPU同时处于某一状态,达到两个CPU之间的轮换。