14.6 データビューの実装

OS 認識は、スレッドとともに、デバッガが[RTOS Data]ビューに示す任意の表形式データを提供します。

API での対応するコールバックは getDataModel() です。ソースが com.arm.debug.extension.source_<version>.jar にある Java インタフェース com.arm.debug.extension.datamodel.IDataModel のインスタンスを返す必要があります。
このセクションでは、ビューの実装方法について説明し、タスクのリストや入手可能なすべての情報を示します。実装に以下を追加することで、[RTOS Data]ビューに空の[タスク]テーブルが作成されます。
<some folder>
    /mydb
        /OS
            /myos
                /extension.xml
                /messages.properties
                /provider.py
                /contexts.py
                /tasks.py
  • provider.py
    # this script implements the Java interface IOSProvider
    from osapi import DebugSessionException
    from osapi import Model
    from contexts import ContextsProvider
    from tasks import Tasks
    
    def areOSSymbolsLoaded(debugger):
            […]
    
    def isOSInitialised(debugger):
            […]
    
    def getOSContextProvider():
            […]
    
    def getDataModel():
        # returns an instance of the Java interface IDataModel
        return Model("myos", [Tasks()])
  • messages.properties
    myos.title=My OS
    myos.desc=This is My OS.
    myos.help=Displays information about My OS.
    
    tasks.title=Tasks
    tasks.desc=This table shows all tasks, including uninitialized ones
    tasks.help=Displays tasks defined within the OS and their current status.
    
    tasks.id.title=Task
    tasks.id.desc=The task identifier
    tasks.name.title=Name
    tasks.name.desc=The task name
    tasks.status.title=Status
    tasks.status.desc=The task status
    tasks.priority.title=Priority
    tasks.priority.desc=The task priority
    tasks.sp.title=Stack pointer
    tasks.sp.desc=This task's stack address
  • tasks.py
    from osapi import Table
    from osapi import createField
    from osapi import DECIMAL, TEXT, ADDRESS
    
    # this class implements the Java interface IDataModelTable
    class Tasks(Table):
        def __init__(self):
            id = "tasks"
            fields = [createField(id, "id", DECIMAL),
                      createField(id, "name", TEXT),
                      createField(id, "status", TEXT),
                      createField(id, "priority", DECIMAL),
                      createField(id, "sp", ADDRESS)]
            Table.__init__(self, id, fields)
    
        def getRecords(self, debugger):
            records = [] # todo
    関数 createField および Table.__init__() では、messages.properties ファイルで実行時に検索するキーが自動的にビルドされます。messages.properties で見つからないキーはすべて、そのまま出力されます。
    上記の変更により、新しい空の[タスク]テーブルが作成されます。
    図 14-8 myos 空の[タスク]テーブル
    myos 空の[タスク]テーブル

    テーブルを生成するには、tasks.pygetRecords() を実装します。
    from osapi import Table
    from osapi import createField
    from osapi import createNumberCell, createTextCell, createAddressCell
    from osapi import DECIMAL, TEXT, ADDRESS
    
    # this class implements the Java interface IDataModelTable
    class Tasks(Table):
        def __init__(self):
            […]
    
        def readTask(self, task, first):
            members = task.getStructureMembers()
            id = members["id"].readAsNumber()
    
            if (members["status"].readAsNumber() == 0):
                status = "Uninitialized"
                name = None
                sp = None
                priority = None
            else:
                if (first):
                    status = "Running"
                else:
                    status = "Ready"
    
                name = members["name"].readAsNullTerminatedString()
                sp = members["sp"].readAsAddress()
                priority = members["priority"].readAsNumber()
    
            cells = [createNumberCell(id),
                     createTextCell(name),
                     createTextCell(status),
                     createNumberCell(priority),
                     createAddressCell(sp)]
            
            return self.createRecord(cells)
            
        def getRecords(self, debugger):
            records = []
            tasks = debugger.evaluateExpression("tasks").getArrayElements()
            first = True
            
            for task in tasks:
                records.append(self.readTask(task, first))
                first = False
                    
            return records
    この実装により、[タスク]テーブルに次の値が表示されています。
    図 14-9 myos 入力された[タスク]テーブル
    myos 入力された[タスク]テーブル

    デバッガコマンド info myos tasks では、同じ情報が[Commands]ビューに出力されます。
非機密扱いPDF file icon PDF 版ARM DUI0446WJ
Copyright © 2010-2015 ARM.All rights reserved.