108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
|
# File: FreeRTOS.py
|
||
|
# Author: Carl Allendorph
|
||
|
# Date: 05NOV2014
|
||
|
#
|
||
|
# Description:
|
||
|
# This file contains some python code that utilizes the GDB API
|
||
|
# to inspect information about the FreeRTOS internal state. The
|
||
|
# idea is to provide the user with the ability to inspect information
|
||
|
# about the tasks, queues, mutexs, etc.
|
||
|
#
|
||
|
|
||
|
from os import path
|
||
|
import sys
|
||
|
|
||
|
directory, file = path.split(__file__)
|
||
|
directory = path.expanduser(directory)
|
||
|
directory = path.abspath(directory)
|
||
|
|
||
|
sys.path.append(directory)
|
||
|
|
||
|
import gdb
|
||
|
import pprint
|
||
|
|
||
|
from FreeRTOSgdb.Types import StdTypes
|
||
|
from FreeRTOSgdb.List import ListInspector
|
||
|
from FreeRTOSgdb.GDBCommands import ShowHandleName, ShowRegistry, ShowList
|
||
|
from FreeRTOSgdb.GDBCommands import ShowQueueInfo
|
||
|
|
||
|
|
||
|
class Scheduler:
|
||
|
def __init__(self):
|
||
|
|
||
|
self._blocked = ListInspector("xSuspendedTaskList")
|
||
|
self._delayed1 = ListInspector("xDelayedTaskList1")
|
||
|
self._delayed2 = ListInspector("xDelayedTaskList2")
|
||
|
self._readyLists = []
|
||
|
readyTasksListsStr = "pxReadyTasksLists"
|
||
|
readyListsSym, methodType = gdb.lookup_symbol(readyTasksListsStr)
|
||
|
if readyListsSym != None:
|
||
|
readyLists = readyListsSym.value()
|
||
|
minIndex, maxIndex = readyLists.type.range()
|
||
|
for i in range(minIndex, maxIndex + 1):
|
||
|
readyList = readyLists[i]
|
||
|
FRReadyList = ListInspector(readyList)
|
||
|
self._readyLists.append(FRReadyList)
|
||
|
else:
|
||
|
print("Failed to Find Symbol: %s" % readyTasksListsStr)
|
||
|
raise ValueError("Invalid Symbol!")
|
||
|
|
||
|
def ShowTaskList(self):
|
||
|
self.PrintTableHeader()
|
||
|
for i, rlist in enumerate(self._readyLists):
|
||
|
if i == 0:
|
||
|
items = rlist.GetElements("TCB_t", 0)
|
||
|
else:
|
||
|
items = rlist.GetElements("TCB_t", 1)
|
||
|
if len(items) > 0:
|
||
|
print("Ready List {%d}: Num Tasks: %d" % (i, len(items)))
|
||
|
for tcb, val in items:
|
||
|
self.PrintTaskFormatted(tcb)
|
||
|
|
||
|
items = self._blocked.GetElements("TCB_t")
|
||
|
print("Blocked List: Num Tasks: %d" % len(items))
|
||
|
for tcb, val in items:
|
||
|
self.PrintTaskFormatted(tcb)
|
||
|
|
||
|
items = self._delayed1.GetElements("TCB_t")
|
||
|
print("Delayed {1}: Num Tasks: %d" % len(items))
|
||
|
for tcb, val in items:
|
||
|
self.PrintTaskFormatted(tcb, val)
|
||
|
|
||
|
items = self._delayed2.GetElements("TCB_t")
|
||
|
print("Delayed {2}: Num Tasks: %d" % len(items))
|
||
|
for tcb, val in items:
|
||
|
self.PrintTaskFormatted(tcb, val)
|
||
|
|
||
|
def PrintTableHeader(self):
|
||
|
print("%16s %3s %4s" % ("Name", "PRI", "STCK"))
|
||
|
|
||
|
def PrintTaskFormatted(self, task, itemVal=None):
|
||
|
topStack = task["pxTopOfStack"]
|
||
|
stackBase = task["pxStack"]
|
||
|
highWater = topStack - stackBase
|
||
|
taskName = task["pcTaskName"].string()
|
||
|
taskPriority = task["uxPriority"]
|
||
|
if itemVal != None:
|
||
|
print("%16s %3s %4s %5s" % (taskName, taskPriority, highWater, itemVal))
|
||
|
else:
|
||
|
print("%16s %3s %4s" % (taskName, taskPriority, highWater))
|
||
|
|
||
|
|
||
|
class ShowTaskList(gdb.Command):
|
||
|
"""Generate a print out of the current tasks and their states."""
|
||
|
|
||
|
def __init__(self):
|
||
|
super(ShowTaskList, self).__init__("show Task-List", gdb.COMMAND_SUPPORT)
|
||
|
|
||
|
def invoke(self, arg, from_tty):
|
||
|
sched = Scheduler()
|
||
|
sched.ShowTaskList()
|
||
|
|
||
|
|
||
|
ShowRegistry()
|
||
|
ShowList()
|
||
|
ShowTaskList()
|
||
|
ShowHandleName()
|
||
|
ShowQueueInfo()
|