diff -r 7c83eb6a55bd -r bc26c42d2eec targets/plc_debug.c --- 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); } }