The GNU Debugger contains both a source level debugger and a 68HC11/68HC12 simulator. The debugger allows source level debugging (C, C++, Java, ADA, and many others) as well as assembly-level debugging. The simulator handles all 68HC11 instructions and supports some 68HC11 devices (timer, serial device, eeprom, spi).
1. Debug With GDB
This is a quick example of some GDB commands. This example is based on a small calculator program.
Start gdb as follows:
m6811-elf-gdb calc.elfSelect the simulator as the GDB target:(gdb) target sim Connected to the simulator.Load the program in simulator memory:(gdb) load calc.elf Loading section .page0, size 0x20 lma 0x0 Loading section .text, size 0xeba lma 0x8000 Loading section .eh_frame, size 0x1fc lma 0x8eba Loading section .rodata, size 0x295 lma 0x90b6 Loading section .vectors, size 0x40 lma 0xffc0 Start address 0x8e8f Transfer rate: 40280 bits in <1 sec.Install some breakpoints:(gdb) b _start Breakpoint 1 at 0x8e8f (gdb) b *0x8e95 Breakpoint 2 at 0x8e95 (gdb) b main Breakpoint 3 at 0x89dc: file calc.c, line 525. (gdb) b calc.c:318 Breakpoint 4 at 0x8552: file calc.c, line 318.Run the program. The simulator loads the PC from the vector's table, as for a 68HC11 reset.(gdb) run Breakpoint 1, 0x8e8f in _start ()Disassemble with the x command:(gdb) x/4i $pc (gdb) x/4i $pc 0x8e8f <_start>: lds #0x7fff 0x8e92 <_start+3>: jsr 0x8a67 <__premain> 0x8e95 <__map_data_sections>: ldx #0x934b 0x8e98 <__map_data_sections+3>: ldy #0x1100 <values>Resume execution to stop at the next breakpoint:(gdb) c Continuing. Breakpoint 2, 0x8e95 in __map_data_sections () (gdb) c Continuing. Breakpoint 3, main () at calc.c:525 525 _serial_init ();Resume execution again. The calculator will print the help description and will fall in another breakpoint.(gdb) c Continuing. Simple Calculator Test Program add Pop two values and push their sum sub Pop two values and push their subtraction mul Pop two values and push their mul div Divide the two values and Logical and between the two values or Logical or between the two values quit Quit the calculator list List the stack help This help dec Switch in decimal mode hex Switch in hexadecimal mode Breakpoint 4, print_value (stack=0x20, mode=PRINT_DEC, which=-1) at calc.c:316 316 if (which < 0)Look where we are in the program. The list command displays several lines before and after the current source line (line 316).(gdb) list 311 " %o\r\n", 312 " %b\r\n" 313 }; 314 315 /* Print the top of the stack if no index is specified. */ 316 if (which < 0) 317 { 318 which = stack->top - 1; 319 if (which < 0) 320 {Print the content of the stack parameter. This is a pointer to a structure, you can print it as follows:(gdb) print *stack 3ドル = {values = 0x7fd3, top = 0, max = 10, mode = PRINT_DEC}You can setup the pretty-print mode to get some nice output:(gdb) set print pretty on (gdb) print *stack 5ドル = { values = 0x7fd3, top = 0, max = 10, mode = PRINT_DEC }If you resume execution, you can push a number on the stack by typing it on the keyboard. The program will then stop again in print_value and you can have a look at the stack parameter again. Looking at values of the stack is straightforward:\ (gdb) print stack->values[0] 6ドル = 23Print the info about the simulator and the 68HC11 registers:(gdb) sim info-cpu M68HC11: HPRIO @ 0x103c 0x00 CONFIG @ 0x103f 0xff NOSEC NOCOP ROMON EEON OPTION @ 0x1039 0x00 INIT @ 0x103d 0x01 Ram = 0x0000 IO = 0x1000 CPU info: Absolute cycle: 800638 Syscall emulation: yes, via 0xcd <n> Memory errors detection: no Stop on interrupt: no Interrupts Info: Interrupts raised: 0 Min interrupts masked sequence: 13 cycles Max interrupts masked sequence: 13 cyclesPrint the info about other devices:(gdb) sim info-timer ... (gdb) sim info-sio ... (gdb) sim info-eeprom ...2. Simulator
The simulator is part of gdb. It can also be run separately with the m6811-elf-run program.
m6811-elf-run calc.elfYou can specify the value of the 68HC11 CONFIG register with the -cpu-config=value option. For example, to disable the EEPROM, pass -cpu-config=0xe.
You can pass the -v option to the simulator. After completion of your program (by calling exit or hitting ^C), the simulator will print execution statistics.
3. Buffalo Monitor
Gdb supports the Buffalo monitor as a target. The communication is made using the serial line. Gdb sends buffalo monitor commands and analyses the result of those commands. To use the monitor type the following gdb commands:
(gdb) set remotebaud 9600 (gdb) target buffalo devicewhere device is the serial device your target is connected to. In general, this is /dev/ttya, /dev/ttyb for Solaris and /dev/ttyS0, /dev/ttyS1 for Linux.Once connected, you can load a program using the gdb load command:
(gdb) load fileAnd execute that program on the target:
(gdb) run
Copyright (C) 1999, 2000, 2001, 2002, 2003 Stéphane Carrez, France
Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.