C语言的那些小秘密之volatile

发表于:2011-12-19 09:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bigloomy(CSDNblog)    来源:51Testing软件测试网采编

  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所指的结构中。

  1. timeval结构定义为:  
  2. struct timeval{  
  3.     long tv_sec;   
  4.     long tv_usec;   
  5. };  
  6. timezone 结构定义为:  
  7. struct timezone{  
  8.     int tz_minuteswest;   
  9.     int tz_dsttime;   
  10. };

  先来说说timeval结构体,其中的tv_sec存放的是秒,而tv_usec存放的是微秒。其中的timezone成员变量我们很少使用,在此简单的说说它在gettimeofday()函数中的作用是把当地时区的信息则放到tz所指的结构中,在其中tz_minuteswest变量里存放的是和Greenwich 时间差了多少分钟,tz_dsttime日光节约时间的状态。我们在此主要的是关注前一个成员变量timeval,后一个我们在此不使用,所以使用gettimeofday()函数的时候我们把有一个参数设定为NULL,下面先来看看一段简单的代码。

  1. #include <stdio.h>  
  2. #include <sys/time.h>  
  3.   
  4. int main(int argc, char * argv[])  
  5. {  
  6.     struct timeval start,end;  
  7.     gettimeofday( &start, NULL );  /*测试起始时间*/  
  8.     double timeuse;  
  9.     int j;  
  10.     for(j=0;j<1000000;j++)  
  11.         ;  
  12.     gettimeofday( &end, NULL );   /*测试终止时间*/  
  13.     timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_sec - start.tv_sec ;  
  14.     timeuse /= 1000000;  
  15. printf("运行时间为:%f\n",timeuse);  
  16.   
  17.     return 0;  
  18.   
  19. }

  运行结果为:

  1. root@ubuntu:/home# ./p  
  2. 运行时间为:0.002736

  现在来简单的分析下代码,通过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修饰符。

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号