mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-18 04:13:34 +08:00
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)
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user