jiffies_to_msecs
时间: 2023-07-22 10:13:00 浏览: 63
`jiffies_to_msecs` 是 Linux 内核中的一个函数,用于将 jiffies 时间转换为毫秒。jiffies 是指 Linux 内核中记录时间的一种单位,而毫秒则是以千分之一秒为单位的时间。该函数的定义如下:
```c
unsigned int jiffies_to_msecs(const unsigned long j)
{
/*
* Avoid division on 64-bit architectures.
*/
#if (BITS_PER_LONG == 64)
if (j > ULONG_MAX / (1000 / HZ))
return ULONG_MAX;
#endif
return (unsigned int)(j * 1000 / HZ);
}
```
该函数的实现比较简单,主要是将 jiffies 数量乘以 1000,然后除以 Linux 内核中预定义的 HZ 值(即内核中一秒钟的 tick 数量),得到对应的毫秒数。在 64 位系统中,为了避免溢出,该函数使用了一个判断,保证计算过程中不会超出 unsigned long 类型的范围。
相关问题
11.请指出下面代码中的错误 static int32_t caculate_access_baudrate(struct ieee80211_hw *hw) { if (!hw) return -EINVAL; int32_t transfer_rate = 0; transferrate = hw->flowchars * 1000 / jiffies_to_msecs(jiffies - last_access_jiffies); last_access_jiffies = jiffies; return transfer_rate; }
代码中有以下错误:
1. 在函数内部定义变量`transfer_rate`时,变量名被写错了,应该是`transfer_rate`而不是`transferrate`。
2. 使用变量`last_access_jiffies`之前,应该先判断它的值是否合法,否则第一次调用函数时会出现未定义的行为。
修改后的代码如下:
```
static int32_t calculate_access_baudrate(struct ieee80211_hw *hw) {
if (!hw)
return -EINVAL;
static unsigned long last_access_jiffies = 0;
if (last_access_jiffies == 0)
last_access_jiffies = jiffies;
int32_t transfer_rate = hw->flowchars * 1000 /
jiffies_to_msecs(jiffies - last_access_jiffies);
last_access_jiffies = jiffies;
return transfer_rate;
}
```
11.请指出下面代码中的错误 static int32_t calculate_access_baudrate(struct ieee80211_hw *hw) { if (!hw) return -EINVAL; int32_t transfer_rate = 0; transfer_rate = hw->flowchars * 1000 / jiffies_to_msecs(jiffies - last_access_jiffies); last_access_jiffies = jiffies; return transfer_rate; }
代码中的错误在于 `last_access_jiffies` 变量未被定义。在函数中应该先定义并初始化 `last_access_jiffies` 变量,才能在计算 `transfer_rate` 时使用它。另外,如果 `flowchars` 变量为 0,那么计算 `transfer_rate` 时会产生除以 0 的错误,需要进行判断和处理。修正后的代码如下:
```
static int32_t calculate_access_baudrate(struct ieee80211_hw *hw) {
static unsigned long last_access_jiffies = 0; // 定义并初始化 last_access_jiffies 变量
if (!hw)
return -EINVAL;
int32_t transfer_rate = 0;
if (hw->flowchars != 0) {
transfer_rate = hw->flowchars * 1000 /
jiffies_to_msecs(jiffies - last_access_jiffies);
}
last_access_jiffies = jiffies;
return transfer_rate;
}
```