补充tools目录
This commit is contained in:
479
tools/dumpRTOS.cmd
Executable file
479
tools/dumpRTOS.cmd
Executable file
@@ -0,0 +1,479 @@
|
||||
#
|
||||
#Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
||||
#This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
||||
#be copied by any method or incorporated into another program without
|
||||
#the express written consent of Aerospace C.Power. This Information or any portion
|
||||
#thereof remains the property of Aerospace C.Power. The Information contained herein
|
||||
#is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
||||
#liability for its use in any way and conveys no license or title under
|
||||
#any patent or copyright and makes no representation or warranty that this
|
||||
#Information is free from patent or copyright infringement.
|
||||
#
|
||||
#
|
||||
|
||||
#
|
||||
# Preface: GDB Script To Parser GDB Core or CoreDump
|
||||
# Display Tasks and Their Stacks
|
||||
# By Zhihua v1.0.0
|
||||
#
|
||||
|
||||
# History:
|
||||
# 2017-06-07 Init version. Add dump OS global statistics variable and task TCB/Stacks
|
||||
# 2017-06-08 Dump Heap Usage
|
||||
#
|
||||
|
||||
# turn on logging
|
||||
set logging off
|
||||
shell rm -f ./rtosdump.txt
|
||||
set logging file rtosdump.txt
|
||||
set logging on
|
||||
|
||||
|
||||
# 1: dump full 512 DWORD stack space. (note: TIME SRV is 1024 DWORDs)
|
||||
# 0: only dump stack from current top to base.
|
||||
set $stack_dumpfull = 0
|
||||
|
||||
|
||||
# TCB_t->pxStack
|
||||
set $stack_end=0
|
||||
|
||||
# TCB_t->pxStack+512
|
||||
set $stack_top=0
|
||||
|
||||
# TCB-_t>pxTopOfStack
|
||||
set $stack_cur=0
|
||||
|
||||
# Default HT task size. currently, HT.out use same stack size
|
||||
set $stack_size=512
|
||||
|
||||
# S0 register, used into reverse call stack
|
||||
set $stack_s0=0
|
||||
|
||||
# unused stack size
|
||||
set $stack_unused=0
|
||||
|
||||
# flag to indicate current analysis TCB is TMR SRV
|
||||
set $istimersrv=0
|
||||
|
||||
#
|
||||
#
|
||||
# Format Marker
|
||||
#
|
||||
#
|
||||
|
||||
define Make_FMTMarker
|
||||
echo \n
|
||||
echo ---------------------------------------------------------------------------------------------\n
|
||||
echo \n
|
||||
end
|
||||
|
||||
define Dump_HeapInfo
|
||||
echo start to dump heap usage\n
|
||||
echo heap start at:\n
|
||||
p (int)&ucHeap
|
||||
echo heap stop at:\n
|
||||
p (int)xStart.pxNextFreeBlock
|
||||
echo heap size(K):\n
|
||||
p/d sizeof(ucHeap)/1024
|
||||
|
||||
|
||||
echo \n
|
||||
set $FreeList_Cur = xStart
|
||||
while ($FreeList_Cur.pxNextFreeBlock != 0)
|
||||
p $FreeList_Cur
|
||||
set $FreeList_Cur = *$FreeList_Cur.pxNextFreeBlock
|
||||
end
|
||||
|
||||
echo \n
|
||||
|
||||
echo Full Stack Usage:\n
|
||||
echo total_mem:(K)\n
|
||||
p/d total_mem/1024
|
||||
echo cvg_total_mem:(K)\n
|
||||
p/d cvg_total_mem/1024
|
||||
echo mac_total_mem: (K)\n
|
||||
p/d mac_total_mem/1024
|
||||
echo misc_total_mem: (K)\n
|
||||
p/d misc_total_mem/1024
|
||||
|
||||
|
||||
echo RTOS core Usage:(K)\n
|
||||
p/d (sizeof(ucHeap) - xFreeBytesRemaining - total_mem)/1024
|
||||
|
||||
echo heap free (K):\n
|
||||
p/d xFreeBytesRemaining/1024
|
||||
echo heap lowest free(K):\n
|
||||
p/d xMinimumEverFreeBytesRemaining/1024
|
||||
|
||||
echo \n
|
||||
echo Detail Moudle useage\n
|
||||
set $mem_idx = 0
|
||||
while ($mem_idx != 0xFF)
|
||||
if mid_mem[$mem_idx] > 0
|
||||
printf "mid_mem[%d]=0x%x\n",$mem_idx, mid_mem[$mem_idx]
|
||||
end
|
||||
set $mem_idx = $mem_idx+1
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
# Local Function to trave stacks from up to down
|
||||
#
|
||||
#
|
||||
define travel_stack
|
||||
set $is_pxCurTCB = 0
|
||||
set $ptr_nextstack=0
|
||||
set $ptr_ra=0
|
||||
|
||||
|
||||
|
||||
#judge wheter current running TCB
|
||||
if $stack_s0 > 0
|
||||
set $is_pxCurTCB = 1
|
||||
end
|
||||
|
||||
echo \n
|
||||
|
||||
|
||||
if $is_pxCurTCB > 0
|
||||
x $pc
|
||||
x $ra
|
||||
set $ptr_nextstack= $s0
|
||||
|
||||
while( $ptr_nextstack < $stack_top )
|
||||
set $ptr_ra = *($ptr_nextstack-4)
|
||||
set $ptr_nextstack = *($ptr_nextstack-8)
|
||||
if $ptr_ra == $ptr_nextstack
|
||||
echo -----------------Interrupt context swith\n
|
||||
else
|
||||
x $ptr_ra
|
||||
end
|
||||
|
||||
if $ptr_nextstack == 0xa5a5a5a5
|
||||
set $ptr_nextstack = $stack_top
|
||||
end
|
||||
end
|
||||
else
|
||||
set $task_pc = *($stack_cur+124)
|
||||
x $task_pc
|
||||
|
||||
set $task_ra = *$stack_cur
|
||||
x $task_ra
|
||||
|
||||
set $ptr_nextstack= *($stack_cur+28)
|
||||
while( $ptr_nextstack < $stack_top )
|
||||
set $ptr_ra = *($ptr_nextstack-4)
|
||||
set $ptr_nextstack = *($ptr_nextstack-8)
|
||||
|
||||
if $ptr_ra == $ptr_nextstack
|
||||
#echo -----------------Interrupt context swith\n
|
||||
else
|
||||
x $ptr_ra
|
||||
end
|
||||
|
||||
if $ptr_nextstack == 0xa5a5a5a5
|
||||
set $ptr_nextstack = $stack_top
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
# Dump Stack
|
||||
#
|
||||
#
|
||||
|
||||
define dump_stack
|
||||
|
||||
|
||||
set $stact_printcur = 0
|
||||
|
||||
if (unsigned int)$stack_cur > (unsigned int)$stack_top
|
||||
set $istimersrv = 1
|
||||
set $stack_top = $stack_top + 512
|
||||
#echo TMR SRV\n
|
||||
end
|
||||
|
||||
echo stack_end:\n
|
||||
p (unsigned int)$stack_end
|
||||
echo stack_cur:\n
|
||||
p (unsigned int)$stack_cur
|
||||
echo stack_top:\n
|
||||
p (unsigned int)$stack_top
|
||||
echo stack_s0:\n
|
||||
p $stack_s0
|
||||
echo \n
|
||||
|
||||
echo stack_unused:\n
|
||||
p $stack_unused = (int)$stack_cur - (int)$stack_end
|
||||
echo stack_used:\n
|
||||
p $stack_used = (int )$stack_top - (int)$stack_cur
|
||||
|
||||
if $stack_dumpfull > 0
|
||||
if $istimersrv > 0
|
||||
x/1024xw (unsigned int)$stack_end
|
||||
else
|
||||
x/512xw (unsigned int)$stack_end
|
||||
end
|
||||
else
|
||||
set $stact_printcur = $stack_cur
|
||||
while($stack_used > 0)
|
||||
x/4xw (unsigned int)$stact_printcur
|
||||
set $stact_printcur = $stact_printcur + 16
|
||||
set $stack_used = $stack_used -16
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Make_FMTMarker
|
||||
Dump_HeapInfo
|
||||
Make_FMTMarker
|
||||
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
# Dump Global Task Variable
|
||||
#
|
||||
#
|
||||
Make_FMTMarker
|
||||
echo p uxCurrentNumberOfTasks\n
|
||||
p uxCurrentNumberOfTasks
|
||||
echo p uxTaskNumber\n
|
||||
p uxTaskNumber
|
||||
echo p xTickCount\n
|
||||
p xTickCount
|
||||
echo p uxPendedTicks\n
|
||||
p uxPendedTicks
|
||||
echo p xSchedulerRunning\n
|
||||
p xSchedulerRunning
|
||||
echo p xNextTaskUnblockTime\n
|
||||
p xNextTaskUnblockTime
|
||||
echo p uxSchedulerSuspended\n
|
||||
p uxSchedulerSuspended
|
||||
|
||||
|
||||
|
||||
#
|
||||
#
|
||||
# Analysis pxCurrentTCB
|
||||
#
|
||||
#
|
||||
|
||||
Make_FMTMarker
|
||||
#p *pxCurrentTCB
|
||||
p (*pxCurrentTCB)->pcTaskName
|
||||
p (*pxCurrentTCB)->pxStack
|
||||
p (*pxCurrentTCB)->pxTopOfStack
|
||||
set $stack_end= (*pxCurrentTCB)->pxStack
|
||||
set $stack_cur = $sp
|
||||
set $stack_top = $stack_end + $stack_size
|
||||
set $stack_s0 = $s0
|
||||
#dump_stack
|
||||
travel_stack
|
||||
Make_FMTMarker
|
||||
|
||||
#
|
||||
#
|
||||
# Analysis xSuspendedTaskList
|
||||
#
|
||||
#
|
||||
if xSuspendedTaskList.uxNumberOfItems >0
|
||||
echo xSuspendedTaskList.uxNumberOfItems\n
|
||||
p xSuspendedTaskList.uxNumberOfItems
|
||||
|
||||
set $list_end = xSuspendedTaskList->pxIndex
|
||||
set $list_start = xSuspendedTaskList->xListEnd.pxNext
|
||||
|
||||
|
||||
while ($list_start != $list_end)
|
||||
Make_FMTMarker
|
||||
#p $list_start
|
||||
|
||||
set $tcb = (char*)$list_start - 4
|
||||
#p (TCB_t)*$tcb
|
||||
p ((TCB_t)*$tcb)->pcTaskName
|
||||
p ((TCB_t)*$tcb)->pxStack
|
||||
p ((TCB_t)*$tcb)->pxTopOfStack
|
||||
|
||||
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
||||
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_top = $stack_end+$stack_size
|
||||
set $stack_s0 = 0
|
||||
#dump_stack
|
||||
travel_stack
|
||||
|
||||
set $list_start = $list_start.pxNext
|
||||
Make_FMTMarker
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
#
|
||||
# Analysis pxReadyTasksLists
|
||||
#
|
||||
#
|
||||
|
||||
set $readyTaskList_index = 0
|
||||
set $readyTaskList_Max = 7
|
||||
while ($readyTaskList_index < $readyTaskList_Max)
|
||||
if pxReadyTasksLists[$readyTaskList_index].uxNumberOfItems >0
|
||||
echo ready task array index:\n
|
||||
p $readyTaskList_index
|
||||
echo num\n
|
||||
p pxReadyTasksLists[$readyTaskList_index].uxNumberOfItems
|
||||
|
||||
set $list_end = pxReadyTasksLists[$readyTaskList_index]->pxIndex
|
||||
set $list_start = pxReadyTasksLists[$readyTaskList_index]->xListEnd.pxNext
|
||||
|
||||
while ($list_start != $list_end)
|
||||
Make_FMTMarker
|
||||
set $tcb = (char*)$list_start - 4
|
||||
#p (TCB_t)*$tcb
|
||||
p ((TCB_t)*$tcb)->pcTaskName
|
||||
p ((TCB_t)*$tcb)->pxStack
|
||||
p ((TCB_t)*$tcb)->pxTopOfStack
|
||||
|
||||
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
||||
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_top = $stack_end+$stack_size
|
||||
set $stack_s0 = 0
|
||||
#dump_stack
|
||||
travel_stack
|
||||
set $list_start = $list_start.pxNext
|
||||
Make_FMTMarker
|
||||
end
|
||||
|
||||
end
|
||||
set $readyTaskList_index = $readyTaskList_index+1
|
||||
end
|
||||
|
||||
|
||||
if xDelayedTaskList1.uxNumberOfItems >0
|
||||
Make_FMTMarker
|
||||
echo xDelayedTaskList1.uxNumberOfItems\n
|
||||
p xDelayedTaskList1.uxNumberOfItems
|
||||
|
||||
set $list_end = xDelayedTaskList1->pxIndex
|
||||
set $list_start = xDelayedTaskList1->xListEnd.pxNext
|
||||
|
||||
|
||||
while ($list_start != $list_end)
|
||||
set $tcb = (char*)$list_start - 4
|
||||
#p (TCB_t)*$tcb
|
||||
p ((TCB_t)*$tcb)->pcTaskName
|
||||
p ((TCB_t)*$tcb)->pxStack
|
||||
p ((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
||||
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_top = $stack_end+$stack_size
|
||||
set $stack_s0 = 0
|
||||
#dump_stack
|
||||
travel_stack
|
||||
set $list_start = $list_start.pxNext
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
if xDelayedTaskList2.uxNumberOfItems >0
|
||||
Make_FMTMarker
|
||||
|
||||
echo xDelayedTaskList2.uxNumberOfItems\n
|
||||
p xDelayedTaskList2.uxNumberOfItems
|
||||
set $list_end = xDelayedTaskList2->pxIndex
|
||||
set $list_start = xDelayedTaskList2->xListEnd.pxNext
|
||||
|
||||
|
||||
while ($list_start != $list_end)
|
||||
set $tcb = (char*)$list_start - 4
|
||||
#p (TCB_t)*$tcb
|
||||
p ((TCB_t)*$tcb)->pcTaskName
|
||||
p ((TCB_t)*$tcb)->pxStack
|
||||
p ((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
||||
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_top = $stack_end+$stack_size
|
||||
set $stack_s0 = 0
|
||||
#dump_stack
|
||||
travel_stack
|
||||
set $list_start = $list_start.pxNext
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
if xPendingReadyList.uxNumberOfItems >0
|
||||
Make_FMTMarker
|
||||
echo xPendingReadyList.uxNumberOfItems\n
|
||||
p xPendingReadyList.uxNumberOfItems
|
||||
set $list_end = xPendingReadyList->pxIndex
|
||||
set $list_start = xPendingReadyList->xListEnd.pxNext
|
||||
|
||||
|
||||
while ($list_start != $list_end)
|
||||
p $list_start
|
||||
set $tcb = (char*)$list_start - 4
|
||||
#p (TCB_t)*$tcb
|
||||
p ((TCB_t)*$tcb)->pcTaskName
|
||||
p ((TCB_t)*$tcb)->pxStack
|
||||
p ((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
||||
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_top = $stack_end+$stack_size
|
||||
set $stack_s0 = 0
|
||||
#dump_stack
|
||||
travel_stack
|
||||
set $list_start = $list_start.pxNext
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if xTasksWaitingTermination.uxNumberOfItems >0
|
||||
Make_FMTMarker
|
||||
echo xTasksWaitingTermination.uxNumberOfItems\n
|
||||
p xTasksWaitingTermination.uxNumberOfItems
|
||||
set $list_end = xTasksWaitingTermination->pxIndex
|
||||
set $list_start = xTasksWaitingTermination->xListEnd.pxNext
|
||||
|
||||
|
||||
while ($list_start != $list_end)
|
||||
set $tcb = (char*)$list_start - 4
|
||||
#p (TCB_t)*$tcb
|
||||
p ((TCB_t)*$tcb)->pcTaskName
|
||||
p ((TCB_t)*$tcb)->pxStack
|
||||
p ((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
||||
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
||||
set $stack_top = $stack_end+$stack_size
|
||||
set $stack_s0 = 0
|
||||
#dump_stack
|
||||
travel_stack
|
||||
set $list_start = $list_start.pxNext
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Turn off log
|
||||
#
|
||||
set logging off
|
Reference in New Issue
Block a user