mirror of
https://github.com/arduino/Arduino.git
synced 2024-12-01 12:24:14 +01:00
Disable the UDRE interrupt sooner in HardwareSerial
Before, the interrupt was disabled when it was triggered and it turned out there was no data to send. However, the interrupt can be disabled already when the last byte is written to the UART, since write() will always re-enable the interrupt when it adds new data to the buffer. Closes: #1008
This commit is contained in:
parent
ccd8880a37
commit
0be4e8cd3c
@ -223,12 +223,8 @@ void HardwareSerial::_rx_complete_irq(void)
|
|||||||
|
|
||||||
void HardwareSerial::_tx_udr_empty_irq(void)
|
void HardwareSerial::_tx_udr_empty_irq(void)
|
||||||
{
|
{
|
||||||
if (_tx_buffer_head == _tx_buffer_tail) {
|
// If interrupts are enabled, there must be more data in the output
|
||||||
// Buffer empty, so disable interrupts
|
// buffer. Send the next byte
|
||||||
cbi(*_ucsrb, UDRIE0);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// There is more data in the output buffer. Send the next byte
|
|
||||||
unsigned char c = _tx_buffer[_tx_buffer_tail];
|
unsigned char c = _tx_buffer[_tx_buffer_tail];
|
||||||
_tx_buffer_tail = (_tx_buffer_tail + 1) % SERIAL_BUFFER_SIZE;
|
_tx_buffer_tail = (_tx_buffer_tail + 1) % SERIAL_BUFFER_SIZE;
|
||||||
|
|
||||||
@ -238,6 +234,10 @@ void HardwareSerial::_tx_udr_empty_irq(void)
|
|||||||
// location". This makes sure flush() won't return until the bytes
|
// location". This makes sure flush() won't return until the bytes
|
||||||
// actually got written
|
// actually got written
|
||||||
sbi(*_ucsra, TXC0);
|
sbi(*_ucsra, TXC0);
|
||||||
|
|
||||||
|
if (_tx_buffer_head == _tx_buffer_tail) {
|
||||||
|
// Buffer empty, so disable interrupts
|
||||||
|
cbi(*_ucsrb, UDRIE0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user