integer promotion caused a call to the non-reentrant function __modsint in the interrupt
authorfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 22 Oct 2004 11:24:48 +0000 (11:24 +0000)
committerfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 22 Oct 2004 11:24:48 +0000 (11:24 +0000)
function (thus corrupting math operations during serial I/O),
ser_ir.c: as above, changed buffersize

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3549 4a8a32a2-be11-0410-ad9d-d568d2c75423

device/lib/ser_ir.c
device/lib/ser_ir_cts_rts.c

index e438e631295a8c2fa1cdb8474d676cafc1a96db0..15b162a898a24fb4c45b2d74a7c6541dfa86f08c 100644 (file)
 *   so it can run on devices with _little_ memory like at89cx051.
 * - It won't overwrite characters which already are stored in the
 *   receive-/transmit-buffer.
-* - It checks receiver first to minimize probability for overruns
-*   in the serial receiver.
 */
 
 /* BUG: those definitions (and the #include) should be set dynamically
 * (while linking or at runtime) to make this file a _real_ library.
 */
 #include <8051.h>
-#define XBUFLEN 10
-#define RBUFLEN 10
+#define XBUFLEN 4
+#define RBUFLEN 8
 
-static unsigned char rbuf[RBUFLEN], xbuf[XBUFLEN];
+/* You might want to specify idata, pdata or xdata for the buffers */
+static unsigned char pdata rbuf[RBUFLEN], xbuf[XBUFLEN];
 static unsigned char rcnt, xcnt, rpos, xpos;
-static unsigned char busy;
+static bit busy;
 
 void ser_init (void)
 {
@@ -65,7 +64,7 @@ void ser_handler (void) interrupt 4
           RI = 0;
           /* don't overwrite chars already in buffer */
           if (rcnt < RBUFLEN)
-                  rbuf [(rpos+rcnt++) % RBUFLEN] = SBUF;
+                  rbuf [(unsigned char)(rpos+rcnt++) % RBUFLEN] = SBUF;
    }
    if (TI) {
           TI = 0;
@@ -84,7 +83,7 @@ void ser_putc (unsigned char c)
           ;
    ES = 0;
    if (busy) {
-          xbuf[(xpos+xcnt++) % XBUFLEN] = c;
+          xbuf[(unsigned char)(xpos+xcnt++) % XBUFLEN] = c;
    } else {
           SBUF = c;
           busy = 1;
index 2bf1160f8cbb9ebcbe9e0e620a7d9dd3cf9aa52a..51069fe67e6fbda31f76430b43d56c4aae12ec91 100755 (executable)
@@ -34,8 +34,6 @@
 *   so it can run on devices with _little_ memory like at89cx051.
 * - It won't overwrite characters which already are stored in the
 *   receive-/transmit-buffer.
-* - It checks receiver first to minimize probability for overruns
-*   in the serial receiver.
 */
 
 /* BUG: those definitions (and the #include) should be set dynamically
 #define CTS P3_6          // CTS & RTS can be assigned to any free pins
 #define RTS P3_7
 
+// You might want to specify idata, pdata or xdata for the buffers
 static unsigned char rxbuf[RXBUFLEN], txbuf[TXBUFLEN];
 static unsigned char rxcnt, txcnt, rxpos, txpos;
-static unsigned char busy;
+static bit busy;
 
 void ser_init()
 {
@@ -117,7 +116,7 @@ void ser_handler(void) interrupt 4
   if (RI) {
     RI = 0;
     /* don't overwrite chars already in buffer */
-    if(rxcnt < RXBUFLEN) rxbuf [(rxpos + rxcnt++) % RXBUFLEN] = SBUF;
+    if(rxcnt < RXBUFLEN) rxbuf [(unsigned char)(rxpos + rxcnt++) % RXBUFLEN] = SBUF;
     if(rxcnt >= (RXBUFLEN - THRESHOLD)) CTS = DISABLE;
   }
 
@@ -139,7 +138,7 @@ void ser_putc(unsigned char c)
 
   ES = 0;
   if (busy) {
-    txbuf[(txpos + txcnt++) % TXBUFLEN] = c;
+    txbuf[(unsigned char)(txpos + txcnt++) % TXBUFLEN] = c;
   } else {
     SBUF = c;
     busy = 1;