15.9.3 新しいトレースキャプチャデバイスの追加

DS-5デバッガには、DSTREAM、ETB、TMC/ETM、および TMC/ETR デバイスからトレースデータを読み出す組み込みサポートが用意されています。新しいトレースキャプチャデバイスにサポートを追加することはそれほど難しいことではなく、DTSL Jython スクリプト全体で行うことができます。

DTSL トレースキャプチャオブジェクトクラスの階層には、すべての DTSL トレースキャプチャオブジェクトが ConnectableTraceCaptureBase クラスから派生していることが示されています。このベースクラスは ITraceCaptureIDeviceConnection の 2 つのインターフェイスを実装します。ITraceCapture はキャプチャデバイスのトレースデータの制御および読み出しに関連するすべてのメソッドを定義し、IDeviceConnection は接続先とする必要のあるコンポーネントのメソッドを定義します。ConnectableTraceCaptureBase クラスには、両方のインタフェースのすべてのメソッドのスタブ実装が含まれています。

新しいトレースキャプチャクラスを作成するには、以下の手順に従います。

  1. ConnectableTraceCaptureBase クラス、または該当する場合は TraceCaptureBase クラスから派生する新しいクラスを作成します。
  2. クラスコンストラクタを実装し、実装内でベースクラスコンストラクタを呼び出すことを確認します。
  3. startTraceCapture() および stopTraceCapture() メソッドをオーバーライドします。DTSL がこれらのメソッドを呼び出すと、そのデフォルトの実装が例外をスローするため、オーバーライドしてこれを防ぐ必要があります。
  4. getCaptureSize() メソッドをオーバーライドしてデバイス内の生トレースデータのサイズを返します。
  5. getSourceData() メソッドをオーバーライドして、指定されたトレースソースのトレースデータを返します。
  6. トレースデバイスに接続が必要な場合は、connect()disconnect()、および isConnected() メソッドをオーバーライドします。
  7. プラットフォームの DTSL Jython スクリプトで、新しいトレースキャプチャデバイスクラスのインスタンスを作成し、DTSL コンフィギュレーションに追加します。

以下のサンプル Jython コードは、ETB ダンプファイル(ETB バッファの生コンテンツ)からトレースデータを読み出す新しいトレースキャプチャデバイスを実装します。ここでは、このコードが FileBasedTraceCapture.py 内にあると想定しています。

from java.lang import Math
from com.arm.debug.dtsl.impl import DataSink
from com.arm.debug.dtsl.impl import Deformatter
from com.arm.debug.dtsl.impl import SyncStripper
from com.arm.debug.dtsl.components import ConnectableTraceCaptureBase
from com.arm.debug.dtsl.configurations import ConfigurationBase
import sys
import os
import jarray

class FileBasedTraceCaptureDevice(ConnectableTraceCaptureBase):
    '''
    Base class for a trace capture device which just returns
    a fixed data set from a file.The amount of trace data captured
    is just the size of the file.
    '''
    def __init__(self, configuration, name):
        '''Construction
        Params: configuration
                    the top level DTSL configuration (the
                    class you derived from DTSLv1)
                name
                    the name for the trace capture device
        '''
        ConnectableTraceCaptureBase.__init__(self, configuration, name)
        self.filename = None
        self.fileOpened = False
        self.hasStarted = False
        self.trcFile = None

    def setTraceFile(self, filename):
        '''Sets the file to use as the trace data source
        Params: filename
                    the file containing the trace data
        '''
        self.filename = filename
        
    def connect(self):
        '''We interpret connect() as an opening of the trace data file
        '''
        self.trcFile = file(self.filename, 'rb')
        self.fileOpened = True
        self.fileSize = os.path.getsize(self.filename)

    def disconnect(self):
        '''We interpret disconnect() as a closing of the trace data file
        '''
        if self.trcFile != None:
            self.trcFile.close()
        self.fileOpened = False
        self.fileSize = 0

    def isConnected(self):
        return self.fileOpened

    def startTraceCapture(self):
        self.hasStarted = True

    def stopTraceCapture(self):
        self.hasStarted = False

    def getMaxCaptureSize(self):
        return self.fileSize

    def setMaxCaptureSize(self, size):
        return self.getMaxCaptureSize()

    def getCaptureSize(self):
        return self.fileSize

    def getNewCaptureSize(self):
        return self.getCaptureSize()

    def hasWrapped(self):
        return True

class ETBFileBasedTraceCaptureDevice(FileBasedTraceCaptureDevice):
    '''
    Creates a trace capture device which returns ETB trace
    data from a file.
    '''
    def __init__(self, configuration, name):
        '''Construction
        Params: configuration
                    the top level DTSL configuration (the
                    class you derived from DTSLv1)
                name
                    the name for the trace capture device
        '''
        FileBasedTraceCaptureDevice.__init__(self, configuration, name)

    def getSourceData(self, streamID, position, size, data, nextPos):
        '''Reads the ETB trace data from the file
        Params: streamID
                    for file formats which contain multiple
                    streams, this identifies the stream for which
                    data should be returned from
                position
                    the byte index position to read from
                size
                    the max size of data (in bytes) we should return
                データ
                    where to write the extracted data
                nextPos
                    an array into which we set entry [0] to the
                    next position to read from i.e. the position parameter
                    value which will return data that immediately follows
                    the last entry written into data
        '''
        # We assume that size is small enough to allow to read an entire
        # data block in one operation
        self.trcFile.seek(position)
        rawdata = jarray.array(self.trcFile.read(size), 'b')
        nextPos[0] = position+size
        dest = DataSink(0, 0, size, data)
        # We assume the file contains TPIU frames with sync sequences
        # Se we set up a processing chain as follows:
        # file data -> strip syncs -> de formatter -> to our caller
        deformatter = Deformatter(dest, streamID)
        syncStripper = SyncStripper(deformatter)
        syncStripper.forceSync(True)
        syncStripper.push(rawdata)
        syncStripper.flush()
        return dest.size()

以下のように、プラットフォーム DTSL Jython コードで新しいトレースキャプチャデバイスを使用できます。

from FileBasedTraceCapture import ETBFileBasedTraceCaptureDevice
[snip]
        self.etbFileCaptureDevice = ETBFileBasedTraceCaptureDevice(self, 'ETB(FILE)')
        self.etbFileCaptureDevice.setTraceFile('c:\\etbdump.bin')
        self.addTraceCaptureInterface(self.etbFileCaptureDevice)

これを ETB または DSTREAM デバイスであるかのようにコンフィギュレーションに追加できます。

非機密扱いPDF file icon PDF 版ARM DUI0446ZJ
Copyright © 2010–2016 ARM.All rights reserved.