diff options
Diffstat (limited to 'nuttx/drivers/serial')
-rw-r--r-- | nuttx/drivers/serial/serial.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/nuttx/drivers/serial/serial.c b/nuttx/drivers/serial/serial.c index 3df4a4e18..983d4ae16 100644 --- a/nuttx/drivers/serial/serial.c +++ b/nuttx/drivers/serial/serial.c @@ -296,6 +296,7 @@ static ssize_t uart_read(FAR struct file *filep, FAR char *buffer, size_t buflen { FAR struct inode *inode = filep->f_inode; FAR uart_dev_t *dev = inode->i_private; + irqstate_t flags; ssize_t recvd = 0; /* Only one user can be accessing dev->recv.tail at once */ @@ -372,14 +373,17 @@ static ssize_t uart_read(FAR struct file *filep, FAR char *buffer, size_t buflen else { - /* Wait for some characters to be sent from the buffer - * with the TX interrupt re-enabled. + /* Wait for some characters to be sent from the buffer with the RX interrupt + * re-enabled. Interrupts are disabled briefly to assure that the following + * operations are atomic. */ + flags = irqsave(); dev->recvwaiting = true; uart_enablerxint(dev); uart_takesem(&dev->recvsem); uart_disablerxint(dev); + irqrestore(flags); } } |