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