FastSerial: added set_blocking_writes() interface

this allows us to put a serial port into non-blocking mode, so that
writes that don't fit in the transmit buffer are dropped. This will be
used in flight to prevent stray printf() calls from causing large time
delays in the code
This commit is contained in:
Andrew Tridgell 2012-03-30 17:05:18 +11:00
parent b4107d35e8
commit 0c445101ff
2 changed files with 16 additions and 0 deletions

View File

@ -212,6 +212,13 @@ size_t FastSerial::write(uint8_t c)
// wait for room in the tx buffer
i = (_txBuffer->head + 1) & _txBuffer->mask;
// if the port is set into non-blocking mode, then drop the byte
// if there isn't enough room for it in the transmit buffer
if (_nonblocking_writes && i == _txBuffer->tail) {
return 0;
}
while (i == _txBuffer->tail)
;

View File

@ -160,6 +160,11 @@ public:
return (1<<port) & _serialInitialized;
}
// ask for writes to be blocking or non-blocking
void set_blocking_writes(bool blocking) {
_nonblocking_writes = !blocking;
}
private:
/// Bit mask for initialized ports
@ -187,6 +192,10 @@ private:
Buffer * const _txBuffer;
bool _open;
// whether writes to the port should block waiting
// for enough space to appear
bool _nonblocking_writes;
/// Allocates a buffer of the given size
///
/// @param buffer The buffer descriptor for which the buffer will