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)オプションは任意の順序で指定できますが、各タイプの信号、組み合わせ、ゲート、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 identifiers may change as chips mature, for example with
# new revision fields (the "3" here). Pick a good default; you
# can pass several such identifiers to the "jtag newtap" command.
if { [info exists CPUTAPID ] } {
   set _CPUTAPID $CPUTAPID
} else {
   set _CPUTAPID 0x3f0f0f0f
}

Remember: ボード構成ファイルは複数のターゲット構成ファイルを含むことができるか、同じターゲットファイルを複数回含むことができます(少なくとも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

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

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

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

速度 0(khz)は RTCK メソッドを選択します。 FAQ 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...
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 ルートコントローラ用(例:多くのテキサスインスツルメンツチップの 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 の有効化と無効化を参照してください。

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

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

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

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

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

  • -irmask NUMBER
    -ircaptureとともに使用され、命令スキャンが正しく機能することを確認するためのマスク。OpenOCD は、JTAG スキャンチェーン操作に問題がないことを確認するためにのみ、これらのスキャンを使用します。

  • -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.nameconfigparam を使用して指定する必要があります。

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

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

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

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

Command: $target_name configure configparams...

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

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

  • -chain-position dotted.name – このターゲットにアクセスするために使用される TAP の名前。
  • -dap dap_name – このターゲットにアクセスするために使用される DAP の名前。 DAP 宣言を参照して、DAP インスタンスを作成および管理する方法を確認してください。
  • -endian (big|little) – CPU がビッグエンディアンまたはリトルエンディアンの慣例を使用するかどうかを指定します。
  • -event event_name event_body – ターゲットイベントを参照してください。このリストは、名前付きイベントハンドラのリストを更新します。異なるイベント名でこれを 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 サポートを参照してください。
  • -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 クロストリガーインターフェースを参照してください。
  • -gdb-port number – コマンドgdb_portの可能な値を参照してください。これらの値は数値だけでなく、さまざまな値です。このオプションを使用して、ターゲットのみのグローバルパラメータをコマンドgdb_portで上書きします。 コマンド gdb_portを参照してください。
  • -gdb-max-connections number – 実験的:ターゲットに許可される最大 GDB 接続数を設定します。デフォルトは 1 です。number の負の値は無制限の接続を意味します。 GDB を非侵襲的メモリインスペクタとして使用するを参照してください。

しかし、上記の内容には-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
#define 2 targets working in smp.
target smp $_CHIPNAME.cpu2 $_CHIPNAME.cpu1

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

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

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 : 次の再開は実際の再開をトリガーします
cortex_a smp_gdb 1
gdb coreid  0 -> 1
#0 :coreid 0がGDBに表示されます、
#->1  : 次の再開はcoreid 1をGDBに表示します
resume
cortex_a smp_gdb
gdb coreid  1 -> 1
#1 :coreid 1がGDBに表示されます、
#->1 : 次の再開はcoreid 1をGDBに表示します
cortex_a smp_gdb -1
gdb coreid  1 -> -1
#1 :coreid 1がGDBに表示されます、
#->-1 : 次の再開は実際の再開をトリガーします

上記の例では、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-AP apnに作成します。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 しかありません。複数の CPU がある場合は次のようになります:

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

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

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

Command: target current

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

Command: target names

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

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

Command: targets [name]

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

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

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

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