volatile的重要性对于搞嵌入式的程序员来说是不言而喻的,对于volatile的了解程度常常被不少公司在招聘嵌入式编程人员面试的时候作为衡量一个应聘者是否合格的参考标准之一,为什么volatile如此的重要呢?这是因为嵌入式的编程人员要经常同中断、底层硬件等打交道,而这些都用到volatile,所以说嵌入式程序员必须要掌握好volatile的使用。
其实就象读者所熟悉的const一样,volatile是一个类型修饰符。在开始讲解volatile之前我们先来讲解下接下来要用到的一个函数,知道如何使用该函数的读者可以跳过该函数的讲解部分。
原型:int gettimeofday ( struct timeval * tv , struct timezone * tz );
头文件:#include <sys/time.h>
功能:获取当前时间
返回值:如果成功返回0,失败返回-1,错误代码存于errno中。
gettimeofday()会把目前的时间用tv所指的结构返回,当地时区的信息则放到tz所指的结构中。
|
先来说说timeval结构体,其中的tv_sec存放的是秒,而tv_usec存放的是微秒。其中的timezone成员变量我们很少使用,在此简单的说说它在gettimeofday()函数中的作用是把当地时区的信息则放到tz所指的结构中,在其中tz_minuteswest变量里存放的是和Greenwich 时间差了多少分钟,tz_dsttime日光节约时间的状态。我们在此主要的是关注前一个成员变量timeval,后一个我们在此不使用,所以使用gettimeofday()函数的时候我们把有一个参数设定为NULL,下面先来看看一段简单的代码。
|
运行结果为:
|
现在来简单的分析下代码,通过end.tv_sec - start.tv_sec 我们得到了终止时间跟起始时间以秒为单位的时间间隔,然后使用end.tv_sec - start.tv_sec 得到终止时间跟起始时间以微妙为单位的时间间隔。因为时间单位的原因,所以我们在此对于( end.tv_sec - start.tv_sec ) 得到的结果乘以1000000转换为微秒进行计算,之后再使用timeuse /= 1000000;将其转换为秒。现在了解了如何通过gettimeofday()函数来测试start到end代码之间的运行时间,那么我们现在接下来看看volatile修饰符。