]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/msp430/usci/Msp430UartP.nc
Some comments about the UART ISRs.
[tinyos-2.x.git] / tos / chips / msp430 / usci / Msp430UartP.nc
index 1b595bfdbd9af40369beceb8128264f6f6620183..6f6384db9618ffef37ebbdfd2a91fa0c6860e702 100644 (file)
@@ -163,6 +163,9 @@ implementation {
 
   async event void Interrupts.tx()
   {
+    /* FIXME: this can cause an arbitrarily long ISR, if m_slen is large.
+     * But depending on timing, we may always only write 1 byte.
+     */
     while (m_slen && call Registers.getIfgTx()) {
       call Registers.setTxbuf(*m_sbuf);
       if (--m_slen)
@@ -236,25 +239,26 @@ implementation {
 
   async event void Interrupts.rx(uint8_t byte)
   {
-    atomic {
-      if (m_robuf) {
-       /* receive() takes precedence if active */
-       while (m_rlen && call Registers.getIfgRx()) {
-         *m_rbuf = byte;
-         if (--m_rlen)
-           m_rbuf++;
-       }
-       if (m_rlen == 0 && m_robuf) {
-         if (m_rxie) {
-           call Registers.clrIeRx();
-           call Registers.clrIfgRx();
-         }
-         m_robuf = 0;
-         signal UartStream.receiveDone(m_robuf, m_rolen, SUCCESS);
+    if (m_robuf) {
+      /* receive() takes precedence if active */
+      /* FIXME: an arbitrarily long ISR may occur if m_rlen is large.
+       * But depending on timing, we may always only read 1 byte.
+       */
+      while (m_rlen && call Registers.getIfgRx()) {
+       *m_rbuf = byte;
+       if (--m_rlen)
+         m_rbuf++;
+      }
+      if (m_rlen == 0 && m_robuf) {
+       if (m_rxie) {
+         call Registers.clrIeRx();
+         call Registers.clrIfgRx();
        }
-      } else
-       signal UartStream.receivedByte(byte);
-    }
+       m_robuf = 0;
+       signal UartStream.receiveDone(m_robuf, m_rolen, SUCCESS);
+      }
+    } else
+      signal UartStream.receivedByte(byte);
   }
 
   default async command const msp430_usci_uart_t* Configure.get()