Linux中的时间函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014183456/article/details/84589900

Linux 中常用的函数有以下函数 sleep、usleep、ndelay、udelay、mdelay 等
Linux 系统编程下用到的延时函数在头文件“#include <unistd.h>”中,包括函数 sleep、usleep。
Linux 内核中用到的延时函数在“#include <linux/delay.h>”中,包括函数 ndelay、udelay、mdelay。

1 函数 sleep 简介
函数 sleep 是秒延时。函数原型如下:
unsigned int sleep(unsigned int seconds);
例如:sleep(1),即延时一秒。
返回无符号的整形数值,如果延时成功则返回 0,如果延时过程中被打断,则返回剩余的
秒数。例如 sleep(5),返回值为 3,那么实际延时就是 5-3=2 秒。

2.函数 usleep 简介
函数 usleep 是微妙延时。函数原型如下:
int usleep(useconds_t usec);
Useconds 需要小于 1000000
例如:usleep(10),表示延时 10 微秒。延时成功则返回 0,失败则返回-1

3. 函数 delay 系列简介
函数 delay 系列是在 Linux 内核中用的,也就是在 linux 驱动中,会用到。
函数 mdelay 是毫秒延时,函数原型如下:
void mdelay(unsigned long msecs);
例如:mdelay(10),表示延时 10 毫秒。
函数 udelay 是微秒延时,函数原型如下:
void udelay(unsigned long usecs);
例如:udelay(5),表示延时 5 微秒。
函数 ndelay 是纳秒延时,函数原型如下:
void ndelay(unsigned long nsecs);
例如:ndelay(3),表示延时 3 纳秒。
再提醒一下,这里的 delay 函数只是在内核中使用的,sleep 是在系统编程中使用的。要
注意区分

Linux应用中的延时主要是:
sleep和usleep

#include <stdio.h>
#include <unistd.h>  //sleep and usleep function


int main(int argc,char *argv[])
{
  int i=10;
  while(i--)
  {
   sleep(2);    //延时2s
   printf("sleep 2!\n"); 
   usleep(1000000);  //延时1s
   printf("usleep 1000000!\n");
  return 0;
  }
}

然后使用交叉编译:arm-none-linux-gcc -o xxx xxx.c -static 生成可执行文件
在这里插入图片描述

Linux 内核驱动中的延时
Linux 内核中使用 delay 系列函数,先要调用头文件“#include <linux/delay.h>”,然后就可以使用 delay 系列的函数,在驱动做做延时操作了。
常用的地方,例如在驱动对硬件进行初始化的时候,例如芯片有上电时序,那么这个时候
就需要用到延时函数,直接调用 delay 即可。
注:但是我看linux里面的bin文件夹里面也有sleep函数,也是内核函数。

Linuxde 时间函数time
函数 time_t time(time_t *t)在头文件“#include <time.h>”中。
参数 1:time_t 类型,以秒为单位,如果有参数则数据传送到 time_t *t 中。
返回值:如果参数为 NULL 会返回 time_t 类型;出现错误返回-1。其中的时间类型 time_t,它是一个 long 类型,及其机器日历时间,在头文件 time.h 中定
义。

时间转换函数
下面先介绍常用时间 tm 结构体,如下所示。
struct tm{
int tm_sec; int tm_min;
int tm_hour;int tm_mday;
int tm_mon; int tm_year;
int tm_wday;int tm_yday;
int tm_isdst;
};
其中的成员如下:
int tm_sec; 秒 – 取值区间为[0,59]。
int tm_min; 分 - 取值区间为[0,59]。
int tm_hour; 时 - 取值区间为[0,23]。
**int tm_mday;**一个月中的日期 - 取值区间为[1,31]。
**int tm_mon;**月份(从一月开始,0 代表一月) - 取值区间为[0,11]。
**int tm_year;**年份,其值等于实际年份减去 1900。
**int tm_wday;**星期 – 取值区间为[0,6],其中 0 代表星期天,1 代表星期一,以此类推 。
**int tm_yday;**从每年的 1 月 1 日开始的天数 – 取值区间为[0,365],其中 0 代表 1 月 1 日,
1 代表 1 月 2 日,以此类推。
int tm_isdst; 夏令时标识符,实行夏令时的时候,tm_isdst 为正。不实行夏令时的进候,
tm_isdst 为 0;不了解情况时,tm_isdst()为负。
如果使用 time_t 类型的时间人类是无法识别,Linux 中提供了几个时间转换函数。
函数 ctime:将时间转化为字符串格式。
**char ctime(const time_t timep);
函数 gmtime:将时间转化为格林威治时间,以 tm 结构存储。
**struct tm gmtime(const time_t timep);
函数 asctime:将时间转换为字符格式,注意这个函数的参数是 tm 结构的。
**char asctime(const struct tm tm);
函数 localtime:将时间转化为本地时间。
**struct tm localtime(const time_t clock);
需要注意的是,上面几个函数的参数和以及返回值是不同的

函数代码:

#include <time.h>

#include<sys/time.h>
#include<stdio.h>

void function()
{
 unsigned int i,j;
 double y;
 for(i=0;i<1000;i++)
 for(j=0;j<1000;j++)
  y=i/(j+1);  
}

void main()
{
 struct timeval tpstart,tpend;
 float timeuse;

 gettimeofday(&tpstart,NULL); 
 function();
 
 gettimeofday(&tpend,NULL);
  
 timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
 timeuse/=1000000;

 printf("Used Time:%f\n",timeuse);
}

如上图代码所示。
函数 time 用于获取当前时间。
函数 ctime 将时间转为字符串。
函数 localtime 将时间转化为本地时间。
函数 gmtime 将时间转换为格林威治时间
函数 asctime 将时间转化为本地时间

猜你喜欢

转载自blog.csdn.net/u014183456/article/details/84589900
今日推荐