61 |
61 |
62 void __retrieve_debug() |
62 void __retrieve_debug() |
63 { |
63 { |
64 } |
64 } |
65 |
65 |
|
66 extern int TryEnterDebugSection(void); |
|
67 extern void LeaveDebugSection(void); |
|
68 |
|
69 extern int __tick; |
66 void __publish_debug() |
70 void __publish_debug() |
67 { |
71 { |
68 /* Lock buffer */ |
72 /* Check there is no running debugger re-configuration */ |
69 long latest_state = AtomicCompareExchange( |
73 if(TryEnterDebugSection()){ |
70 &buffer_state, |
74 /* Lock buffer */ |
71 BUFFER_FREE, |
75 long latest_state = AtomicCompareExchange( |
72 BUFFER_BUSY); |
76 &buffer_state, |
73 |
77 BUFFER_FREE, |
74 /* If buffer was free */ |
78 BUFFER_BUSY); |
75 if(latest_state == BUFFER_FREE) |
79 |
76 { |
80 /* If buffer was free */ |
77 int* subscription; |
81 if(latest_state == BUFFER_FREE) |
78 |
|
79 /* Reset buffer cursor */ |
|
80 buffer_cursor = debug_buffer; |
|
81 |
|
82 /* iterate over subscriptions */ |
|
83 for(subscription=subscription_table; |
|
84 subscription < latest_subscription; |
|
85 subscription++) |
|
86 { |
82 { |
87 /* get variable descriptor */ |
83 int* subscription; |
88 struct_plcvar* my_var = &variable_table[*subscription]; |
84 |
89 char* next_cursor; |
85 /* Reset buffer cursor */ |
90 /* get variable size*/ |
86 buffer_cursor = debug_buffer; |
91 USINT size = __get_type_enum_size(my_var->type); |
87 |
92 /* compute next cursor positon*/ |
88 /* iterate over subscriptions */ |
93 next_cursor = buffer_cursor + size; |
89 for(subscription=subscription_table; |
94 /* if buffer not full */ |
90 subscription < latest_subscription; |
95 if(next_cursor < debug_buffer + BUFFER_SIZE) |
91 subscription++) |
96 { |
92 { |
97 /* copy data to the buffer */ |
93 /* get variable descriptor */ |
98 memcpy(buffer_cursor, my_var->ptrvalue, size); |
94 struct_plcvar* my_var = &variable_table[*subscription]; |
99 /* increment cursor according size*/ |
95 char* next_cursor; |
100 buffer_cursor = next_cursor; |
96 /* get variable size*/ |
101 }else{ |
97 USINT size = __get_type_enum_size(my_var->type); |
102 /*TODO : signal overflow*/ |
98 /* compute next cursor positon*/ |
|
99 next_cursor = buffer_cursor + size; |
|
100 /* if buffer not full */ |
|
101 if(next_cursor < debug_buffer + BUFFER_SIZE) |
|
102 { |
|
103 /* copy data to the buffer */ |
|
104 memcpy(buffer_cursor, my_var->ptrvalue, size); |
|
105 /* increment cursor according size*/ |
|
106 buffer_cursor = next_cursor; |
|
107 }else{ |
|
108 /*TODO : signal overflow*/ |
|
109 } |
103 } |
110 } |
|
111 |
|
112 /* Reset buffer cursor again (for IterDebugData)*/ |
|
113 buffer_cursor = debug_buffer; |
|
114 subscription_cursor = subscription_table; |
|
115 |
|
116 /* Leave debug section, |
|
117 * Trigger asynchronous transmission |
|
118 * (returns immediately) */ |
|
119 InitiateDebugTransfer(); /* size */ |
104 } |
120 } |
105 |
121 LeaveDebugSection(); |
106 /* Reset buffer cursor again (for IterDebugData)*/ |
|
107 buffer_cursor = debug_buffer; |
|
108 subscription_cursor = subscription_table; |
|
109 |
|
110 /* Trigger asynchronous transmission (returns immediately) */ |
|
111 InitiateDebugTransfer(); /* size */ |
|
112 } |
122 } |
113 } |
123 } |
114 |
124 |
115 void RegisterDebugVariable(int idx) |
125 void RegisterDebugVariable(int idx) |
116 { |
126 { |