前几天,由于工作需要要在驱动程序中打时间戳。网上找了几个资料,最终选定并使用了TSC方法,在这里简单总结一下。
使用TSC(时间戳计数器)据说精度相对高些。但需要注意硬件是否支持。
以X86体系结构为例:从pentium开始,很多80x86微处理器都引入TSC,一个用于时间戳计数器的64位的寄存器,它在每个时钟信号 (CLK, CLK是微处理器中一条用于接收外部振荡器的时钟信号输入引线)到来时加一。通过它可以计算CPU的主频,比如:如果微处理器的主频是1MHZ的话,那么TSC就会在1秒内增加1000000。
在使用时,首先需要包含相应头文件。在linux源码中,arch/x86/include/asm/msr.h。
#include <asm/msr.h>
然后,在需要打时间戳的地方,增加如下语句就可以了。
U64 _time;
rdtscll
(
_time
);
最后,你可以把这个时间戳打印出来,也可以保存到内存数组中统一输出。
关于时间戳的使用,自己在使用也有个小小的经验。
一开始时,我只是考虑把每个点的时间戳打出来,最后还蛮有成就感的自己写了脚本,把各时间戳从一大堆日志中提取出来,并打印差值和平均值。但还是被我们老大指出了问题。在对时间非常敏感的驱动中,打印那么多语句出来,也会消耗很多时间,会导致分析结果不够准确。经指点后,我把时间戳全部保存在内存的数组中,最后统一输出。