banner
ekko

ekko's blog

时间不在于你拥有多少,而在于你怎样使用
github
xbox
email

openocd設定ファイル解析

rk3568.cfg#

[!/usr/local/share/openocd/scripts/target/rk3568.cfg]

# SPDX-License-Identifier: GPL-2.0-or-later
reset_config trst_and_srst separate
if { [info exists CHIPNAME] } {
  set _CHIPNAME $CHIPNAME
} else {
  set _CHIPNAME rk3568
}

#
# Main DAP
#
if { [info exists DAP_TAPID] } {
   set _DAP_TAPID $DAP_TAPID
} else {
   set _DAP_TAPID 0x2ba01477
}

adapter driver jlink
adapter speed 12000
transport select swd

# declare the one SWD tap to access the DAP
swd newdap $_CHIPNAME cpu -expected-id $_DAP_TAPID -ignore-version
# create the DAP
dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu
target create $_CHIPNAME.ahb mem_ap -dap $_CHIPNAME.dap -ap-num 0
set _TARGETNAME $_CHIPNAME.lcore
# declare the 6 main application cores
set _smp_command ""

set $_TARGETNAME.base(0) 0x81004000
set $_TARGETNAME.base(1) 0x81005000
set $_TARGETNAME.base(2) 0x81006000
set $_TARGETNAME.base(3) 0x81007000
set $_TARGETNAME.cti(0) 0x81014000
set $_TARGETNAME.cti(1) 0x81015000
set $_TARGETNAME.cti(2) 0x81016000
set $_TARGETNAME.cti(3) 0x81017000


set _cores 4
for { set _core 0 } { $_core < $_cores } { incr _core 1 } {

    set _TARGETNAME $_CHIPNAME.lcore

    cti create cti$_core -dap $_CHIPNAME.dap -baseaddr [set $_TARGETNAME.cti($_core)] -ap-num 0

    target create \${_TARGETNAME}$_core aarch64 -dap $_CHIPNAME.dap -coreid  $_core -cti cti\$_core -dbgbase [set $_TARGETNAME.base($_core)]

    if { $_core != 0 } {
        ${_TARGETNAME}$_core configure -defer-examine
    } else {
        # uncomment to use hardware threads pseudo rtos
        # ${_TARGETNAME}$_core configure -rtos hwthread"
        ${_TARGETNAME}$_core configure -work-area-size 0x30000 -work-area-phys 0xff8c0000 \
                                -work-area-backup 0
    }
    set _smp_command "$_smp_command ${_TARGETNAME}$_core"
}
# Add the second flash bank.

#set QUADSPI 1
#set _FLASHNAME $_CHIPNAME.flash1
#flash bank $_FLASHNAME stmqspi 0 0x4000000 2 2 ${_TARGETNAME}0
#flash bank $_FLASHNAME fespi 0 0 0 0 ${_TARGETNAME}0 0xfe610000

target smp $_smp_command
targets rk3568.lcore0

本文主要以上述配置文件为例,讲解 [[openocd]] 每条配置命令的作用。

reset_config#

reset_config trst_and_srst separate

Command: reset_config mode_flag ...

このコマンドは、ターゲット構成スクリプト内の JTAG ボードとターゲットの組み合わせのリセット構成を表示または変更します。

このセクションの前の情報は、コマンドが解決することを意図している問題の種類を説明しています(参照:SRST と TRST の問題)。一般的に、このコマンドはボード構成ファイルのみに属し、_board doesn’t connect TRST_のような問題を説明するか、特定のインターフェースとボードの組み合わせから派生した制限に対処するユーザー構成ファイルに属します。(あまり考えられない例は、TRST のみのアダプタを SRST のみを配線したボードと一緒に使用することです。)

モードフラグ(mode_flag)オプションは任意の順序で指定できますが、各タイプ(signals、combination、gates、trst_type、srst_type、connect_type)のうち、同時に指定できるのは 1 つだけです。指定したタイプに新しい値を提供しない場合、その以前の値(おそらくデフォルト)は変更されません。たとえば、JTAG アダプタが SRST を駆動したい場合、TRST について何も言う必要はなく、明示的に高く駆動されなければならないことを宣言するだけで済みます(srst_push_pull)。

  • signals は、接続されているリセット信号を指定できます。たとえば、JTAG インターフェースが SRST を提供しているが、ボードがその信号を正しく接続していない場合、OpenOCD はそれを使用できません。可能な値は、none(デフォルト)、trst_only、srst_only、および trst_and_srstです。
> **Tip:** ボードがJTAGコネクタを介してSRSTおよび/またはTRSTを提供する場合は、それを宣言する必要があります。
  • combination は、壊れたリセット信号の実装を指定するオプションの値です。オプションが指定されていない場合のデフォルト動作はseparateで、すべてが正常に動作することを示します。srst_pulls_trst は、テストロジックがシステムのリセットと一緒にリセットされることを示し(例:NXP LPC2000、「壊れた」ボードレイアウト)、trst_pulls_srst は、システムがテストロジックと一緒にリセットされることを示します(これは仮定に過ぎず、そのようなバグを持つハードウェアを見たことはありませんが、回避可能です)。combined は srst_pulls_trst と trst_pulls_srst の両方を含意します。
  • gates トークンは、リセット中に JTAG が利用できない場合のいくつかのケースを説明するフラグを制御します。srst_gates_jtag(デフォルト)は、SRST を主張すると JTAG クロックがゲートされることを示します。これは、SRST が主張されている間、JTAG 上で通信が発生しないことを意味します。その反対は srst_nogate で、SRST がアクティブな間に JTAG コマンドを安全に発行できることを示します。
  • connect_type トークンは、ターゲットに接続している間に SRST が主張される場合のいくつかのケースを説明するフラグを制御します。srst_nogate はこのオプションを使用するために必要です。connect_deassert_srst(デフォルト)は、ターゲットに接続している間に SRST が主張されないことを示します。その反対は connect_assert_srst で、ターゲットに接続する前に SRST が主張されることを示します。この機能をサポートしているターゲットは限られており、STM32 や STR9 が例です。この機能は、不正なオプションバイト構成や不正なプログラム実行によりターゲットに接続できない場合に便利です。

オプションの trst_type および srst_type パラメータは、各リセットラインのドライバーモードを指定できます。これらの値は、Amontec JTAGkey や JTAG Accelerator のように、異なるドライバーモードをサポートする JTAG インターフェースにのみ影響します。また、関連する信号(TRST または SRST)が接続されていない場合は、必然的に無視されます。

  • テストリセット信号(TRST)の可能な trst_type ドライバーモードは、デフォルトの trst_push_pull および trst_open_drain です。ほとんどのボードはこの信号をプルダウンに接続するため、JTAG TAP は JTAG アダプタに接続されない限りリセットを解除しません。
  • システムリセット信号(SRST)の srst_type ドライバーモードは、デフォルトの srst_open_drain および srst_push_pull です。ほとんどのボードはこの信号をプルアップに接続し、システムの電源投入やリセットボタンの押下などのさまざまなイベントによって信号が低く引き下げられることを許可します。

info exit#

Config File Guidelines (OpenOCD User’s Guide)

Note

すべてのターゲット構成ファイルは、このようなコードで始まるべきであり、ボード構成ファイルが環境固有の違いを表現できるようにします。

ボードは役割に基づいてチップ名を上書きすることがありますが、デフォルトはベンダーが使用するものと一致する必要があります。

if { [info exists CHIPNAME] } {
   set  _CHIPNAME $CHIPNAME
} else {
   set  _CHIPNAME sam7x256
}
# ONLY use ENDIAN with targets that can change it.
if { [info exists ENDIAN] } {
   set  _ENDIAN $ENDIAN
} else {
   set  _ENDIAN little
}
# TAP識別子は、チップが成熟するにつれて変更される場合があります。たとえば、新しいリビジョンフィールド(ここでの「3」)があります。良いデフォルトを選択してください。複数の識別子を「jtag newtap」コマンドに渡すことができます。
if { [info exists CPUTAPID ] } {
   set _CPUTAPID $CPUTAPID
} else {
   set _CPUTAPID 0x3f0f0f0f
}

覚えておいてください: ボード構成ファイルには、複数のターゲット構成ファイルを含めることができるか、同じターゲットファイルを複数回含めることができます(少なくともCHIPNAMEを変更する)。

同様に、ターゲット構成ファイルは_TARGETNAME(または_TARGETNAME0など)を定義し、デバッグターゲットを定義する際にそれを使用する必要があります:

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME arm7tdmi -chain-position $_TARGETNAME

set#

set _CHIPNAME rk3568
set _DAP_TAPID 0x2ba01477
set _TARGETNAME $_CHIPNAME.lcore
set _smp_command ""
set $_TARGETNAME.base(0) 0x81004000
set $_TARGETNAME.base(1) 0x81005000
set $_TARGETNAME.base(2) 0x81006000
set $_TARGETNAME.base(3) 0x81007000
set $_TARGETNAME.cti(0) 0x81014000
set $_TARGETNAME.cti(1) 0x81015000
set $_TARGETNAME.cti(2) 0x81016000
set $_TARGETNAME.cti(3) 0x81017000
set _cores 4

set は変数に値を割り当てるコマンドで、パラメータは文字列、数字、他の変数であることができます。

adapter#

adapter driver jlink
adapter speed 12000

Debug Adapter Configuration (OpenOCD User’s Guide)

Config Command: adapter driver name

ターゲットに接続するためにアダプタドライバの名前を使用します。
名称リストはInterface-Driversを参照してください。
Command: adapter speed max_speed_kHz

ゼロ以外の速度は KHZ で表されます。したがって、3000 は 3MHz です。JTAG インターフェースは通常、限られた数の速度をサポートします。実際に使用される速度は、指定された速度よりも速くはなりません。

チップのデータシートには、通常、最高の JTAG クロックレートが含まれています。実際のレートは、CPU コアクロックの関数であり、通常はそのピークレートよりも低くなります。たとえば、ほとんどの ARM コアは CPU クロックの最大 6 分の 1 を受け入れます。

速度 0(kHz)は RTCK メソッドを選択します。RTCK を使用するシステムでは、セットアップ後に JTAG クロックを変更する必要はありません。すべてのインターフェース、ボード、またはターゲットが「rtck」をサポートしているわけではありません。インターフェースデバイスがそれをサポートできない場合、RTCK を使用しようとするとエラーが返されます。

transport select and swd newdap#

transport select swd
swd newdap $_CHIPNAME cpu -expected-id $_DAP_TAPID -ignore-version

Transport-Configuration

SWD(Serial Wire Debug)は、1 つのデバッグアクセスポイント(DAP)を公開する ARM 専用のトランスポートです(これは明示的に宣言する必要があります)。(SWD は JTAG よりも少ない信号線を使用します。) SWD はデバッグ指向であり、境界スキャンテストをサポートしていません。フラッシュプログラミングサポートはデバッグサポートの上に構築されています。(一部のプロセッサは JTAG と SWD の両方をサポートしています。)

SWD トランスポートは、コマンドtransport select swdで選択されます。アダプタがhla インターフェースドライバを使用している場合(この場合、コマンドはtransport select hla_swd)、またはst-link インターフェースドライバを使用している場合(この場合、コマンドはtransport select dapdirect_swd)を除きます。

Config Command: swd newdap ...

SWD トランスポートを使用する単一の DAP を宣言します。パラメータは現在「jtag newtap」と同じですが、これは変更されることが期待されています。

新しい SWD デバイス(SW-DP v2 または SWJ-DP v2)は、SWD プロトコルのマルチドロップ拡張をサポートしています:2 つ以上のデバイスを 1 つの SWD アダプタに接続できます。SWD トランスポートは、DAP が-dp-idおよび-instance-idパラメータの両方で構成されている場合、マルチドロップモードで動作します。作成される DAP の数に関係なく。

すべてのアダプタとアダプタドライバが SWD マルチドロップをサポートしているわけではありません。SWD マルチドロップに対応しているアダプタドライバは次のとおりです:cmsis_dap(CMSIS-DAP バージョン 2.0 を使用するアダプタ)、ftdi、すべてのビットバン基盤。

TAP-Declaration-Commands

Config Command: jtag newtap chipname tapname configparams...
dotted name chipname.tapname の新しい TAP を宣言し、さまざまな configparams に従って構成します。

chipname はチップの記号名です。通常、ターゲット構成ファイルは$_CHIPNAMEを使用し、チップベンダーによって提供されたモデル名をデフォルトとして使用しますが、上書き可能です。

tapname はその TAP の役割を反映し、次の規則に従う必要があります:

  • bs – これは別の TAP である場合の境界スキャン用;
  • cpu – チップの主要な CPU、または ARM および DSP CPU の両方を持つチップではarmおよびdsp、2 つの ARM を持つチップではarm1およびarm2など;
  • etb – 埋め込みトレースバッファ用(例:ARM ETB11);
  • flash – チップにフラッシュ TAP がある場合、例えば str912 のように;
  • jrc – JTAG ルートコントローラ用(例:多くの Texas Instruments チップの ICEPick モジュール、Beagleboards の OMAP3530 など);
  • tap – 単一の TAP を持つ FPGA または CPLD のようなデバイスにのみ使用する必要があります;
  • unknownN – TAP が何のためのものであるかわからない場合(N は数字);
  • 疑問がある場合 – チップメーカーのデータシートに記載されている名前を使用します。たとえば、Freescale i.MX31 には JTAG TAP を持つ SDMA(Smart DMA)があり、その TAP はsdmaと名付けられるべきです。

すべての TAP には、少なくとも次の configparams が必要です:

  • -irlen NUMBER
    命令レジスタのビット長、例えば 4 ビットまたは 5 ビット。

TAP はオプションの configparams も提供できます:

  • -disable (または -enable
    リセット後にスキャンチェーンにリンクされていない TAP をフラグ付けするために-disableパラメータを使用します。デフォルトの状態(TAP がリンクされている)を強調表示するには-enableを使用します。TAP の有効化と無効化については、Enabling and Disabling TAPsを参照してください。

  • -expected-id NUMBER
    スキャンチェーンが調査されるときに見つけることを期待する 32 ビット IDCODE を表すゼロ以外の数です。これらのコードはすべての JTAG デバイスに必要なわけではありません。複数の ID コードが表示される可能性がある場合は、必要に応じてこのオプションを繰り返してください(たとえば、複数のバージョン)。リストに含まれていない IDCODE 値についての警告を抑制するには、数をゼロに指定します。

    可能であればこの値を提供してください。これにより、OpenOCD はスキャンチェーンが正しくないことを判断できます。これらの値はベンダーのチップドキュメントに提供されており、通常は技術リファレンスマニュアルです。時には、これらの値を見つけるために JTAG ハードウェアを調査する必要があります。自動調査については、Autoprobingを参照してください。

  • -ignore-version
    -expected-idオプションの JTAG バージョンフィールドを無視するように指定します。ベンダーがチップの複数のバージョンを出す場合や、いくつかの大部分が互換性のあるチップに同じ JTAG レベル ID を使用する場合、さまざまなチップ ID を処理するために構成ファイルを更新するよりも、バージョンフィールドを無視する方が実用的な場合があります。バージョンフィールドは IDCODE のビット 28-31 として定義されています。

  • -ignore-bypass
    idcode の「バイパス」ビットを無視するように指定します。一部のベンダーはこのビットに関して無効な idcode を設定します。このビットを無視し、この TAP をバイパスモードと見なさないように指定します。

  • -ircapture NUMBER
    TAP が JTAG シフトレジスタに IRCAPTURE 状態に入るときにロードされるビットパターン、例えば 0x01。JTAG はこの値の下位 2 ビットが 01 であることを要求します。デフォルトでは、-ircapture-irmaskはこの 2 ビットの値を検証するように設定されています。これらのビットを知っている場合は追加のビットを提供することができます。または、TAP が JTAG 仕様に準拠していないことを示すことができます。

  • -irmask NUMBER
    -ircaptureとともに使用され、命令スキャンが正しく機能することを検証するためのマスクです。このようなスキャンは、JTAG スキャンチェーン操作に問題がないことを確認するために OpenOCD によって使用されることはありません。

  • -ignore-syspwrupack
    初期調査中およびスティッキーエラービットをチェックするときに、ARM DAP DP CTRL/STAT レジスタ内の CSYSPWRUPACK ビットを無視するように指定します。このビットは通常、CSYSPWRUPREQ ビットを設定した後にチェックされますが、一部のデバイスは後で ack ビットを設定しません。

dap create#

dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu

dap declaration

Command: dap create dap_name -chain-position dotted.name configparams...

dap_name という名前の DAP インスタンスを宣言し、JTAG TAP dotted.name にリンクします。これにより、さまざまな目的に使用される新しいコマンド(dap_name)も作成されます。システム内の各 JTAG TAP には 1 つの DAP しか存在できません。

DAP はオプションの configparams も提供できます:

  • -adiv5 ADIv5 DAP であることを指定します。指定しない場合はデフォルトです。
  • -adiv6 ADIv6 DAP であることを指定します。
  • -ignore-syspwrupack 初期調査中およびスティッキーエラービットをチェックするときに、ARM DAP DP CTRL/STAT レジスタ内の CSYSPWRUPACK ビットを無視するように指定します。このビットは通常、CSYSPWRUPREQ ビットを設定した後にチェックされますが、一部のデバイスは後で ack ビットを設定しません。
  • -dp-id number
    SWD DPv2 マルチドロップ用のデバッグポート識別番号。number は DP TARGETSEL のビット 0..27 に書き込まれます。単一の接続デバイスの id 番号を見つけるには、DP TARGETID を読み取ります:device.dap dpreg 0x24 TARGETID のビット 0..27 を使用します。
  • -instance-id number
    SWD DPv2 マルチドロップ用のインスタンス識別番号。number は DP TARGETSEL のビット 28..31 に書き込まれます。単一の接続デバイスのインスタンス番号を見つけるには、DP DLPIDR を読み取ります:device.dap dpreg 0x34 DLPIDR 値のビット 28..31 にインスタンス番号があります。

target create and ${_TARGETNAME}$_core configure -defer-examine#

target create $_CHIPNAME.ahb mem_ap -dap $_CHIPNAME.dap -ap-num 0
target create ${_TARGETNAME}$_core aarch64 -dap $_CHIPNAME.dap -coreid $_core -cti cti$_core -dbgbase [set $_TARGETNAME.base($_core)]
${_TARGETNAME}$_core configure -defer-examine
${_TARGETNAME}$_core configure -work-area-size 0x30000 -work-area-phys 0xff8c0000 -work-area-backup 0

Config Command: target create target_name type configparams...

このコマンドは、特定の JTAG TAP を参照する GDB デバッグターゲットを作成します。それはそのターゲットをリストに追加し、さまざまな目的に使用される新しいコマンド(target_name)を作成します。

  • target_name ... はデバッグターゲットの名前です。慣例として、これはこのターゲットに関連付けられた TAP の_dotted.name_と同じであるべきであり、ここで-chain-position dotted.name configparam を使用して指定する必要があります。

    この名前は、ターゲットオブジェクトコマンドを作成するためにも使用され、ここでは$target_nameと呼ばれ、ターゲットを識別する必要がある他の場所でも使用されます。

  • type ... はターゲットタイプを指定します。ターゲットタイプについては、target typesを参照してください。

  • configparams ... は、$target_name configureによって受け入れられるすべてのパラメータが許可されます。ターゲットがビッグエンディアンの場合は、ここで-endian bigを設定します。

    -chain-position dotted.nameまたは-dap dap_nameをここで設定する必要があります。

Command: $target_name configure configparams...

このコマンドによって受け入れられるオプションは、target createのパラメータとしても指定できます。後で、$target_name cgetコマンドを使用して、1 つずつその値を照会できます。

警告: セットアップ後にこれらの一部を変更することは危険です。たとえば、ターゲットを 1 つの TAP から別の TAP に移動することや、そのエンディアンを変更することです。

  • -chain-position dotted.name – このターゲットにアクセスするために使用される TAP の名前。

  • -dap dap_name – このターゲットにアクセスするために使用される DAP の名前。DAP インスタンスを作成および管理する方法については、DAP declarationを参照してください。

  • -endian (big|little) – CPU がビッグエンディアンまたはリトルエンディアンの慣習を使用するかどうかを指定します。

  • -event event_name event_body – Target Eventsを参照してください。このリストは、名前付きイベントハンドラのリストを更新します。異なるイベント名でこれを 2 回呼び出すと、2 つの異なるハンドラが割り当てられますが、同じイベント名で 2 回呼び出すと、1 つのハンドラのみが割り当てられます。

    現在のターゲットは、ハンドラコードが開始される前にイベント発行ターゲットに一時的にオーバーライドされ、ハンドラが完了した後に元に戻されます。

  • -work-area-backup (0|1) – 作業領域がバックアップされるかどうかを示します。デフォルトでは、バックアップされません。可能であれば、バックアップが必要ない作業領域を使用してください。バックアップを実行すると操作が遅くなります。たとえば、SRAM ブロックの先頭はほとんどのビルドシステムによって使用される可能性がありますが、末尾はしばしば未使用です。

  • -work-area-size size – 作業領域のサイズをバイト単位で指定します。物理アドレスまたは仮想アドレスが使用されているかどうかに関係なく、同じサイズが適用されます。

  • -work-area-phys address – MMU がアクティブでないときに使用される作業領域の基本アドレスを設定します。

  • -work-area-virt address – MMU がアクティブなときに使用される作業領域の基本アドレスを設定します。MMU のあるターゲット以外ではこの値を指定しないでください。この値は通常、現在のオペレーティングシステムによって設定された-work-area-physアドレスの静的マッピングに対応する必要があります。

  • -rtos rtos_type – ターゲットの RTOS サポートを有効にします。rtos_type は、auto、none、eCos、ThreadX、FreeRTOS、linux、ChibiOS、embKernel、mqx、uCOS-III、nuttx、RIOT、Zephyr、rtkernel のいずれかです。RTOS サポートについては、RTOS Supportを参照してください。

  • -defer-examine – 初期 JTAG チェーンスキャンおよびリセット後のターゲット調査をスキップします。デバッグのためにターゲットにアクセスするには、手動で arp_examine を呼び出す必要があります。

  • -ap-num ap_number – ターゲットの DAP アクセスポートを設定します。ADIv5 DAP では、ap_number はターゲットが接続されている DAP AP の数値インデックスです。ADIv6 DAP では、ap_number はターゲットが接続されている DAP AP の基本アドレスです。このオプションは、複数の独立したコアが同じ DAP の別々のアクセスポートに接続されているシステムで使用します。

  • -cti cti_name – ターゲットに接続されているクロストリガーインターフェース(CTI)を設定します。現在、このオプションを使用するのはaarch64ターゲットのみであり、ターゲット実行制御のための必須構成です。CTI インスタンスを宣言および制御する方法については、ARM Cross-Trigger Interfaceを参照してください。

  • -gdb-port number – コマンドgdb_portの可能な値を参照してください。これらの値は数値だけでなく、数値以外の値も含まれます。このオプションは、このターゲットのみに対して、コマンドgdb_portで設定されたグローバルパラメータを上書きします。コマンド gdb_port については、command gdb_portを参照してください。

  • -gdb-max-connections number – 実験的:ターゲットに許可される GDB 接続の最大数を設定します。デフォルトは 1 です。number に負の値を指定すると、無制限の接続が可能になります。GDB を非侵入型メモリインスペクタとして使用する方法については、Using GDB as a non-intrusive memory inspectorを参照してください。

しかし、上記の内容には-coreidおよび-dbgbaseオプションに関する説明はありません。SMP 関連の章で少し触れられています:
Define-CPU-targets-working-in-SMP

Note

ターゲットを設定した後、SMP で動作するターゲットのリストを定義できます。

set _TARGETNAME_1 $_CHIPNAME.cpu1
set _TARGETNAME_2 $_CHIPNAME.cpu2
target create $_TARGETNAME_1 cortex_a -chain-position $_CHIPNAME.dap \
-coreid 0 -dbgbase $_DAP_DBG1
target create $_TARGETNAME_2 cortex_a -chain-position $_CHIPNAME.dap \
-coreid 1 -dbgbase $_DAP_DBG2
#smpで動作する2つのターゲットを定義します。
target smp $_CHIPNAME.cpu2 $_CHIPNAME.cpu1

上記の例では、cortex_a で 2 つの CPU が SMP で動作しています。SMP では、1 つの GDB インスタンスのみが作成されます。

  • ハードウェアブレークポイントのセットは、リスト内のすべてのターゲットに同じブレークポイントを設定します。
  • halt コマンドは、リスト内のすべてのターゲットを停止させます。
  • resume コマンドは、コンテキストを書き込み、リスト内のすべてのターゲットを再起動させます。
  • ブレークポイントに従って:ブレークポイントによって停止されたターゲットが GDB セッションに表示されます。
  • GDB セッションによって表示されるターゲットを切り替え / 取得するために、専用の GDB シリアルプロトコルパケットが実装されています。詳細は、Using OpenOCD SMP with GDBを参照してください。

SMP の動作は動的に無効化 / 有効化できます。cortex_a では、次のコマンドが実装されています。

  • cortex_a smp on : SMP モードを有効にします。動作は上記の通りです。
  • cortex_a smp off : SMP モードを無効にします。現在のターゲットは GDB セッションに表示されているものです。このターゲットのみが現在 GDB セッションによって制御されます。この動作は、システムの起動時に便利です。
  • cortex_a smp : 現在の SMP モードを表示します。
  • cortex_a smp_gdb : GDB セッションに表示されるコア ID を表示 / 修正します。以下の例を参照してください。
cortex_a smp_gdb
gdb coreid  0 -> -1
#0 : coreid 0がGDBに表示されます、
#-> -1 : 次のresumeは実際のresumeをトリガーします
cortex_a smp_gdb 1
gdb coreid  0 -> 1
#0 : coreid 0がGDBに表示されます、
#->1  : 次のresumeはcoreid 1をGDBに表示します
resume
cortex_a smp_gdb
gdb coreid  1 -> 1
#1 : coreid 1がGDBに表示されます、
#->1 : 次のresumeはcoreid 1をGDBに表示します
cortex_a smp_gdb -1
gdb coreid  1 -> -1
#1 : coreid 1がGDBに表示されます、
#->-1 : 次のresumeは実際のresumeをトリガーします

上記の例では、target create 以外にも、target smp コマンドも含まれています。

cti create#

cti create cti$_core -dap $_CHIPNAME.dap -baseaddr [set $_TARGETNAME.cti($_core)] -ap-num 0

ARM-Cross_002dTrigger-Interface

Command: cti create cti_name -dap dap_name -ap-num apn -baseaddr base_address

cti_name という CTI インスタンスを DAP インスタンスdap_name上の MEM-APapnに作成します。ADIv5 DAP では、apn は CTI が接続されている DAP AP の数値インデックスです。ADIv6 DAP では、apn は CTI が接続されている DAP AP の基本アドレスです。base_addressは、該当する MEM-AP 上の CTI の基本アドレスと一致する必要があります。すべての引数は必須です。これにより、さまざまな目的に使用される新しいコマンド$cti_nameが作成されます。

targets#

targets rk3568.lcore0

設定されたすべてのターゲットはリストの一部であり、各メンバーには名前があります。その名前は通常、TAP 名と同じであるべきです。targets(複数形)コマンドを使用してリストを表示できます。この表示には通常、1 つの CPU しかありません。複数ある場合は次のようになります:

TargetNameTypeEndianTapNameState
0* at91rm9200.cpuarm920tlittleat91rm9200.cpurunning
1 MyTargetcortex_mlittlemychip.footap-disabled

そのリストのメンバーの 1 つが_current target_であり、多くのコマンドによって暗黙的に参照されます。ターゲット名の近くに*が付いているものです。特に、メモリアドレスは通常、その現在のターゲットが見ているアドレス空間を参照します。mdw(メモリ表示ワード)やflash erase_address(NOR フラッシュブロックの消去)などのコマンドが例です。

いくつかのコマンドを使用してターゲットのリストを調べることができます:

Command: target current

現在のターゲットの名前を返します。

Command: target names

リスト内のすべての現在のターゲットの名前をリストします。

foreach t [target names] {
puts [format "Target: %s\n" $t]
}

Command: targets [name]

注意:このコマンドの名前は複数形です。他のターゲットコマンド名は単数形です。

パラメータなしで、このコマンドは、ユーザーフレンドリーな形式で知られているすべてのターゲットのテーブルを表示します。

パラメータを指定すると、このコマンドは、指定された名前のターゲットを現在のターゲットとして設定します。これは、複数のターゲットを持つボードでのみ関連します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。