aboutsummaryrefslogtreecommitdiff
path: root/Debug/NuttX
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2012-08-04 15:12:36 -0700
committerpx4dev <px4@purgatory.org>2012-08-04 15:12:36 -0700
commit8a365179eafdf3aea98e60ab9f5882b200d4c759 (patch)
tree4f38d6d4cd80bd0b6e22e2bb534c3f117ce44e56 /Debug/NuttX
downloadpx4-firmware-8a365179eafdf3aea98e60ab9f5882b200d4c759.tar.gz
px4-firmware-8a365179eafdf3aea98e60ab9f5882b200d4c759.tar.bz2
px4-firmware-8a365179eafdf3aea98e60ab9f5882b200d4c759.zip
Fresh import of the PX4 firmware sources.
Diffstat (limited to 'Debug/NuttX')
-rw-r--r--Debug/NuttX211
1 files changed, 211 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