Skip to content

Commit 4d3df3b

Browse files
committed
[trace] Arduino target, with overflow
1 parent 32dfbcc commit 4d3df3b

File tree

1 file changed

+112
-40
lines changed

1 file changed

+112
-40
lines changed

tpl_trace.cpp

Lines changed: 112 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,20 @@ extern "C" FUNC(void, OS_CODE) tpl_trace_start()
5555
#endif
5656
}
5757

58+
/* Serial.write with care of the overflow */
59+
uint8_t serialWrite(uint8_t data)
60+
{
61+
uint8_t result;
62+
if(Serial.availableForWrite())
63+
{
64+
Serial.write(data);
65+
result = 0;
66+
} else {
67+
result = 0;
68+
}
69+
return result;
70+
}
71+
5872
/**
5973
* Trace ends (close the file for instance). This event is sent by
6074
* ShutdownOS() system call
@@ -65,6 +79,48 @@ extern "C" FUNC(void, OS_CODE) tpl_trace_close()
6579

6680
}
6781

82+
/**
83+
* Overflow. there are too many trace messages and the trace subsystem
84+
* cannot handle all this stuff.
85+
* we just flush the fifo and send a trace overflow message. There will
86+
* be lost trace messages.
87+
* NOTE: ***** the system should be able to send 5 bytes at minimum *****
88+
* (the TX serial line fifo should be > 5 bytes).
89+
*
90+
*/
91+
FUNC(void, OS_CODE) tpl_trace_overflow()
92+
{
93+
const tpl_tick ts=tpl_trace_get_timestamp();
94+
tpl_trace_start();
95+
# if TRACE_FORMAT == TRACE_FORMAT_SERIAL
96+
//there was an overflow, first flush the serial line
97+
//we do not generate any overflow here of course
98+
//to prevent recursive calls.
99+
//
100+
//in Arduino, we cannot empty the Serial line
101+
//we have to wait for the end of transmission...
102+
//however, at last one message is not completed.
103+
Serial.flush();
104+
/* TTT 00000 (Type) */
105+
uint8_t byte = OVERFLOW << 5;
106+
uint8_t chksum = byte;
107+
Serial.write(byte);
108+
109+
byte = ts >> 8;
110+
chksum += byte;
111+
Serial.write(byte);
112+
113+
byte = ts & 0xff;
114+
chksum += byte;
115+
Serial.write(byte);
116+
117+
Serial.write(0); //no data
118+
Serial.write(chksum);
119+
# else
120+
# error "unsupported trace mode: TRACE_FORMAT"
121+
# endif /* TRACE_FORMAT == TRACE_FORMAT_SERIAL */
122+
}
123+
68124
/**
69125
* trace the execution of a task or ISR
70126
* ** Function defined in os/tpl_trace.h **
@@ -80,21 +136,23 @@ extern "C" FUNC(void, OS_CODE) tpl_trace_proc_change_state(
80136
/* TTT 00 SSS (Type, State) */
81137
uint8_t byte = PROC_TYPE<<5 | target_state;
82138
uint8_t chksum = byte;
83-
Serial.write(byte);
139+
uint8_t overflow = 0;
140+
overflow |= serialWrite(byte);
84141

85142
byte = ts >> 8;
86143
chksum += byte;
87-
Serial.write(byte);
144+
overflow |= serialWrite(byte);
88145

89146
byte = ts & 0xff;
90147
chksum += byte;
91-
Serial.write(byte);
148+
overflow |= serialWrite(byte);
92149

93150
byte = proc_id & 0xff;
94151
chksum += byte;
95-
Serial.write(byte);
152+
overflow |= serialWrite(byte);
96153

97-
Serial.write(chksum);
154+
overflow |= serialWrite(chksum);
155+
if(overflow) tpl_trace_overflow();
98156
# else
99157
# error "unsupported trace mode: TRACE_FORMAT"
100158
#endif
@@ -116,21 +174,23 @@ extern "C" FUNC(void, OS_CODE) tpl_trace_res_change_state(
116174
/* TTT 00 00S (Type, State) */
117175
uint8_t byte = (RES_TYPE<<5) | (target_state & 1);
118176
uint8_t chksum = byte;
119-
Serial.write(byte);
177+
uint8_t overflow = 0;
178+
overflow |= serialWrite(byte);
120179

121180
byte = ts >> 8;
122181
chksum += byte;
123-
Serial.write(byte);
182+
overflow |= serialWrite(byte);
124183

125184
byte = ts & 0xff;
126185
chksum += byte;
127-
Serial.write(byte);
186+
overflow |= serialWrite(byte);
128187

129188
byte = res_id & 0xff;
130189
chksum += byte;
131-
Serial.write(byte);
190+
overflow |= serialWrite(byte);
132191

133-
Serial.write(chksum);
192+
overflow |= serialWrite(chksum);
193+
if(overflow) tpl_trace_overflow();
134194
# else
135195
# error "unsupported trace mode: TRACE_FORMAT"
136196
#endif
@@ -151,21 +211,23 @@ extern "C" FUNC(void, OS_CODE) tpl_trace_time_obj_change_state(
151211
/* TTT K0 SSS (Type, Kind, State) */
152212
uint8_t byte = TIMEOBJ_TYPE<<5 | TIMEOBJ_CHANGE_STATE_KIND <<4 | target_state;
153213
uint8_t chksum = byte;
154-
Serial.write(byte);
214+
uint8_t overflow = 0;
215+
overflow |= serialWrite(byte);
155216

156217
byte = ts >> 8;
157218
chksum += byte;
158-
Serial.write(byte);
219+
overflow |= serialWrite(byte);
159220

160221
byte = ts & 0xff;
161222
chksum += byte;
162-
Serial.write(byte);
223+
overflow |= serialWrite(byte);
163224

164225
byte = timeobj_id & 0xff;
165226
chksum += byte;
166-
Serial.write(byte);
227+
overflow |= serialWrite(byte);
167228

168-
Serial.write(chksum);
229+
overflow |= serialWrite(chksum);
230+
if(overflow) tpl_trace_overflow();
169231
# else
170232
# error "unsupported trace mode: TRACE_FORMAT"
171233
#endif
@@ -185,21 +247,23 @@ extern "C" FUNC(void, OS_CODE) tpl_trace_time_obj_expire(
185247
/* TTT K0000 (Type, Kind) */
186248
uint8_t byte = TIMEOBJ_TYPE<<5 | TIMEOBJ_EXPIRE_KIND <<4;
187249
uint8_t chksum = byte;
188-
Serial.write(byte);
250+
uint8_t overflow = 0;
251+
overflow |= serialWrite(byte);
189252

190253
byte = ts >> 8;
191254
chksum += byte;
192-
Serial.write(byte);
255+
overflow |= serialWrite(byte);
193256

194257
byte = ts & 0xff;
195258
chksum += byte;
196-
Serial.write(byte);
259+
overflow |= serialWrite(byte);
197260

198261
byte = timeobj_id & 0xff;
199262
chksum += byte;
200-
Serial.write(byte);
263+
overflow |= serialWrite(byte);
201264

202-
Serial.write(chksum);
265+
overflow |= serialWrite(chksum);
266+
if(overflow) tpl_trace_overflow();
203267
# else
204268
# error "unsupported trace mode: TRACE_FORMAT"
205269
#endif
@@ -221,22 +285,24 @@ extern "C" FUNC(void, OS_CODE) tpl_trace_event_set(
221285
/* TTT EEEEE (Type, Event) */
222286
uint8_t byte = EVENT_TYPE<<5 | (event & 0x1F);
223287
uint8_t chksum = byte;
224-
Serial.write(byte);
288+
uint8_t overflow = 0;
289+
overflow |= serialWrite(byte);
225290

226291
byte = ts >> 8;
227292
chksum += byte;
228-
Serial.write(byte);
293+
overflow |= serialWrite(byte);
229294

230295
byte = ts & 0xff;
231296
chksum += byte;
232-
Serial.write(byte);
297+
overflow |= serialWrite(byte);
233298

234299
//TODO: limited to 128 tasks
235300
byte = (EVENT_SET_KIND << 7) | (task_target_id & 0x7f);
236301
chksum += byte;
237-
Serial.write(byte);
302+
overflow |= serialWrite(byte);
238303

239-
Serial.write(chksum);
304+
overflow |= serialWrite(chksum);
305+
if(overflow) tpl_trace_overflow();
240306
# else
241307
# error "unsupported trace mode: TRACE_FORMAT"
242308
#endif
@@ -257,21 +323,23 @@ extern "C" FUNC(void, OS_CODE) tpl_trace_event_reset(
257323
/* TTT EEEEE (Type, Event) */
258324
uint8_t byte = EVENT_TYPE<<5 | (event & 0x1F);
259325
uint8_t chksum = byte;
260-
Serial.write(byte);
326+
uint8_t overflow = 0;
327+
overflow |= serialWrite(byte);
261328

262329
byte = ts >> 8;
263330
chksum += byte;
264-
Serial.write(byte);
331+
overflow |= serialWrite(byte);
265332

266333
byte = ts & 0xff;
267334
chksum += byte;
268-
Serial.write(byte);
335+
overflow |= serialWrite(byte);
269336

270337
byte = EVENT_RESET_KIND << 7;
271338
chksum += byte;
272-
Serial.write(byte);
339+
overflow |= serialWrite(byte);
273340

274-
Serial.write(chksum);
341+
overflow |= serialWrite(chksum);
342+
if(overflow) tpl_trace_overflow();
275343
# else
276344
# error "unsupported trace mode: TRACE_FORMAT"
277345
#endif
@@ -293,21 +361,23 @@ extern "C" FUNC(void, OS_CODE) tpl_trace_msg_send(
293361
/* TTT MMMMM (Type, Message) */
294362
uint8_t byte = MESSAGE_TYPE << 5 | (mess_id & 0x1F);
295363
uint8_t chksum = byte;
296-
Serial.write(byte);
364+
uint8_t overflow = 0;
365+
overflow |= serialWrite(byte);
297366

298367
byte = ts >> 8;
299368
chksum += byte;
300-
Serial.write(byte);
369+
overflow |= serialWrite(byte);
301370

302371
byte = ts & 0xff;
303372
chksum += byte;
304-
Serial.write(byte);
373+
overflow |= serialWrite(byte);
305374

306375
byte = (uint8_t)is_zero_message;
307376
chksum += byte;
308-
Serial.write(byte);
377+
overflow |= serialWrite(byte);
309378

310-
Serial.write(chksum);
379+
overflow |= serialWrite(chksum);
380+
if(overflow) tpl_trace_overflow();
311381
# else
312382
# error "unsupported trace mode: TRACE_FORMAT"
313383
# endif /* TRACE_FORMAT == TRACE_FORMAT_SERIAL */
@@ -326,21 +396,23 @@ FUNC(void, OS_CODE) tpl_trace_msg_receive(
326396
/* TTT MMMMM (Type, Message) */
327397
uint8_t byte = MESSAGE_TYPE << 5 | (mess_id & 0x1F);
328398
uint8_t chksum = byte;
329-
Serial.write(byte);
399+
uint8_t overflow = 0;
400+
overflow |= serialWrite(byte);
330401

331402
byte = ts >> 8;
332403
chksum += byte;
333-
Serial.write(byte);
404+
overflow |= serialWrite(byte);
334405

335406
byte = ts & 0xff;
336407
chksum += byte;
337-
Serial.write(byte);
408+
overflow |= serialWrite(byte);
338409

339410
byte = (uint8_t)MESSAGE_RECEIVE_KIND;
340411
chksum += byte;
341-
Serial.write(byte);
412+
overflow |= serialWrite(byte);
342413

343-
Serial.write(chksum);
414+
overflow |= serialWrite(chksum);
415+
if(overflow) tpl_trace_overflow();
344416
# else
345417
# error "unsupported trace mode: TRACE_FORMAT"
346418
# endif /* TRACE_FORMAT == TRACE_FORMAT_SERIAL */

0 commit comments

Comments
 (0)