targets/LPC/plc_LPC_main.c
changeset 577 04baf6607a44
parent 521 02cb9e5fb6f6
child 579 554ba6df4ee0
--- a/targets/LPC/plc_LPC_main.c	Fri Feb 18 12:29:48 2011 +0100
+++ b/targets/LPC/plc_LPC_main.c	Tue Feb 22 14:11:50 2011 +0100
@@ -6,6 +6,12 @@
 
 /* provided by POUS.C */
 extern unsigned long long common_ticktime__;
+extern unsigned long __tick;
+
+static int debug_locked = 0;
+static int _DebugDataAvailable = 0;
+static unsigned long __debug_tick;
+
 void LPC_GetTime(IEC_TIME*);
 void LPC_SetTimer(unsigned long long next, unsigned long long period);
 
@@ -43,11 +49,16 @@
 
 int TryEnterDebugSection(void)
 {
-    return __DEBUG;
+    if(!debug_locked && __DEBUG){
+        debug_locked = 1;
+		return 1;
+    }
+    return 0;
 }
 
 void LeaveDebugSection(void)
 {
+        debug_locked = 0;
 }
 
 int stopPLC(void)
@@ -56,30 +67,40 @@
     return 0;
 }
 
-extern unsigned long __tick;
-int _DebugDataAvailable = 0;
 /* from plc_debugger.c */
 int WaitDebugData(unsigned long *tick)
 {
-    *tick = __tick;
-    return _DebugDataAvailable;
+    /* no blocking call on LPC */
+    if(_DebugDataAvailable && !debug_locked){
+        /* returns 0 on success */
+        *tick = __debug_tick;
+        _DebugDataAvailable = 0;
+        return 0;
+    }
+    return 1;
 }
 
 /* Called by PLC thread when debug_publish finished
  * This is supposed to unlock debugger thread in WaitDebugData*/
 void InitiateDebugTransfer(void)
 {
+    /* remember tick */
+    __debug_tick = __tick;
     _DebugDataAvailable = 1;
 }
 
 void suspendDebug(int disable)
 {
+    /* Prevent PLC to enter debug code */
     __DEBUG = !disable;
+    debug_locked = !disable;
 }
 
 void resumeDebug(void)
 {
+    /* Let PLC enter debug code */
     __DEBUG = 1;
+    debug_locked = 0;
 }
 
 int CheckRetainBuffer(void)