Thank you for joining this Elektor Academy webinar. The session will start soon.
Please note that the audio broadcast is switched off for now and will start at
15:00 BST (16:00 CEST)
www.elektor-labs.com/low-cost-debugging
Low-Cost Debugging
for the poor who are not rich nor wealthy and who do not have a lot of
money to spend, even on food
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Presented byClemens Valens• CEO Elektor.Labs• Contributing editor
October 24, 2013
mmmh!
www.elektor-labs.com/low-cost-debugging
About ElektorElectronics magazine for people passionate
about electronics• 5 main editions:
– English, Spanish, German, French & Dutch
• We publish projects• We have our own lab• We design our own PCBs
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Elektor.Labs
• Sharing electronics• Be an expert, get
rewarded• Get more out of your
passion
October 24, 2013
www.elektor-labs.com/low-cost-debugging
MCU Debugging on a shoestring• Lots of cheap microcontroller boards are
available• Hobbyists are no longer frowned upon by MCU
manufacturers• Anyone can create embedded applications
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Programming means Debugging• Time-consuming• Good tools are expensive• Effective debugging requires skills
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Use Your Brain →
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Utopia• Programmers spend 90% of their time
thinking, the remaining 10% is used for typing code
• Debuggers spend 90% of their time thinking and only 10% is used for single-stepping through code
Code for testing!
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Train Your Debug Muscle
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Enter the LED
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Using the LED• Make sure it works• Know which leg is the anode• Keep its brightness low• Use dedicated MCU pins• Write a test program to prove that you master
the LED
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Use Macros (or Functions)Example:#define DEBUG_LED0_ON PORTB |= 0x01#define DEBUG_LED0_OFF PORTB &= 0xfe(or something nicer but with a similar effect)
Done debugging:#define DEBUG_LED0_ON /* PORTB |= 0x01 */#define DEBUG_LED0_OFF /* PORTB &= 0xfe */(or something nicer but with a similar effect)
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Using LEDs• Set LEDs to a known state at start-up• Use well-defined animations• Activate/deactivate at strategic positions• One debug function per LED per session• Only one well-defined execution path
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Blink from main()void main(void){ // Increment delta_time by timer; delta_time = 0ms; DEBUG_LED_OFF; while (1) { if (delta_time==250ms) DEBUG_LED_ON; else if (delta_time==500ms) { DEBUG_LED_OFF; delta_time = 0ms; } }}
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Don’t Blink from ISRs
Interrupts may continue to tick even if the main program crashed.
Exception: when testing ISR functionality.
October 24, 2013
www.elektor-labs.com/low-cost-debugging
LEDs are Really Fast• They can reveal activity on (serial) ports• Brightness is a measure for duty-cycle
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Build a Logic Level Probe
October 24, 2013
www.elektor-labs.com/low-cost-debugging
No LEDs?• Use a logic level probe• Use a multimeter• Use an oscilloscope• Use your ears• Use your smartphone
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Serial Sound
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Demo!
October 24, 2013
www.elektor-labs.com/low-cost-debugging
The Serial PortUse a solid connection, f.i. like this:
October 24, 2013
www.elektor-labs.com/low-cost-debugging
The Serial Port• Create a working putch• Create a debug putch:
– #define DEBUG_PUTCH putch• Only send printable ASCII characters• Exception: Bell (0x07)
October 24, 2013
www.elektor-labs.com/low-cost-debugging
The Serial Port• Create a working puts• Create a debug puts:
– #define DEBUG_PUTS puts• Use meaningful strings• Print program name & version
October 24, 2013
www.elektor-labs.com/low-cost-debugging
The Serial Port• Keep debug strings short• Format cleverly
– Use brackets: <>, (), [], {} – Prefer separators to whitespace– Use CR/LF
• Lower-case is easier to read– ‘B8’ looks like ’88’, write ‘b8’ instead
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Following the Call Stack• Be verbose• Print real function names• Print at function entry and exit• Cover all exit points
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Following Execution Paths• Be concise• Use single characters like numbers or letters• Increase character along path• Cover all paths
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Exampleint16_t foo(int8_t value){ DEBUG_PUTCH('0'); if (value<0) { DEBUG_PUTCH('1'); if (value<-5) { DEBUG_PUTCH('2'); } else if (value<-3) { DEBUG_PUTCH('3'); } DEBUG_PUTCH('4'); } DEBUG_PUTCH('5'); return -10*value;}
October 24, 2013
www.elektor-labs.com/low-cost-debugging
printf• Comfortable• Needs a lot of memory• Slow• Partly implemented• Platform dependent• Undefined behavior
October 24, 2013
www.elektor-labs.com/low-cost-debugging
printf Coprocessor
October 24, 2013
www.elektor-labs.com/low-cost-debugging
MCU:void my_printf(int int_count, char *format, ...){ va_list ap; va_start(ap,format); puts("printf"); // Send keyword word. puts(format); // Send format string. putch('\0'); // Terminate format string. putch(sizeof(int)); // Send size of int. putch(int_count); // Send number of integers. while (int_count>0) // Send the arguments. { send_int(va_arg(ap,int)); int_count -= 1; } va_end(ap);}
my_printf(3,"u=%05u, p=%p, c=%c\r\n",234,0x4321,'$');
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Coprocessor:void main(void){ while (serial_data_available==true) { uint8_t ch = read_serial_input(); if (keyword_found(ch)==false) { write_serial_output(ch); } else { if (printf_statement_complete==true) { printf(received_format_string,received_arguments); } } }}
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Complications
October 24, 2013
• How to handle fast data streams?• How to handle errors?
As always: use with care
www.elektor-labs.com/low-cost-debugging
One Step Beyond
October 24, 2013
• Build a €$£10,- debug coprocessor:– Use a proven platform– Use known good libraries– Debug communications (SPI, I²C, other)– Provide stimuli– Measure voltages
www.elektor-labs.com/low-cost-debugging
Debug Coprocessor
October 24, 2013
www.elektor-labs.com/low-cost-debugging
The Next Level
October 24, 2013
• JTAG pod• In-circuit debugger (ICD)• In-circuit emulator (ICE)
www.elektor-labs.com/low-cost-debuggingOctober 24, 2013
Any questions?
www.elektor-labs.com/low-cost-debugging
Next Elektor Webinar
Automation and Test using Flowcode presented by Ben Rowland and Jonathan Woodrow
Thursday November 21, 2013 (15:00 GMT / 16:00 CET)
Check www.elektor.com/webinar for details or subscribe to our newsletter
www.elektor.com
October 24, 2013
www.elektor-labs.com/low-cost-debugging
Code available atwww.elektor-labs.com/low-cost-debugging
October 24, 2013
Thank you for attending!