Browse Source

HAL_Linux: use CLOCK_MONOTONIC_RAW to ensure clock never goes backwards

this avoids ntp mucking with APM timing
master
Andrew Tridgell 12 years ago
parent
commit
07b8f45770
  1. 18
      libraries/AP_HAL_Linux/Scheduler.cpp
  2. 2
      libraries/AP_HAL_Linux/Scheduler.h

18
libraries/AP_HAL_Linux/Scheduler.cpp

@ -28,7 +28,7 @@ typedef void *(*pthread_startroutine_t)(void *);
void LinuxScheduler::init(void* machtnichts) void LinuxScheduler::init(void* machtnichts)
{ {
gettimeofday(&_sketch_start_time, NULL); clock_gettime(CLOCK_MONOTONIC, &_sketch_start_time);
pthread_attr_t thread_attr; pthread_attr_t thread_attr;
struct sched_param param; struct sched_param param;
@ -79,20 +79,20 @@ void LinuxScheduler::delay(uint16_t ms)
uint32_t LinuxScheduler::millis() uint32_t LinuxScheduler::millis()
{ {
struct timeval tp; struct timespec ts;
gettimeofday(&tp,NULL); clock_gettime(CLOCK_MONOTONIC, &ts);
return 1.0e3*((tp.tv_sec + (tp.tv_usec*1.0e-6)) - return 1.0e3*((ts.tv_sec + (ts.tv_nsec*1.0e-9)) -
(_sketch_start_time.tv_sec + (_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() uint32_t LinuxScheduler::micros()
{ {
struct timeval tp; struct timespec ts;
gettimeofday(&tp,NULL); clock_gettime(CLOCK_MONOTONIC, &ts);
return 1.0e6*((tp.tv_sec + (tp.tv_usec*1.0e-6)) - return 1.0e6*((ts.tv_sec + (ts.tv_nsec*1.0e-9)) -
(_sketch_start_time.tv_sec + (_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) void LinuxScheduler::delay_microseconds(uint16_t us)

2
libraries/AP_HAL_Linux/Scheduler.h

@ -40,7 +40,7 @@ public:
void reboot(bool hold_in_bootloader); void reboot(bool hold_in_bootloader);
private: private:
struct timeval _sketch_start_time; struct timespec _sketch_start_time;
void _timer_handler(int signum); void _timer_handler(int signum);
AP_HAL::Proc _delay_cb; AP_HAL::Proc _delay_cb;

Loading…
Cancel
Save