diff -r 28e9d479aa65 -r de4ee16f7c6c targets/plc_debug.c --- a/targets/plc_debug.c Sat Dec 06 19:31:51 2014 +0000 +++ b/targets/plc_debug.c Wed Oct 21 15:00:32 2015 +0100 @@ -39,19 +39,23 @@ **/ %(extern_variables_declarations)s -typedef void(*__for_each_variable_do_fp)(void*, __IEC_types_enum); +typedef const struct { + void *ptr; + __IEC_types_enum type; +} dbgvardsc_t; + +static dbgvardsc_t dbgvardsc[] = { +%(variable_decl_array)s +}; + +typedef void(*__for_each_variable_do_fp)(dbgvardsc_t*); void __for_each_variable_do(__for_each_variable_do_fp fp) { -%(for_each_variable_do_code)s -} - -__IEC_types_enum __find_variable(unsigned int varindex, void ** varp) -{ - switch(varindex){ -%(find_variable_case_code)s - default: - *varp = NULL; - return UNKNOWN_ENUM; + int i; + for(i = 0; i < sizeof(dbgvardsc)/sizeof(dbgvardsc_t); i++){ + dbgvardsc_t *dsc = &dbgvardsc[i]; + if(dsc->type != UNKNOWN_ENUM) + (*fp)(dsc); } } @@ -70,12 +74,13 @@ forced_value_p = &((__IEC_##TYPENAME##_p *)varp)->fvalue;\ break; -void* UnpackVar(void* varp, __IEC_types_enum vartype, void **real_value_p, char *flags) -{ +void* UnpackVar(dbgvardsc_t *dsc, void **real_value_p, char *flags) +{ + void *varp = dsc->ptr; void *forced_value_p = NULL; *flags = 0; /* find data to copy*/ - switch(vartype){ + switch(dsc->type){ __ANY(__Unpack_case_t) __ANY(__Unpack_case_p) default: @@ -88,14 +93,14 @@ void Remind(unsigned int offset, unsigned int count, void * p); -void RemindIterator(void* varp, __IEC_types_enum vartype) +void RemindIterator(dbgvardsc_t *dsc) { void *real_value_p = NULL; char flags = 0; - UnpackVar(varp, vartype, &real_value_p, &flags); + UnpackVar(dsc, &real_value_p, &flags); if(flags & __IEC_RETAIN_FLAG){ - USINT size = __get_type_enum_size(vartype); + USINT size = __get_type_enum_size(dsc->type); /* compute next cursor positon*/ unsigned int next_retain_offset = retain_offset + size; /* if buffer not full */ @@ -106,6 +111,7 @@ } extern int CheckRetainBuffer(void); +extern void InitRetain(void); void __init_debug(void) { @@ -113,13 +119,19 @@ buffer_cursor = debug_buffer; retain_offset = 0; buffer_state = BUFFER_FREE; + InitRetain(); /* Iterate over all variables to fill debug buffer */ - if(CheckRetainBuffer()) + if(CheckRetainBuffer()){ __for_each_variable_do(RemindIterator); + }else{ + char mstr[] = "RETAIN memory invalid - defaults used"; + LogMessage(LOG_WARNING, mstr, sizeof(mstr)); + } retain_offset = 0; } extern void InitiateDebugTransfer(void); +extern void CleanupRetain(void); extern unsigned long __tick; @@ -127,6 +139,7 @@ { buffer_cursor = debug_buffer; InitiateDebugTransfer(); + CleanupRetain(); } void __retrieve_debug(void) @@ -136,23 +149,23 @@ void Retain(unsigned int offset, unsigned int count, void * p); -inline void BufferIterator(void* varp, __IEC_types_enum vartype, int do_debug) +inline void BufferIterator(dbgvardsc_t *dsc, int do_debug) { void *real_value_p = NULL; void *visible_value_p = NULL; char flags = 0; - visible_value_p = UnpackVar(varp, vartype, &real_value_p, &flags); + visible_value_p = UnpackVar(dsc, &real_value_p, &flags); if(flags & ( __IEC_DEBUG_FLAG | __IEC_RETAIN_FLAG)){ - USINT size = __get_type_enum_size(vartype); + USINT size = __get_type_enum_size(dsc->type); if(flags & __IEC_DEBUG_FLAG){ /* copy visible variable to buffer */; if(do_debug){ /* compute next cursor positon. No need to check overflow, as BUFFER_SIZE is computed large enough */ - if(vartype == STRING_ENUM){ + if(dsc->type == STRING_ENUM){ /* optimization for strings */ size = ((STRING*)visible_value_p)->len + 1; } @@ -178,12 +191,12 @@ } } -void DebugIterator(void* varp, __IEC_types_enum vartype){ - BufferIterator(varp, vartype, 1); -} - -void RetainIterator(void* varp, __IEC_types_enum vartype){ - BufferIterator(varp, vartype, 0); +void DebugIterator(dbgvardsc_t *dsc){ + BufferIterator(dsc, 1); +} + +void RetainIterator(dbgvardsc_t *dsc){ + BufferIterator(dsc, 0); } extern void PLC_GetTime(IEC_TIME*); @@ -251,13 +264,18 @@ break; void RegisterDebugVariable(int idx, void* force) { - void *varp = NULL; - unsigned char flags = force ? __IEC_DEBUG_FLAG | __IEC_FORCE_FLAG : __IEC_DEBUG_FLAG; - switch(__find_variable(idx, &varp)){ - __ANY(__RegisterDebugVariable_case_t) - __ANY(__RegisterDebugVariable_case_p) - default: - break; + if(idx < sizeof(dbgvardsc)/sizeof(dbgvardsc_t)){ + unsigned char flags = force ? + __IEC_DEBUG_FLAG | __IEC_FORCE_FLAG : + __IEC_DEBUG_FLAG; + dbgvardsc_t *dsc = &dbgvardsc[idx]; + void *varp = dsc->ptr; + switch(dsc->type){ + __ANY(__RegisterDebugVariable_case_t) + __ANY(__RegisterDebugVariable_case_p) + default: + break; + } } } @@ -272,10 +290,11 @@ ((__IEC_##TYPENAME##_p *)varp)->flags &= ~(__IEC_DEBUG_FLAG|__IEC_FORCE_FLAG);\ break; -void ResetDebugVariablesIterator(void* varp, __IEC_types_enum vartype) +void ResetDebugVariablesIterator(dbgvardsc_t *dsc) { /* force debug flag to 0*/ - switch(vartype){ + void *varp = dsc->ptr; + switch(dsc->type){ __ANY(__ResetDebugVariablesIterator_case_t) __ANY(__ResetDebugVariablesIterator_case_p) default: