1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-21 10:26:06 +03:00

Merge pull request #1166 from alltheblinkythings/SerialStuff

Always arm the "TX FIFO Empty" interrupt after we write into _tx_buffer.
This commit is contained in:
Ivan Grokhotkov 2015-12-07 22:10:41 +03:00
commit 93aaa8667d
2 changed files with 9 additions and 13 deletions

View File

@ -617,18 +617,15 @@ size_t HardwareSerial::write(uint8_t c) {
size_t room = uart_get_tx_fifo_room(_uart); size_t room = uart_get_tx_fifo_room(_uart);
if(room > 0 && _tx_buffer->empty()) { if(room > 0 && _tx_buffer->empty()) {
uart_transmit_char(_uart, c); uart_transmit_char(_uart, c);
if(room < 10) {
uart_arm_tx_interrupt(_uart);
}
return 1; return 1;
} }
while(_tx_buffer->room() == 0) { while(_tx_buffer->room() == 0) {
yield(); yield();
uart_arm_tx_interrupt(_uart);
} }
_tx_buffer->write(c); _tx_buffer->write(c);
uart_arm_tx_interrupt(_uart);
return 1; return 1;
} }

View File

@ -42,9 +42,6 @@ class cbuf {
if(_end >= _begin) { if(_end >= _begin) {
return _size - (_end - _begin) - 1; return _size - (_end - _begin) - 1;
} }
if(_begin == _end) {
return _size;
}
return _begin - _end - 1; return _begin - _end - 1;
} }
@ -62,7 +59,7 @@ class cbuf {
if(getSize() == 0) return -1; if(getSize() == 0) return -1;
char result = *_begin; char result = *_begin;
if(++_begin == _bufend) _begin = _buf; _begin = wrap_if_bufend(_begin + 1);
return static_cast<int>(result); return static_cast<int>(result);
} }
@ -78,8 +75,7 @@ class cbuf {
dst += top_size; dst += top_size;
} }
memcpy(dst, _begin, size_to_read); memcpy(dst, _begin, size_to_read);
_begin += size_to_read; _begin = wrap_if_bufend(_begin + size_to_read);
if(_begin == _bufend) _begin = _buf;
return size_read; return size_read;
} }
@ -87,7 +83,7 @@ class cbuf {
if(room() == 0) return 0; if(room() == 0) return 0;
*_end = c; *_end = c;
if(++_end == _bufend) _end = _buf; _end = wrap_if_bufend(_end + 1);
return 1; return 1;
} }
@ -103,8 +99,7 @@ class cbuf {
src += top_size; src += top_size;
} }
memcpy(_end, src, size_to_write); memcpy(_end, src, size_to_write);
_end += size_to_write; _end = wrap_if_bufend(_end + size_to_write);
if(_end == _bufend) _end = _buf;
return size_written; return size_written;
} }
@ -114,6 +109,10 @@ class cbuf {
} }
private: private:
inline char* wrap_if_bufend(char* ptr) {
return (ptr == _bufend) ? _buf : ptr;
}
size_t _size; size_t _size;
char* _buf; char* _buf;
char* _bufend; char* _bufend;