Files
kunlun/tools/dumpRTOS.cmd

479 lines
12 KiB
Batchfile
Raw Normal View History

2024-09-28 14:37:24 +08:00
#
#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