targets/plc_debug.c
changeset 239 112b4bc523b3
parent 236 a32817e81f5e
child 244 85e92d9e34a8
equal deleted inserted replaced
238:02d0daed3e46 239:112b4bc523b3
    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 {