【问题标题】:How to implement elapsed time by jiffies如何通过 jiffies 实现经过的时间
【发布时间】:2014-11-22 17:25:06
【问题描述】:

我想了解如何在 C 中使用 jiffies 实现经过时间。 假设我有一系列指令

#include <linux/jiffies.h>
unsigned long js,je,diff;


/***Start Time***/
/*Series of instructions*/
/***End Time***/

使用 jiffies,我必须在我的代码上写些什么? 这样写对吗?

#include <linux/jiffies.h>
unsigned long js,je,diff;
unsigned int diffusec;


js = jiffies; /***Start Time***/
/*Series of instructions*/
je = jiffies; /***End Time***/

diff = je - js;
diffusec = jiffies_to_usecs(diff);

对吗?使用 jiffies 比使用 getnstimeofday 函数好?

【问题讨论】:

  • 感谢您的回答。我知道 getnstimeofday、rdtsc、clock()、do_gettimeofday() 用于用户空间。对于内核空间,我们只有 jiffies 或其他?

标签: c linux time linux-kernel elapsedtime


【解决方案1】:

你可以这样做:

struct timeval start, finish;
long delta_usecs;

do_gettimeofday(&start);
..
// execute your processing here
..
do_gettimeofday(&finish);

delta_usecs = (finish.tv_sec - start.tv_sec) * 1000000 +
              (finish.tv_usec - start.tv_usec);

由于您正在使用 ARM 架构,因此通过安装在 dmesg 上打印分辨率的内核模块来检查系统计时器的可用分辨率可能会有所帮助:

#include <linux/version.h>
#include <linux/module.h>
#include <linux/hrtimer.h>
#include <linux/time.h>

static struct hrtimer timer;

static int __init hrtimer_test_init(void)
{
        struct timespec time;

        hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
        hrtimer_get_res(CLOCK_MONOTONIC, &time);
        printk(KERN_ERR "resolution : %u secs and %u nsecs.\n",
               time.tv_sec, time.tv_nsec);
        return 0;
}

static void __exit hrtimer_test_exit(void)
{
        return ;
}

module_init(hrtimer_test_init);
module_exit(hrtimer_test_exit);
MODULE_AUTHOR("hrtimer test for demo only");
MODULE_DESCRIPTION("hrtimer resolution");
MODULE_LICENSE("GPL");

如果分辨率是jiffies周期内的ns数,那么你的平台有点受限,否则,你可以考虑使用hrtimers来监控处理时间。

编译之前的代码:可以复用下面的Makefile:

KERNELDIR := /lib/modules/$(shell uname -r)/build

.PHONY: all clean

clean:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) clean
    rm -rf *~

all:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules

obj-m := hrtimer-test.o

希望对您有所帮助。 艾门。

【讨论】:

  • 嗨艾门。我尝试了这个解决方案,但我注意到 getnstimeofday 指令有大约 15 微秒的延迟,我认为也是 do_gettimeofday。现在我正在尝试另一种解决方案,但我遇到了问题。如果可以的话,我链接我的问题stackoverflow.com/questions/27092331/…我希望你能帮助我xD。谢谢
  • 这取决于您使用的硬件。在这种情况下,您指的 CPU 架构是什么?
  • stm32f429 板上的 ARM Cortex-M4
  • 好吧,我不确定ARM上使用的系统定时器的分辨率,但是如果你正在寻找它,在这种情况下你可以通过调用clock_getres()来检查它。现在,回到测量,一般来说,如果您正在寻找高分辨率,您可以使用符合 posix 标准的 hrtimer。这应该可以满足需求。
  • 这是 lwn.net 上一篇有趣的文章,讨论了 linux 内核中的 hrtimer API:lwn.net/Articles/167897。您可以将 hrtimer_get_res() 与 clkid CLOCK_REALTIME 一起使用,看看 hrtimer 是否足以满足您的工作需求。
猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多