diff options
Diffstat (limited to 'Debug')
-rw-r--r-- | Debug/NuttX | 211 | ||||
-rw-r--r-- | Debug/NuttX_BMP | 6 | ||||
-rw-r--r-- | Debug/memdump | 11 | ||||
-rw-r--r-- | Debug/stm32f4x.cfg | 64 |
4 files changed, 292 insertions, 0 deletions
diff --git a/Debug/NuttX b/Debug/NuttX new file mode 100644 index 000000000..46ba3d1ff --- /dev/null +++ b/Debug/NuttX @@ -0,0 +1,211 @@ +# +# Generic GDB macros for working with NuttX +# + +echo Loading NuttX GDB macros. Use 'help nuttx' for more information.\n + +define nuttx + echo Use 'help nuttx' for more information.\n +end + +document nuttx +. Various macros for working with NuttX. +. +. showheap +. Prints the contents of the malloc heap(s). +. showtasks +. Prints a list of all tasks. +. showtask <address> +. Prints information about the task at <address> +. +. Use 'help <macro>' for more specific help. +end + +################################################################################ +# Heap display +################################################################################ + +define _showheap + set $index = $arg0 + if (sizeof(struct mm_allocnode_s) == 4) + set $MM_ALLOC_BIT = 0x8000 + else + set $MM_ALLOC_BIT = 0x80000000 + end + printf "HEAP %d %p - %p\n", $index, g_heapstart[$index], g_heapend[$index] + printf "ptr size\n" + set $node = (char *)g_heapstart[$index] + sizeof(struct mm_allocnode_s) + while $node < g_heapend[$index] + printf " %p", $node + set $nodestruct = (struct mm_allocnode_s *)$node + printf " %u", $nodestruct->size + if !($nodestruct->preceding & $MM_ALLOC_BIT) + printf " FREE" + end + if ($nodestruct->size > g_heapsize) || (($node + $nodestruct->size) > g_heapend[$index]) + printf " (BAD SIZE)" + end + printf "\n" + set $node = $node + $nodestruct->size + end +end + +define showheap + set $nheaps = sizeof(g_heapstart) / sizeof(g_heapstart[0]) + printf "Printing %d heaps\n", $nheaps + set $heapindex = (int)0 + while $heapindex < $nheaps + showheap $heapindex + set $heapindex = $heapindex + 1 + end +end + +document showheap +. showheap +. Prints the contents of the malloc heap(s). +end + +################################################################################ +# Task display +################################################################################ + +define _showtask_oneline + set $task = (struct _TCB *)$arg0 + printf " %p %.2d %.3d %s\n", $task, $task->pid, $task->sched_priority, $task->name +end + +define _showtasklist + set $queue = (dq_queue_t *)$arg0 + set $cursor = (dq_entry_t *)$queue->head + + if $cursor != 0 + printf " TCB PID PRI\n" + else + printf " <none>\n" + end + + while $cursor != 0 + + _showtask_oneline $cursor + + if $cursor == $queue->tail + set $cursor = 0 + else + set $next = $cursor->flink + + if $next->blink != $cursor + printf "task linkage corrupt\n" + set $cursor = 0 + else + set $cursor = $next + end + end + end +end + +# +# Print task registers for a NuttX v7em target with FPU enabled. +# +define _showtaskregs_v7em + set $task = (struct _TCB *)$arg0 + set $regs = (uint32_t *)&($task->xcp.regs[0]) + + printf " r0: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", $regs[27], $regs[28], $regs[29], $regs[30], $regs[2], $regs[3], $regs[4], $regs[5] + printf " r8: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", $regs[6], $regs[7], $regs[8], $regs[9], $regs[31], $regs[0], $regs[32], $regs[33] + printf " XPSR 0x%08x EXC_RETURN 0x%08x PRIMASK 0x%08x\n", $regs[34], $regs[10], $regs[1] +end + +# +# Print current registers for a NuttX v7em target with FPU enabled. +# +define _showcurrentregs_v7em + printf " r0: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", $r0, $r1, $r2, $r3, $r4, $r5, $r6, $r7 + printf " r8: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", $r8, $r9, $r10, $r11, $r12, $r13, $r14, $r15 + printf " XPSR 0x%08x\n", $xpsr +end + +# +# Print details of a semaphore +# +define _showsemaphore + printf "count %d ", $arg0->semcount + if $arg0->hlist.holder != 0 + set $_task = (struct _TCB *)$arg0->hlist.holder + printf "held by %s", $_task->name + end + printf "\n" +end + +define showtask + set $task = (struct _TCB *)$arg0 + + printf "%p %.2d ", $task, $task->pid + _showtaskstate $task + printf " %s\n", $task->name + set $stack_free = 0 + while ($stack_free < $task->adj_stack_size) && *(uint8_t *)($task->stack_alloc_ptr + $stack_free) + set $stack_free = $stack_free + 1 + end + printf" stack 0x%08x-0x%08x (%d) %d free\n", $task->stack_alloc_ptr, $task->adj_stack_ptr, $task->adj_stack_size, $stack_free + + if $task->task_state == TSTATE_WAIT_SEM + printf " waiting on %p ", $task->waitsem + _showsemaphore $task->waitsem + end + + if $task->task_state != TSTATE_TASK_RUNNING + _showtaskregs_v7em $task + else + _showcurrentregs_v7em + end + + # XXX print registers here +end + +document showtask +. showtask <TCB pointer> +. Print details of a task. +end + +define _showtaskstate + if $arg0->task_state == TSTATE_TASK_INVALID + printf "INVALID" + end + if $arg0->task_state == TSTATE_TASK_PENDING + printf "PENDING" + end + if $arg0->task_state == TSTATE_TASK_READYTORUN + printf "READYTORUN" + end + if $arg0->task_state == TSTATE_TASK_RUNNING + printf "RUNNING" + end + if $arg0->task_state == TSTATE_TASK_INACTIVE + printf "INACTIVE" + end + if $arg0->task_state == TSTATE_WAIT_SEM + printf "WAIT_SEM" + end + if $arg0->task_state == TSTATE_WAIT_SIG + printf "WAIT_SIG" + end + if $arg0->task_state > TSTATE_WAIT_SIG + printf "%d", $arg0->task_state + end +end + +define showtasks + printf "PENDING\n" + _showtasklist &g_pendingtasks + printf "RUNNABLE\n" + _showtasklist &g_readytorun + printf "WAITING\n" + _showtasklist &g_waitingforsemaphore + printf "INACTIVE\n" + _showtasklist &g_inactivetasks +end + +document showtasks +. showtasks +. Print a list of all tasks in the system, separated into their respective queues. +end diff --git a/Debug/NuttX_BMP b/Debug/NuttX_BMP new file mode 100644 index 000000000..013fa4436 --- /dev/null +++ b/Debug/NuttX_BMP @@ -0,0 +1,6 @@ +# +# Setup macros for the BlackMagic debug probe and NuttX. +# + +mon swdp_scan +attach 1 diff --git a/Debug/memdump b/Debug/memdump new file mode 100644 index 000000000..703c4ed8b --- /dev/null +++ b/Debug/memdump @@ -0,0 +1,11 @@ +define f4_memdump + shell mkdir -p /tmp/dump + printf "Dumping CCSRAM to /tmp/dump/ccsram\n" + dump memory /tmp/dump/ccsram 0x10000000 0x10010000 + printf "Dumping SRAM to /tmp/dump/sram\n" + dump memory /tmp/dump/sram 0x20000000 0x20020000 +end + +document f4_memdump +Dumps the STM32F4 memory to files in /tmp/dump. +end diff --git a/Debug/stm32f4x.cfg b/Debug/stm32f4x.cfg new file mode 100644 index 000000000..28bfcfbbb --- /dev/null +++ b/Debug/stm32f4x.cfg @@ -0,0 +1,64 @@ +# script for stm32f2xxx + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME stm32f4xxx +} + +if { [info exists ENDIAN] } { + set _ENDIAN $ENDIAN +} else { + set _ENDIAN little +} + +# Work-area is a space in RAM used for flash programming +# By default use 64kB +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x10000 +} + +# JTAG speed should be <= F_CPU/6. F_CPU after reset is 8MHz, so use F_JTAG = 1MHz +# +# Since we may be running of an RC oscilator, we crank down the speed a +# bit more to be on the safe side. Perhaps superstition, but if are +# running off a crystal, we can run closer to the limit. Note +# that there can be a pretty wide band where things are more or less stable. +jtag_khz 1000 + +jtag_nsrst_delay 100 +jtag_ntrst_delay 100 + +#jtag scan chain +if { [info exists CPUTAPID ] } { + set _CPUTAPID $CPUTAPID +} else { + # See STM Document RM0033 + # Section 32.6.3 - corresponds to Cortex-M3 r2p0 + set _CPUTAPID 0x4ba00477 +} +jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID + +if { [info exists BSTAPID ] } { + set _BSTAPID $BSTAPID +} else { + # See STM Document RM0033 + # Section 32.6.2 + # + set _BSTAPID 0x06413041 +} +jtag newtap $_CHIPNAME bs -irlen 5 -expected-id $_BSTAPID + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME -rtos auto + +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 + +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME stm32f2x 0 0 0 0 $_TARGETNAME + +# if srst is not fitted use SYSRESETREQ to +# perform a soft reset +cortex_m3 reset_config sysresetreq |