内核态do_gettimeofday()、用户态gettimeofday()获取指令执行时间

26 篇文章 2 订阅

背景:

芯片开发阶段,有个硬件有个配置一直无法生效,后面发现是软件写入使能还未能生效,硬件就开始配置了,导致不成功。
加个延时就可解决,只是知道应该在纳秒级别,但具体十位还是百位级别,不太清楚了,所以就让我搞个代码测试下——写入一次寄存器需要的时间。

1、Linux内核获取时间的函数do_gettimeofday

/*tv_sec为当前时间距1970年1月1日的秒数,tv_usec为不足一秒的微秒数*/
struct timeval {
       time_t      tv_sec;     /* seconds */suseconds_t tv_usec;    /* microseconds */  微秒
 };

代码

#include <linux/time.h>
void PrintWriteRegisterTime(void)
{
	int i;
	struct timeval time = { 
		.tv_sec=0, /*单位:s*/
		.tv_usec=0 /*单位:um*/
	};
	int firsttime = 0, secondtime = 0;
	do_gettimeofday(&time); /*第一次获取系统时间*/
	firsttime = time.tv_sec * 10000000 + time.tv_usec;

	for(i = 0;i < 50000;i++){
		SET_IOP_WORK_EN(); /*写寄存器操作(函数不做具体展示)*/
	}

	do_gettimeofday(&time); /*第二次获取时间*/
	secondtime = time.tv_sec * 1000000 + time.tv_usec;

	printk("time of write to register : %d(ns)\n",(secondtime - firsttime) * 1000 / 50000);
	return;
}

另外,写了个proc文件(有时间再更新吧)来调试,结果如下:
在这里插入图片描述

可以看到我们的CPU写一次寄存器的时间在430ns-440ns左右,在配置前加个这样的时延就OK了。

2、用户态gettimeofday测试一条打印的时间

很简单、直接来代码了。

#include <stdio.h>
#include <sys/time.h>
                                                                                                      
void main(void){
        int i = 0;
        struct timeval time;
        for(;i < 10; i++){
                gettimeofday(&time,NULL);
                printf("time is :%d(s) %d(us)\n",time.tv_sec,time.tv_usec);
        }   
}

结果:

time is :1627529863(s) 996367(us)
time is :1627529863(s) 996442(us)
time is :1627529863(s) 996444(us)
time is :1627529863(s) 996445(us)
time is :1627529863(s) 996447(us)
time is :1627529863(s) 996448(us)
time is :1627529863(s) 996450(us)
time is :1627529863(s) 996460(us)
time is :1627529863(s) 996462(us)
time is :1627529863(s) 996464(us)

可以看到我使用的电脑,打印一条的间隔是平均2us左右.

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值