From cef6cf96f854c0c14fc5df36663ab12491c9c603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Wed, 19 Sep 2018 11:50:58 +0200 Subject: [PATCH] gps: reduce delay by reducing the sleep time This uses now the same sleep time logic as mavlink, depending on the baudrate. CPU usage on a Pixracer for different sleep times: #num reads/sec sleep time CPU usage 17-18 2.8ms 0.233-0.31% (this PR) 12 5ms 0.155-0.3% 9-10 10ms 0.155-0.233% 6 20ms 0.155-0.233% (previous) --- src/drivers/gps/gps.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/drivers/gps/gps.cpp b/src/drivers/gps/gps.cpp index 379aa91178..4626a2b57f 100644 --- a/src/drivers/gps/gps.cpp +++ b/src/drivers/gps/gps.cpp @@ -90,7 +90,6 @@ #define TIMEOUT_5HZ 500 #define RATE_MEASUREMENT_PERIOD 5000000 -#define GPS_WAIT_BEFORE_READ 20 // ms, wait before reading to save read() calls /* struct for dynamic allocation of satellite info data */ @@ -381,17 +380,21 @@ int GPS::pollOrRead(uint8_t *buf, size_t buf_length, int timeout) * If we have all requested data available, read it without waiting. * If more bytes are available, we'll go back to poll() again. */ + const unsigned character_count = 32; // minimum bytes that we want to read + unsigned baudrate = _baudrate == 0 ? 115200 : _baudrate; + const unsigned sleeptime = character_count * 1000000 / (baudrate / 10); + #ifdef __PX4_NUTTX int err = 0; - int bytesAvailable = 0; - err = ioctl(_serial_fd, FIONREAD, (unsigned long)&bytesAvailable); + int bytes_available = 0; + err = ioctl(_serial_fd, FIONREAD, (unsigned long)&bytes_available); - if ((err != 0) || (bytesAvailable < (int)buf_length)) { - usleep(GPS_WAIT_BEFORE_READ * 1000); + if (err != 0 || bytes_available < (int)character_count) { + usleep(sleeptime); } #else - usleep(GPS_WAIT_BEFORE_READ * 1000); + usleep(sleeptime); #endif ret = ::read(_serial_fd, buf, buf_length);