targets/plc_debug.c
changeset 483 bc26c42d2eec
parent 477 f66a092b6e74
child 491 28afed8b1af5
--- a/targets/plc_debug.c	Wed Dec 09 00:56:18 2009 +0100
+++ b/targets/plc_debug.c	Wed Dec 09 01:11:48 2009 +0100
@@ -29,7 +29,7 @@
 
 /* Buffer's cursor*/
 static char* buffer_cursor = debug_buffer;
-
+static unsigned int retain_offset = 0;
 /***
  * Declare programs 
  **/
@@ -56,42 +56,20 @@
     }
 }
 
-void __init_debug(void)
-{
-    buffer_state = BUFFER_FREE;
-}
-
-void __cleanup_debug(void)
-{
-}
-
-void __retrieve_debug(void)
-{
-}
-
-extern int TryEnterDebugSection(void);
-extern void LeaveDebugSection(void);
-extern long AtomicCompareExchange(long*, long, long);
-extern void InitiateDebugTransfer(void);
-
-extern unsigned long __tick;
-
 #define __BufferDebugDataIterator_case_t(TYPENAME) \
         case TYPENAME##_ENUM :\
-            flags = ((__IEC_##TYPENAME##_t *)varp)->flags;\
-            ptrvalue = &((__IEC_##TYPENAME##_t *)varp)->value;\
+            *flags = ((__IEC_##TYPENAME##_t *)varp)->flags;\
+            *ptrvalue = &((__IEC_##TYPENAME##_t *)varp)->value;\
             break;
 
 #define __BufferDebugDataIterator_case_p(TYPENAME)\
         case TYPENAME##_P_ENUM :\
-            flags = ((__IEC_##TYPENAME##_p *)varp)->flags;\
-            ptrvalue = ((__IEC_##TYPENAME##_p *)varp)->value;\
-            break;
-
-void BufferDebugDataIterator(void* varp, __IEC_types_enum vartype)
-{
-    void *ptrvalue = NULL;
-    char flags = 0;
+            *flags = ((__IEC_##TYPENAME##_p *)varp)->flags;\
+            *ptrvalue = ((__IEC_##TYPENAME##_p *)varp)->value;\
+            break;
+
+void UnpackVar(void* varp, __IEC_types_enum vartype, void **ptrvalue, char *flags)
+{
     /* find data to copy*/
     switch(vartype){
         ANY(__BufferDebugDataIterator_case_t)
@@ -99,26 +77,114 @@
     default:
         break;
     }
-    if(flags && __IEC_DEBUG_FLAG){
+}
+
+void Remind(unsigned int offset, unsigned int count, void * p);
+
+void RemindIterator(void* varp, __IEC_types_enum vartype)
+{
+    void *ptrvalue = NULL;
+    char flags = 0;
+    UnpackVar(varp, vartype, &ptrvalue, &flags);
+
+    if(flags && __IEC_RETAIN_FLAG){
         USINT size = __get_type_enum_size(vartype);
         /* compute next cursor positon*/
-        char* next_cursor = buffer_cursor + size;
+        unsigned int next_retain_offset = retain_offset + size;
         /* if buffer not full */
-        if(next_cursor <= debug_buffer + BUFFER_SIZE)
-        {
-            /* copy data to the buffer */
-            memcpy(buffer_cursor, ptrvalue, size);
-            /* increment cursor according size*/
-            buffer_cursor = next_cursor;
-        }else{
-            /*TODO : signal overflow*/
+        Remind(retain_offset, size, ptrvalue);
+        /* increment cursor according size*/
+        retain_offset = next_retain_offset;
+    }
+}
+
+void __init_debug(void)
+{
+    /* init local static vars */
+    buffer_cursor = debug_buffer;
+    retain_offset = 0;
+    buffer_state = BUFFER_FREE;
+    /* Iterate over all variables to fill debug buffer */
+    __for_each_variable_do(RemindIterator);
+    retain_offset = 0;
+}
+
+extern void InitiateDebugTransfer(void);
+
+extern unsigned long __tick;
+
+void __cleanup_debug(void)
+{
+    buffer_cursor = debug_buffer;
+    InitiateDebugTransfer();
+}
+
+void __retrieve_debug(void)
+{
+}
+
+void DoDebug(void *ptrvalue, char flags, USINT size)
+{
+    /* compute next cursor positon*/
+    char* next_cursor = buffer_cursor + size;
+    /* if buffer not full */
+    if(next_cursor <= debug_buffer + BUFFER_SIZE)
+    {
+        /* copy data to the buffer */
+        memcpy(buffer_cursor, ptrvalue, size);
+        /* increment cursor according size*/
+        buffer_cursor = next_cursor;
+    }else{
+        /*TODO : signal overflow*/
+    }
+}
+
+void Retain(unsigned int offset, unsigned int count, void * p);
+void DoRetain(void *ptrvalue, char flags, USINT size){
+    /* compute next cursor positon*/
+    unsigned int next_retain_offset = retain_offset + size;
+    /* if buffer not full */
+    Retain(retain_offset, size, ptrvalue);
+    /* increment cursor according size*/
+    retain_offset = next_retain_offset;
+}
+
+void BufferDebugDataIterator(void* varp, __IEC_types_enum vartype)
+{
+    void *ptrvalue = NULL;
+    char flags = 0;
+    UnpackVar(varp, vartype, &ptrvalue, &flags);
+    /* For optimization purpose we do retain and debug in the same pass */
+    if(flags & (__IEC_DEBUG_FLAG | __IEC_RETAIN_FLAG)){
+        USINT size = __get_type_enum_size(vartype);
+        if(flags & __IEC_DEBUG_FLAG){
+            DoDebug(ptrvalue, flags, size);
         }
-    }
-}
-
+        if(flags & __IEC_RETAIN_FLAG){
+            DoRetain(ptrvalue, flags, size);
+        }
+    }
+}
+
+void RetainIterator(void* varp, __IEC_types_enum vartype)
+{
+    void *ptrvalue = NULL;
+    char flags = 0;
+    UnpackVar(varp, vartype, &ptrvalue, &flags);
+
+    if(flags & __IEC_RETAIN_FLAG){
+        USINT size = __get_type_enum_size(vartype);
+        DoRetain(ptrvalue, flags, size);
+    }
+}
+
+extern int TryEnterDebugSection(void);
+extern long AtomicCompareExchange(long*, long, long);
+extern void LeaveDebugSection(void);
 
 void __publish_debug(void)
 {
+    retain_offset = 0;
     /* Check there is no running debugger re-configuration */
     if(TryEnterDebugSection()){
         /* Lock buffer */
@@ -141,6 +207,9 @@
             InitiateDebugTransfer(); /* size */
         }
         LeaveDebugSection();
+    }else{
+        /* when not debugging, do only retain */
+        __for_each_variable_do(RetainIterator);
     }
 }