Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MODSERIAL by
Diff: PUTC.cpp
- Revision:
- 5:8365c4cf8f33
- Parent:
- 4:28de979b77cf
- Child:
- 6:c8f77fe1cc10
--- a/PUTC.cpp Sun Nov 21 14:44:02 2010 +0000 +++ b/PUTC.cpp Sun Nov 21 16:08:36 2010 +0000 @@ -34,7 +34,21 @@ } else { if (buffer[TxIrq] != (char *)NULL) { - if (block) while ( MODSERIAL_TX_BUFFER_FULL ) ; // Blocks! + if (block) { + while ( MODSERIAL_TX_BUFFER_FULL ) { // Blocks! + // If putc() is called from an ISR then we are stuffed + // because in an ISR no bytes from the TX buffer will + // get transferred to teh TX FIFOs while we block here. + // So, to work around this, instead of sitting in a + // loop waiting for space in the TX buffer (which will + // never happen in IRQ context), check to see if the + // TX FIFO has space available to move bytes from the + // TX buffer to TX FIFO to make space. The easiest way + // to do this is to poll the isr_tx() function while we + // are blocking. + isr_tx(); + } + } else if( MODSERIAL_TX_BUFFER_FULL ) { buffer_overflow[TxIrq] = c; // Oh dear, no room in buffer. _isr[TxOvIrq].call();