| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- # 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()
|