From b7e2b39495b11e385b35a938dbccba0a99b68ff1 Mon Sep 17 00:00:00 2001 From: joxe Date: Wed, 27 Feb 2008 14:33:11 +0000 Subject: [PATCH] fixed USART interrupt handling git-svn-id: https://mspsim.svn.sourceforge.net/svnroot/mspsim/mspsim@148 23d1a52b-0c3c-0410-b72d-8f29ab48fe35 --- CHANGE_LOG.txt | 2 +- se/sics/mspsim/chip/Beeper.java | 2 +- se/sics/mspsim/core/ADC12.java | 2 +- se/sics/mspsim/core/BasicClockModule.java | 2 +- se/sics/mspsim/core/IOPort.java | 2 +- se/sics/mspsim/core/IOUnit.java | 2 +- se/sics/mspsim/core/MSP430Core.java | 3 ++- se/sics/mspsim/core/Multiplier.java | 2 +- se/sics/mspsim/core/SFR.java | 4 ++-- se/sics/mspsim/core/Timer.java | 2 +- se/sics/mspsim/core/USART.java | 23 ++++++++++++++++------- 11 files changed, 28 insertions(+), 18 deletions(-) diff --git a/CHANGE_LOG.txt b/CHANGE_LOG.txt index 207fbba..56bbbd1 100644 --- a/CHANGE_LOG.txt +++ b/CHANGE_LOG.txt @@ -4,7 +4,7 @@ Changes: - fixed RSSI-ready flag to be set in CC2420 - refactored code from Sky/ESB into GenericNode - fixed workaround for AWT/IO read line hang bug. (works but not nice in - cygwin) + cygwin). Workaround is off by default by can be configured in CLI. - added several new commands (start, stop, step, print, printreg, etc). 0.83 diff --git a/se/sics/mspsim/chip/Beeper.java b/se/sics/mspsim/chip/Beeper.java index 916a0c7..1b646a2 100644 --- a/se/sics/mspsim/chip/Beeper.java +++ b/se/sics/mspsim/chip/Beeper.java @@ -129,7 +129,7 @@ public class Beeper extends IOUnit { } // Nothing for interrupts... - public void interruptServiced() { + public void interruptServiced(int vector) { } public static void main(String[] args) { diff --git a/se/sics/mspsim/core/ADC12.java b/se/sics/mspsim/core/ADC12.java index c84684f..73f3e8a 100644 --- a/se/sics/mspsim/core/ADC12.java +++ b/se/sics/mspsim/core/ADC12.java @@ -125,7 +125,7 @@ public class ADC12 extends IOUnit { return "AD12"; } - public void interruptServiced() { + public void interruptServiced(int vector) { } public long ioTick(long cycles) { diff --git a/se/sics/mspsim/core/BasicClockModule.java b/se/sics/mspsim/core/BasicClockModule.java index 27d3d23..117f983 100644 --- a/se/sics/mspsim/core/BasicClockModule.java +++ b/se/sics/mspsim/core/BasicClockModule.java @@ -161,7 +161,7 @@ public class BasicClockModule extends IOUnit { return "BasicClockModule"; } - public void interruptServiced() { + public void interruptServiced(int vector) { } public int getModeMax() { diff --git a/se/sics/mspsim/core/IOPort.java b/se/sics/mspsim/core/IOPort.java index 4f9990b..8738f75 100644 --- a/se/sics/mspsim/core/IOPort.java +++ b/se/sics/mspsim/core/IOPort.java @@ -158,7 +158,7 @@ public class IOPort extends IOUnit { return "Port " + name; } - public void interruptServiced() { + public void interruptServiced(int vector) { } // for HW to set hi/low on the pins... diff --git a/se/sics/mspsim/core/IOUnit.java b/se/sics/mspsim/core/IOUnit.java index c950c85..a3ab9c0 100644 --- a/se/sics/mspsim/core/IOUnit.java +++ b/se/sics/mspsim/core/IOUnit.java @@ -87,7 +87,7 @@ public abstract class IOUnit extends Chip { // We should add "Interrupt serviced..." to indicate that its latest // Interrupt was serviced... - public abstract void interruptServiced(); + public abstract void interruptServiced(int vector); // Utility function for converting 16 bits data to correct return // value depending on address alignment and word/byte mode diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index 5184421..fea93d1 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -512,9 +512,10 @@ public class MSP430Core extends Chip implements MSP430Constants { System.out.println("### Calling serviced interrupt on: " + servicedInterruptUnit.getName()); } - servicedInterruptUnit.interruptServiced(); + servicedInterruptUnit.interruptServiced(servicedInterrupt); } + // Find next pending interrupt for (int i = 0, n = 16; i < n; i++) { if (interruptSource[i] != null) interruptMax = i; diff --git a/se/sics/mspsim/core/Multiplier.java b/se/sics/mspsim/core/Multiplier.java index 83a0a6e..359c3f1 100644 --- a/se/sics/mspsim/core/Multiplier.java +++ b/se/sics/mspsim/core/Multiplier.java @@ -113,7 +113,7 @@ public class Multiplier extends IOUnit { return "Hardware Multiplier"; } - public void interruptServiced() { + public void interruptServiced(int vector) { } public int getModeMax() { diff --git a/se/sics/mspsim/core/SFR.java b/se/sics/mspsim/core/SFR.java index 190cfeb..c1bb310 100644 --- a/se/sics/mspsim/core/SFR.java +++ b/se/sics/mspsim/core/SFR.java @@ -62,7 +62,7 @@ public class SFR extends IOUnit { private int[] memory; private MSP430Core cpu; - private boolean DEBUG = false; + private boolean DEBUG = true; public SFR(MSP430Core cpu, int[] memory) { super(memory, 0); @@ -148,7 +148,7 @@ public class SFR extends IOUnit { else return ifg2; } - public void interruptServiced() { + public void interruptServiced(int vector) { } public String getName() { diff --git a/se/sics/mspsim/core/Timer.java b/se/sics/mspsim/core/Timer.java index 7bc3292..2045741 100644 --- a/se/sics/mspsim/core/Timer.java +++ b/se/sics/mspsim/core/Timer.java @@ -680,7 +680,7 @@ public class Timer extends IOUnit { // The interrupt have been serviced... // Some flags should be cleared (the highest priority flags)? - public void interruptServiced() { + public void interruptServiced(int vector) { if (MSP430Core.debugInterrupts) { System.out.println("interrupt Serviced..."); } diff --git a/se/sics/mspsim/core/USART.java b/se/sics/mspsim/core/USART.java index 4f66614..2043a21 100644 --- a/se/sics/mspsim/core/USART.java +++ b/se/sics/mspsim/core/USART.java @@ -82,9 +82,6 @@ public class USART extends IOUnit { private int receiveInterrupt = 0; private int transmitInterrupt = 0; - private boolean rxIntEnabled = false; - private boolean txIntEnabled = false; - private int utxifg; private int urxifg; @@ -106,6 +103,8 @@ public class USART extends IOUnit { private int utxbuf; + private boolean txInterruptPending = false; + /** * Creates a new USART instance. * @@ -294,10 +293,19 @@ public class USART extends IOUnit { // We should add "Interrupt serviced..." to indicate that its latest // Interrupt was serviced... - public void interruptServiced() { + public void interruptServiced(int vector) { // Another byte was received while the last interrupt was processed... - cpu.flagInterrupt(receiveInterrupt, this, - isIEBitsSet(urxifg) && ((getIFG() & urxifg) != 0)); + if (vector == receiveInterrupt) { + cpu.flagInterrupt(receiveInterrupt, this, + isIEBitsSet(urxifg) && ((getIFG() & urxifg) != 0)); + } else { + // Should we immediately make this empty again??? + if (!txInterruptPending) { + cpu.flagInterrupt(transmitInterrupt, this, false); + } else { + txInterruptPending = false; + } + } } @@ -310,7 +318,8 @@ public class USART extends IOUnit { setBitIFG(utxifg); utctl |= UTCTL_TXEMPTY; cpu.flagInterrupt(transmitInterrupt, this, isIEBitsSet(utxifg)); - + txInterruptPending = true; + if (DEBUG) { if (isIEBitsSet(utxifg)) { System.out.println(getName() + " flagging on transmit interrupt");