From 07b8f457700a9f0aa58da3bb9654e6d686af1204 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 6 Oct 2013 20:57:24 +1100 Subject: [PATCH] HAL_Linux: use CLOCK_MONOTONIC_RAW to ensure clock never goes backwards this avoids ntp mucking with APM timing --- libraries/AP_HAL_Linux/Scheduler.cpp | 18 +++++++++--------- libraries/AP_HAL_Linux/Scheduler.h | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/libraries/AP_HAL_Linux/Scheduler.cpp b/libraries/AP_HAL_Linux/Scheduler.cpp index 5dbe027e28..801ed06786 100644 --- a/libraries/AP_HAL_Linux/Scheduler.cpp +++ b/libraries/AP_HAL_Linux/Scheduler.cpp @@ -28,7 +28,7 @@ typedef void *(*pthread_startroutine_t)(void *); void LinuxScheduler::init(void* machtnichts) { - gettimeofday(&_sketch_start_time, NULL); + clock_gettime(CLOCK_MONOTONIC, &_sketch_start_time); pthread_attr_t thread_attr; struct sched_param param; @@ -79,20 +79,20 @@ void LinuxScheduler::delay(uint16_t ms) uint32_t LinuxScheduler::millis() { - struct timeval tp; - gettimeofday(&tp,NULL); - return 1.0e3*((tp.tv_sec + (tp.tv_usec*1.0e-6)) - + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return 1.0e3*((ts.tv_sec + (ts.tv_nsec*1.0e-9)) - (_sketch_start_time.tv_sec + - (_sketch_start_time.tv_usec*1.0e-6))); + (_sketch_start_time.tv_nsec*1.0e-9))); } uint32_t LinuxScheduler::micros() { - struct timeval tp; - gettimeofday(&tp,NULL); - return 1.0e6*((tp.tv_sec + (tp.tv_usec*1.0e-6)) - + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return 1.0e6*((ts.tv_sec + (ts.tv_nsec*1.0e-9)) - (_sketch_start_time.tv_sec + - (_sketch_start_time.tv_usec*1.0e-6))); + (_sketch_start_time.tv_nsec*1.0e-9))); } void LinuxScheduler::delay_microseconds(uint16_t us) diff --git a/libraries/AP_HAL_Linux/Scheduler.h b/libraries/AP_HAL_Linux/Scheduler.h index 490b069915..34ee3c3504 100644 --- a/libraries/AP_HAL_Linux/Scheduler.h +++ b/libraries/AP_HAL_Linux/Scheduler.h @@ -40,7 +40,7 @@ public: void reboot(bool hold_in_bootloader); private: - struct timeval _sketch_start_time; + struct timespec _sketch_start_time; void _timer_handler(int signum); AP_HAL::Proc _delay_cb;