targets/plc_debug.c
changeset 239 112b4bc523b3
parent 236 a32817e81f5e
child 244 85e92d9e34a8
--- a/targets/plc_debug.c	Thu Sep 04 16:07:14 2008 +0200
+++ b/targets/plc_debug.c	Fri Sep 05 16:25:57 2008 +0200
@@ -63,52 +63,62 @@
 {
 }
 
+extern int TryEnterDebugSection(void);
+extern void LeaveDebugSection(void);
+
+extern int __tick;
 void __publish_debug()
 {
-    /* Lock buffer */
-    long latest_state = AtomicCompareExchange(
-        &buffer_state,
-        BUFFER_FREE,
-        BUFFER_BUSY);
-        
-    /* If buffer was free */
-    if(latest_state == BUFFER_FREE)
-    {
-        int* subscription;
-        
-        /* Reset buffer cursor */
-        buffer_cursor = debug_buffer;
-        
-        /* iterate over subscriptions */
-        for(subscription=subscription_table;
-            subscription < latest_subscription;
-            subscription++)
+    /* Check there is no running debugger re-configuration */
+    if(TryEnterDebugSection()){
+        /* Lock buffer */
+        long latest_state = AtomicCompareExchange(
+            &buffer_state,
+            BUFFER_FREE,
+            BUFFER_BUSY);
+            
+        /* If buffer was free */
+        if(latest_state == BUFFER_FREE)
         {
-            /* get variable descriptor */
-            struct_plcvar* my_var = &variable_table[*subscription];
-            char* next_cursor;
-            /* get variable size*/
-            USINT size = __get_type_enum_size(my_var->type);
-            /* compute next cursor positon*/
-            next_cursor = buffer_cursor + size;
-            /* if buffer not full */
-            if(next_cursor < debug_buffer + BUFFER_SIZE)
+            int* subscription;
+            
+            /* Reset buffer cursor */
+            buffer_cursor = debug_buffer;
+            
+            /* iterate over subscriptions */
+            for(subscription=subscription_table;
+                subscription < latest_subscription;
+                subscription++)
             {
-                /* copy data to the buffer */
-                memcpy(buffer_cursor, my_var->ptrvalue, size);
-                /* increment cursor according size*/
-                buffer_cursor = next_cursor;
-            }else{
-                /*TODO : signal overflow*/
+                /* get variable descriptor */
+                struct_plcvar* my_var = &variable_table[*subscription];
+                char* next_cursor;
+                /* get variable size*/
+                USINT size = __get_type_enum_size(my_var->type);
+                /* compute next cursor positon*/
+                next_cursor = buffer_cursor + size;
+                /* if buffer not full */
+                if(next_cursor < debug_buffer + BUFFER_SIZE)
+                {
+                    /* copy data to the buffer */
+                    memcpy(buffer_cursor, my_var->ptrvalue, size);
+                    /* increment cursor according size*/
+                    buffer_cursor = next_cursor;
+                }else{
+                    /*TODO : signal overflow*/
+                }
             }
+    
+            /* Reset buffer cursor again (for IterDebugData)*/
+            buffer_cursor = debug_buffer;
+            subscription_cursor = subscription_table;
+            
+            /* Leave debug section,
+             * Trigger asynchronous transmission 
+             * (returns immediately) */
+            InitiateDebugTransfer(); /* size */
         }
-
-        /* Reset buffer cursor again (for IterDebugData)*/
-        buffer_cursor = debug_buffer;
-        subscription_cursor = subscription_table;
-        
-        /* Trigger asynchronous transmission (returns immediately) */
-        InitiateDebugTransfer(); /* size */
+        LeaveDebugSection();
     }
 }