MODSERIAL with support for more devices

Dependents:   1D-Pong BMT-K9_encoder BMT-K9-Regelaar programma_filter ... more

Check the cookbook page for more information: https://mbed.org/cookbook/MODSERIAL

Did you add a device? Please send a pull request so we can keep everything in one library instead of many copies. In that case also send a PM, since currently mbed does not inform of new pull requests. I will then also add you to the developers of this library so you can do other changes directly.

Files at this revision

API Documentation at this revision

Comitter:
AjK
Date:
Sun Nov 21 16:25:44 2010 +0000
Parent:
5:8365c4cf8f33
Child:
7:ffa4a7cb7f8d
Commit message:
1.6

Changed in this revision

ChangeLog.c Show annotated file Show diff for this revision Revisions of this file
ISR_TX.cpp Show annotated file Show diff for this revision Revisions of this file
MODSERIAL.h Show annotated file Show diff for this revision Revisions of this file
PUTC.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/ChangeLog.c	Sun Nov 21 16:08:36 2010 +0000
+++ b/ChangeLog.c	Sun Nov 21 16:25:44 2010 +0000
@@ -1,5 +1,16 @@
 /* $Id:$
 
+1.6 - 21/11/2010
+
+   * Version 1.5 solved a blocking problem on putc() when called 
+     from another ISR. However, isr_tx() invokes a callback of it's
+     own when a byte is tranferred from TX buffer to TX FIFO. User
+     programs may interpret that as an IRQ callback. That's an ISR
+     call from within an existing ISR which is not good. So the 
+     TxIrq callback from isr_tx is now conditional. It will only
+     be called when isr_tx() is actually within it's own ISR and
+     not when called from alternate ISR handlers.
+     
 1.5 - 21/11/2010
 
     * Calling putc() (or any derived function that uses it like
--- a/ISR_TX.cpp	Sun Nov 21 16:08:36 2010 +0000
+++ b/ISR_TX.cpp	Sun Nov 21 16:25:44 2010 +0000
@@ -26,7 +26,7 @@
 namespace AjK {
 
 void 
-MODSERIAL::isr_tx(void)
+MODSERIAL::isr_tx(bool doCallback)
 {
     if (! _base ) return;
     
@@ -37,7 +37,7 @@
         if (buffer_out[TxIrq] >= buffer_size[TxIrq]) {
             buffer_out[TxIrq] = 0;
         }
-        _isr[TxIrq].call();
+        if (doCallback) _isr[TxIrq].call();
     }
         
     if ( MODSERIAL_TX_BUFFER_EMPTY && MODSERIAL_THR_HAS_SPACE ) {
--- a/MODSERIAL.h	Sun Nov 21 16:08:36 2010 +0000
+++ b/MODSERIAL.h	Sun Nov 21 16:25:44 2010 +0000
@@ -680,7 +680,14 @@
      * TX Interrupt Service Routine.
      * @ingroup INTERNALS
      */
-    void isr_tx(void);
+    void isr_tx(bool doCallback);
+    
+    /**
+     * TX Interrupt Service Routine stub version.
+     * @ingroup INTERNALS
+     */ 
+    void isr_tx(void) { isr_tx(true); }
+    
     
     /**
      * RX Interrupt Service Routine.
--- a/PUTC.cpp	Sun Nov 21 16:08:36 2010 +0000
+++ b/PUTC.cpp	Sun Nov 21 16:25:44 2010 +0000
@@ -46,7 +46,7 @@
                     // 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();
+                    isr_tx(false);
                 }
             }
             else if( MODSERIAL_TX_BUFFER_FULL ) {