[code]int rtc_test(void) { struct rtc_time rtc; int fd = -1; int ret = -1; fd = open("/dev/rtc0", O_RDWR); if (fd < 0){ return -1; } ret = ioctl(fd, RTC_RD_TIME, &rtc); if (ret < 0){ return -1; } printf("\nCurrentRTC data/time is %d-%d-%d, %02d:%02d:%02d.\n", rtc.tm_mday, rtc.tm_mon + 1, rtc.tm_year + 1900, rtc.tm_hour, rtc.tm_min, rtc.tm_sec); ret = ioctl(fd, RTC_SET_TIME, &rtc); if (ret < 0){ return -1; } return 0; }
[/code]
2.除了上面這種方式操作rtc時間以外,linux中也有一個命令可以簡化rtc時間操作,hwclock,比如,可以通過system("hwclock -w");系統調用來把xtime設置到rtc硬件。
#include <sys/time.h>
#include <unistd.h>
struct timeval
{
inttv_sec;
inttv_usec;
};
int gettimeofday(struct timeval *tv, struct
timezone *tz);
int settimeofday(const struct timeval *tv, const struct timezone *gz);
功能描述:
gettimeofday()獲取當前時間,有tv指向的結構體返回。
settimeofday()把當前時間設成由tv指向的結構體數據。當前地區信息則設成tz指向的結構體數據。
2.獲取秒級別的時間
typedef long time_t;
time_ttime(time_t *t);
如果t是non-null,它將會把時間值填入t中
3.內核2.6版本後新增的clock api接口
獲取納秒級別的時間
struct timespec{
time_t tv_sec; /*秒s*/
long tv_nsec; /*納秒ns*/
};
int clock_getres(clockid_t clk_id , struct timespec *res);
int clock_gettime(clockid_t clk_id , struct timespec *tp);
int clock_settime(clockid_t clk_id 、 const struct timespec *tp);
編譯連接時采用-lrt才能編譯通過。
clk_id可選參數:
CLOCK_REALTIME系統全局的實時時鐘.設置此時鐘需要合適的權限.CLOCK_MONOTONIC只能被讀取,無法被設置,表示 monotonic 時間起點.CLOCK_PROCESS_CPUTIME_ID從 cpu 每進程的高分辨率計時器.CLOCK_THREAD_CPUTIME_ID
線程的特定 cpu 時間時鐘.
系統啟動時,會首先從rtc中讀取rtc時間,並設置給xtime,而當ntp對系統時間進行更新時,首先設置xtime,然後調用hwclock設置到rtc硬件中。xtime根據需要的精度,可以通過上面幾個接口來選擇使用。