1. 程式人生 > >Linux中的時間函式

Linux中的時間函式

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 將時間轉化為本地時間