diff -r 02d0daed3e46 -r 112b4bc523b3 targets/plc_debug.c --- 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(); } }