关于jiffies回绕以及time_after,time_before
时间: 2023-06-29 20:03:02 浏览: 55
jiffies是内核中的一个全局计数器,记录了自系统启动以来的时钟滴答数(tick)。由于jiffies是一个无符号32位整数,当计数器达到最大值时(0xFFFFFFFF),它会回绕到0重新开始计数,这称为回绕(wraparound)。
time_after和time_before是两个宏定义,用于比较时间戳。它们的定义如下:
```
#define time_after(a,b) \
(typecheck(unsigned long, a) && \
typecheck(unsigned long, b) && \
((long)(b) - (long)(a) < 0))
#define time_before(a,b) time_after(b,a)
```
其中,typecheck是一个类型检查宏,用于检查参数是否为unsigned long类型。
这两个宏的作用是判断时间戳a是否在时间戳b之后或之前,它们的返回值都是bool类型。在使用jiffies进行时间戳比较时,可以使用这两个宏来避免回绕问题,例如:
```
if (time_after(jiffies, timestamp))
// do something
```
这个条件判断会在jiffies大于timestamp时返回true,即使jiffies已经回绕到0,也不会出错。
相关问题
time_after函数和msecs_to_jiffies函数详解
time_after函数和msecs_to_jiffies函数是Linux内核中常用的两个时间处理函数,具体如下:
1. time_after函数:
time_after函数用于判断当前时间是否在指定时间之后,其函数原型如下:
```
static inline bool time_after(unsigned long a, unsigned long b)
{
return ((long)(b - a) < 0);
}
```
其中,参数a和b是表示时间的无符号长整型数,它们通常是由jiffies或get_jiffies_64等函数返回的值。返回值是一个bool类型的值,表示当前时间是否在指定时间之后。
2. msecs_to_jiffies函数:
msecs_to_jiffies函数用于将毫秒数转换为jiffies数,其函数原型如下:
```
#define msecs_to_jiffies(msec) \
(jiffies + msecs_to_ticks(msec))
```
其中,参数msec是毫秒数,返回值是一个jiffies数。
msecs_to_ticks函数是一个宏定义,用于将毫秒数转换为系统节拍数(ticks),其函数原型如下:
```
#define msecs_to_ticks(m) \
(((unsigned long long)(m) * HZ) / 1000)
```
其中,HZ是系统节拍频率,通常为100,表示每秒钟有100个系统节拍。返回值是一个无符号长整型数,表示转换后的系统节拍数。
这两个函数在内核中被广泛使用,特别是在定时器、延时等场景中经常用到。
if (system_st.sleep_time_idx >= 5) { system_st.sleep_time_idx = 0; system_st.sleep_time_stop_cnt = system_st.sleep_time_stop[0] * 16 * 16 * 16 * 16 + system_st.sleep_time_stop[1] * 16 * 16 * 16 + system_st.sleep_time_stop[2] * 16 * 16 + system_st.sleep_time_stop[3] * 16 + system_st.sleep_time_stop[4]; system_st.sleep_time_stop_cnt *= 500; /* convert to jiffies counter */ main_st.sleep_time_stop_jiffies = main_st.sys_jiffies;
这段代码是在 `if (system_st.sleep_time_idx >= 5)` 的条件满足时执行的。首先,将 `system_st.sleep_time_idx` 的值重置为0。
然后,通过将 `system_st.sleep_time_stop` 数组中的元素进行位运算和乘法操作,计算出 `system_st.sleep_time_stop_cnt` 的值。具体的计算方式是将数组中的每个元素乘以 16 的幂(16^4、16^3、16^2、16^1、16^0),并相加得到结果。
接下来,将 `system_st.sleep_time_stop_cnt` 乘以 500,将其转换为 jiffies 计数器的值。
最后,将 `main_st.sys_jiffies` 的值赋给 `main_st.sleep_time_stop_jiffies` ,用于记录当前的时间戳。
整体来说,这段代码的作用是计算睡眠结束时间的计数器,并记录下当前的时间戳。它在 `system_st.sleep_time_idx` 达到5时执行,说明在一段时间内收集了足够的数据来计算睡眠时间。