Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
PRACTICEスクリプト
Takahito Kagawa • [email protected] • April/ 8 / 2019
2 / 62April/8/2019
PRACTICEスクリプト
• TRACE32 PowerViewデバッガGUI内で動作するコマンドスクリプト
• デバッガ内で実施する一連のコマンドをひとまとまりにマクロ化
• Flashプログラミングスクリプト
• 条件文、サブルーチン
• カスタムダイアログ
3 / 62April/8/2019
Agenda
• 準備する環境
• コマンド実行のスクリプト化(バッチ処理化)
• コマンド実行のフロー制御
• カスタムダイアログ
• 使用環境に合わせたスクリプティング
• Pythonとの連携
4 / 62April/8/2019
準備する環境
• ホストパソコンとテキストエディタ
• インストラクションセットシミュレータ
• PowerDebugモジュール、デバッグプローブ、および+ターゲットボード
5 / 62April/8/2019
準備する環境
• サンプルスクリプト
C:/T32/demo/practice
C:/T32/demo/<arch>
• 参照マニュアルC:/T32/PDF/training_practice.pdf
C:/T32/PDF/general_func.pdf
C:/T32/PDF/ide_ref.pdf
C:/T32/PDF/ide_user.pdf
C:/T32/PDF/ide_func.pdf
6 / 62April/8/2019
準備する環境 (外部エディタとの連携)
• 例:KDE KATE
SETUP.EDITEXT ON "C:¥Program Files¥Kate¥bin¥kate.exe ""*""“
• メニューバー [ファイル(F)]->[開く(O)…]から
外部エディタでファイルを開く
7 / 62April/8/2019
準備する環境 (外部エディタ用拡張機能)
• 外部エディタ用のPRACTICEシンタックスハイライト機能
• KATE, Notepad++, Textpad, Ultraedit, Vim
8 / 62April/8/2019
準備する環境 (シンタックスハイライト)
• 例:KDE KATE
9 / 62April/8/2019
Agenda
• 準備する環境
• コマンド実行のスクリプト化(バッチ処理化)
• コマンド実行のフロー制御
• カスタムダイアログ
• 使用環境に合わせたスクリプティング
• Pythonとの連携
10 / 62April/8/2019
実施コマンドのマクロ化 (コマンド:LOG.OPEN)
• メニュー、ボタン操作を含む、すべてのコマンドログ
コマンド:LOG.OPEN C:/T32/sample_log.cmm ; 記録の開始
コマンド:LOG.TYPE ; 内容の表示
11 / 62April/8/2019
現在の設定状態をコマンド化(コマンド:ClipSTOre, STOre)
• ClipSTOre:現在の各設定状態をコマンド化し、クリップボードへ
コマンド:ClipSTOre SYStem ; SYStem設定をコマンド化
コマンド:ClipSTOre Break ; ブレークポイント設定をコマンド化
コマンド:ClipSTOre Win ; ウィンドウの配置をコマンド化
12 / 62April/8/2019
現在の設定状態をコマンド化(コマンド:ClipSTOre, STOre)
SYSTEM.RESET
SYSTEM.CPU SPC56EC74
SYSTEM.CONFIG CORENUMBER 2.
SYSTEM.CONFIG CORE 1. 1.
CORE.ASSIGN 1.
SYSTEM.MEMACCESS NEXUS
SYSTEM.CPUACCESS DENIED
SYSTEM.OPTION IMASKASM OFF
SYSTEM.OPTION IMASKHLL OFF
SYSTEM.BDMCLOCK 4000000.
SYSTEM.CONFIG TRISTATE OFF
SYSTEM.CONFIG SLAVE OFF
SYSTEM.CONFIG TAPSTATE 7.
SYSTEM.CONFIG TCKLEVEL 0.
SYSTEM.CONFIG.DEBUGPORT Analyzer0
SYSTEM.CONFIG CJTAGFLAGS 0x3
SYSTEM.MODE UP
コマンド:ClipSTOre SYStem
13 / 62April/8/2019
現在の設定状態をコマンド化(コマンド:ClipSTOre, STOre)
コマンド:STOre C:/T32/sample.cmm SYStem
設定コマンドを sample.cmmファイルに出力
14 / 62April/8/2019
現在の設定状態をコマンド化(コマンド:ClipSTOre, STOre)
コマンド:ClipSTOre / STOre
ALL | BookMark | Break | BSDL | DIS | FLASH | GROUP |
HELP | HISTory | MAP | MARKER | PATH | PBREAK |
PERF | Register | SPATH | Synch | SYStem | TRANSlation
15 / 62April/8/2019
Agenda
• 準備する環境
• コマンド実行のスクリプト化(バッチ処理化)
• コマンド実行のフロー制御
• カスタムダイアログ
• 使用環境に合わせたスクリプティング
• Pythonとの連携
16 / 62April/8/2019
スクリプトの構成要素
• コメント
• 行頭に // もしくは、; (セミコロン)
※ // が好ましい• コマンド
• デバッガ内で使用できるすべてのコマンド
• 関数
• ターゲットの状態やデバッグツールの状態を読出し
• 演算子
• +,-,*,/
• ラベル
• スクリプト内にサブルーチンを設置する際に使用
17 / 62April/8/2019
Conditional Program Execution
• IF-ELSE
<condition>が真のとき<if_block>を実行し、そうではないとき、<else_block>を実行
IF <condition>
(
<if_block>
)
ELSE
(
<else_block>
)
18 / 62April/8/2019
Conditional Program Execution
• Var.IF (※シンボル情報を読み込ませている場合に利用可能)
<condition>が真のとき<if_block>を実行し、そうではないとき、<else_block>を実行
Var.IF <hll_condition>
(
<if_block>
)
ELSE
(
<else_block>
)
19 / 62April/8/2019
Conditional Program Execution
• Var.WHILE (※シンボル情報を読み込ませている場合に利用可能)
<hll_condition>が真のとき<block>を実行
Var.WHILE <hll_condition>
(
<block>
)
20 / 62April/8/2019
Conditional Program Execution
• RePeaT
<count>回数分、<command> もしくは <block>を繰り返し実行。
RePeaT <count> <command>
-------------------------------------------
RePeaT <count>
(
<block>
)
-------------------------------------------
RePeaT
(
<block>
) WHILE <condition>
21 / 62April/8/2019
サブルーチンの呼び出し
• GOSUB <label> [<parameter_list>]
パラメータ(オプション)とともに、<label>のサブルーチンを呼び出し
GOSUB <label> [<parameter_list>]
…
ENDDO
<label>
(
<block>
RETURN
)
[注意]
label は、必ず行の先頭から開始し、末尾は” : “ とします。スペースは置かない。
22 / 62April/8/2019
GOTO と JUMPTO
• GOTO <label>
スクリプト実行が<label>にて続行
<label>は、その時点で実行しているスクリプト内のみが対象
• JUMPTO <label>
スクリプト実行が<label>にて続行
<label>は、PRACTICEスクリプトのスタック上に配置
23 / 62April/8/2019
JUMPTO
// Script test_sequence.cmm
DO target_setup.cmm
DO check_boot.cmm
ENDDO
terminate_script:
(
DIALOG.OK "Script terminated by test failure"
ENDDO
)
// Script check_boot.cmm
//
Go main
WAIT !STATE.RUN() 2.s
IF STATE.RUN()
(
Break.direct
)
IF Register(PC)==ADDRESS.OFFSET(main)
(
APPEND test_protocol.txt FORMAT.STRing("System booted successfully",70.,' ') ¥
FORMAT.UnixTime("c",DATE.UnixTime(),DATE.utcOffSet())
)
ELSE
(
APPEND test_protocol.txt FORMAT.STRing("Booting failed",70.,' ') ¥
FORMAT.UnixTime("c",DATE.UnixTime(),DATE.utcOffSet())
JUMPTO terminate_script
)
24 / 62April/8/2019
スクリプトの呼び出し
• DO <script> [<parameter_list>]
スクリプト内もしくは、コマンドラインからスクリプトを実行
// Script test_sequence.cmm
DO target_setup.cmm
DO check_boot.cmm
ENDDO
terminate_script:
(
DIALOG.OK "Script terminated by test failure"
ENDDO
)
25 / 62April/8/2019
スクリプト内変数 (PRIVATE, LOCAL, GLOBAL)
• PRIVATE --- PRIVATE変数の生成
• PRIVATEで宣言された変数は、生成されたスクリプト内、サブルーチンやブロック内で参照可能。
• スクリプト、サブルーチンやブロックが終了した時点で消去。
• ネスト上のブロックからも参照可能だけれども、呼び出されたサブルーチンやスクリプト内では参照できない。
26 / 62April/8/2019
スクリプト内変数 (PRIVATE, LOCAL, GLOBAL)
• LOCAL --- LOCAL変数の生成
• LOCALで宣言された変数は、生成されたスクリプト内、サブルーチンやブロック内で参照可能。
• スクリプト、サブルーチンやブロックが終了した時点で消去。
• ネスト上のブロックおよび、呼び出されたサブルーチンやスクリプト内でも参照可能。
27 / 62April/8/2019
スクリプト内変数 (PRIVATE, LOCAL, GLOBAL)
• GLOBAL --- GLOBAL変数の生成
• GLOBALで宣言された変数は、全てのスクリプト、サブルーチンやブロック内で参照可能。
• PMACRO.RESetコマンドで、明示的に消去されるまで参照可。
• 動作しているスクリプトがない場合にのみ消去可能。
28 / 62April/8/2019
Agenda
• 準備する環境
• コマンド実行のスクリプト化(バッチ処理化)
• コマンド実行のフロー制御
• カスタムダイアログ
• 使用環境に合わせたスクリプティング
• Pythonとの連携
29 / 62April/8/2019
シンプルダイアログとカスタムダイアログ
• シンプルダイアログ
• ユーザに対し何か情報を伝えたり、簡単な選択を促す
• カスタムダイアログ
• プルダウンメニュー、プッシュボタン、選択ボタン、ファイル参照など、自由に設置可能
30 / 62April/8/2019
シンプルダイアログ
• DIALOG.MESSAGE “<text>”
標準的なダイアログをメッセージとともに表示
(with インフォメーションマーク)
• DIALOG.OK “<text>”
標準的なダイアログをメッセージとともに表示
(with エクスクラメーションマーク)
• DIALOG.YESNO “<text>”
Yes/No選択ダイアログをメッセージとともに表示
31 / 62April/8/2019
カスタムダイアログ
• 所望のインターフェースに合わせて、複雑なダイアログの作成が可能
• 設置可能なコンポーネント
Checkbox, Choosebox, Listbox, Edit, Pulldown,簡単なアニメーション等々
32 / 62April/8/2019
カスタムダイアログ (位置調整)
• POS [<x>] [<y>] [<width>] [<height>]
次に続くダイアログコンポーネントをダイアログウィンドウ上のどこに配置するかを定義
<x> 0 ~ 16383.5 の間で、0.5単位ごとに指定可能
<y> 0 ~ 8191.75 の間で、0.25単位ごとに指定可能
<width> 0 ~ 16383.5 の間で、0.5単位ごとに指定可能
<height> 0 ~ 8191.75 の間で、0.25単位ごとに指定可能
33 / 62April/8/2019
カスタムダイアログ (位置調整)
• POS [<x>] [<y>] [<width>] [<height>]
34 / 62April/8/2019
カスタムダイアログ (コンポーネント属性の設定)
• 各ダイアログコンポーネントの有効/無効
• ユーザー入力や各コンポーネントの状態を展開
• ラベルを使ってコンポーネントに値を設定
• 各コンポーネントの状態を設定
35 / 62April/8/2019
カスタムダイアログ (コンポーネント属性の設定)
• 各ダイアログコンポーネントの有効/無効
DIALOG.Enable <lable> :<label>に関連するコンポーネントを有効化
DIALOG.Disable <label>:<label>に関連するコンポーネントを無効化
36 / 62April/8/2019
カスタムダイアログ (コンポーネント属性の設定)
• 各ダイアログコンポーネントからのデータ採取
DIALOG.STRing(<lable>), DIALOG.STRing2(<label>)
:<label>に関連するコンポーネントからデータを採取
37 / 62April/8/2019
カスタムダイアログ (コンポーネント属性の設定)
• 各ダイアログコンポーネントへの値の設定
DIALOG.Set <label> <value>
:<label>に関連するコンポーネントに<value>を設定
38 / 62April/8/2019
カスタムダイアログ (コンポーネント属性の設定)
• 各ダイアログコンポーネントのコマンドの実行
DIALOG.EXecute <label>
:<label>に関連するコンポーネントのコマンドを実行
39 / 62April/8/2019
カスタムダイアログ (ファイル、ディレクトリ参照)
• ファイルおよびディレクトリブラウジングコマンド
DIALOG.DIR <directory_name>:
ディレクトリ名を選ぶためのダイアログボックス。
<directory_name> にはワイルドカード(*)が必須。
DIALOG.File <file_name>:
ファイルを選ぶためのダイアログボックス。
<file_name> にはワイルドカード(*)が必須。
DIALOG.File.SAVE <file_name>:
40 / 62April/8/2019
カスタムダイアログ (参考資料)
• C:/T32/PDF/training_practice.pdf の「Dialog Programming」の項
• C:/T32/PDF/ide_user.pdf の「Dialog Programming」の項
• C:/T32/demo/practice/dialogs フォルダのサンプルスクリプト
41 / 62April/8/2019
Agenda
• 準備する環境
• コマンド実行のスクリプト化(バッチ処理化)
• コマンド実行のフロー制御
• カスタムダイアログ
• 使用環境に合わせたスクリプティング
• Pythonとの連携
42 / 62April/8/2019
使用環境に合わせたスクリプティング
• ホストパソコンのディレクトリ構造の違い
• ホストパソコンのOSの違い
• デバッグツールハードウェアの違い
• ターゲットCPUやターゲットボードの違い
• TRACE32のバージョンの違い
• TRACE32の設定の違い
これらの違いを吸収するようなスクリプティング
43 / 62April/8/2019
ディレクトリパス
• [Function] OS.PresentWorkingDirectory()
ワーキングディレクトリ名を文字列で取得
PRIVATE &pwd
&pwd=OS.PresentWorkingDirectory()
ChDir "C:¥users¥rico¥Project_1¥out"
Data.LOAD.Elf "myprog.elf"
ChDir "&pwd"
44 / 62April/8/2019
ディレクトリパス
• [Function] OS.PresentPracticeDirectory()
PRACTICEスクリプトのディレクトリ名を文字列で取得
PRIVATE &ppd
&ppd=OS.PresentPracticeDirectory()
Data.LOAD.Elf “&ppd/myprog.elf"
45 / 62April/8/2019
ディレクトリパス
• [Function] OS.FILE(<filename>)
ファイルが存在すれば TRUE を返すPRIVATE &ppd &file&ppd=OS.PresentPracticeDirectory()&file="&ppd"+"¥myprog.elf"IF OS.FILE("&file")==TRUE()
Data.LOAD.Elf "&file"ELSE(
&file="&ppd"+"¥out¥myprog.elf"IF OS.FILE("&file")==TRUE()
Data.LOAD.Elf "&file"ELSE
Data.LOAD.Elf "*.elf")
46 / 62April/8/2019
ビルトインファイルシステム操作コマンド
• スクリプト内で使えるファイル操作コマンド
REN <filename>:ファイル名の変更
COPY <source> <destination>:ファイルのコピー
MKDIR <pathname>:ディレクトリの作成
RMDIR <pathname>:ディレクトリの削除
ZIP <source> [<destination>]:ファイルの圧縮
その他のコマンド:C:/T32/PDF/ide_user.pdfの “File and Folder Operations”
47 / 62April/8/2019
ビルトインファイルシステム操作コマンド
• スクリプト内で使えるファイル操作コマンド
; Windowsホストのみで動作するコマンドCOPY C:¥t32¥config.t32 C:¥t32¥config-usb.t32
;Linux もしくは MacOSのみで動作するコマンドCOPY /opt/t32/config.t32 /opt/t32/config-usb.t32
;どのホストでも動作するコマンドCOPY "~~/config.t32" "~~/config-usb.t32"
48 / 62April/8/2019
デバッグハードウェア
• デバッグツールのハードウェア構成を識別するための関数
[Function] AUTOFOCUS()
[Function] hardware.POWERDEBUG()
[Function] hardware.POWERTRACE2()
[Function] INTERFACE.SIM()
[Function] ID.CABLE()
関数一覧:C:/T32/PDF/general_func.pdf
49 / 62April/8/2019
デバッグハードウェア
• デバッグツールのハードウェア構成を識別するための関数
; デバッグプローブのIDを表示PRINT ID.CABLE()
; もしシミュレータだったら…
IF INTERFACE.SIM()
(
DIALOG.OK "Simulator mode not supported by this script." ¥
"Press ’OK’ to exit the script."
ENDDO
)
50 / 62April/8/2019
ターゲットCPU
• ターゲットCPUファミリや型番によって区分け
[Function] CPUFAMILY():コアアーキテクチャファミリ
[Function] CPU():”SYStem.CPU”で指定した型番を表示
IF CPUFAMILY()=="ARM"
(
IF CABLE.TWOWIRE()
SYStem.CONFIG SWD
)
51 / 62April/8/2019
ターゲットCPU
• デバイスIDによって区分け
“SYStem.DETECT IDCODE”コマンドでIDコードの読み出し、その値をもとに設定を変更
LOCAL &deviceSYStem.RESetSYStem.CPU ARM7TDMI ; Default CPUSYStem.DETECT IDCode ; IDコードの読み出し
&device=IDCODE(0)&0x0fffffffIF &device==0x0B95C02F // TI OMAP4430 (
SYStem.CPU OMAP4430APP1SYStem.CONFIG CTIBASE 0xd4148000SYStem.Mode Up
)ELSE IF &device==0x049220DD // Altera Excalibur(
SYStem.CPU EPXASYStem.Mode UpData.Set C15:00000001 %LE %Long 0x0178
)ELSE(
PRINT %ERROR "Don't know device 0x" %Hex &device
ENDDO)
52 / 62April/8/2019
TRACE32 PowerView (GUI)のバージョン
• デバッガソフトウェアのビルドバージョンの読み出し
[Function] VERSION.BUILD()
TRACE32のビルド番号
[Function] VERSION.BUILD.BASE()
TRACE32のベースビルド番号
IF VERSION.BUILD()<56572.
(
DIALOG.OK "This script requires TRACE32 build greater than 56572."
ENDDO
)
53 / 62April/8/2019
TRACE32 PowerView (GUI)のバージョン
54 / 62April/8/2019
エラーハンドリング
• スクリプト実行中に発生する可能性をふまえた記述 (ON ERROR)
; Enable error handler;ON ERROR GOSUB(; Tell the user that the file wasn’t loaded and ask them to browse; for its correct location.
PRINT "File not found."Data.LOAD.Elf *RETURN
)
; Execute a command that will failData.LOAD.Elf "non_existent_file.elf"
; Restore previous error handlerON ERROR inheritENDDO
55 / 62April/8/2019
カスタムコマンド
• 独自コマンドの定義
[Command] GLOBALON CoMmanD <name> DO <script>
<name>で指定した名称で、DO に続けて指定したスクリプトを実行させることが可能。
<name>で指定できる名称の長さは、9文字以内。
56 / 62April/8/2019
カスタムコマンド (例:custom_command.cmm)PARAMETERS &test &testfile &countIF "&test"==""(; No arguments so register the commandLOCAL &this_script&this_script=OS.PresentPracticeFile()GLOBALON CoMmanD TESTRUN DO "&this_script"
)ELSE IF "&test"=="REMOVE"(; Use this to remove the global commandGLOBALON CoMmanD TESTRUN
)ELSE(RePeaT &count(GOSUB &test "&testfile"
))ENDDO
test1:PARAMETERS &tfPRINT "Running test1 with data file (&tf)"RETURN
test2:PARAMETERS &tfPRINT "Running test2 with data file (&tf)"RETURN
DO custom_command.cmmTESTRUN "test1" "testdata1.txt" "0x10"TESTRUN "test2" "testdata2.txt" "0x03“
; Call the script again to remove the commandDO custom_command.cmm "REMOVE"ENDDO
57 / 62April/8/2019
Pitfalls
• STOPと ENTRYコマンド
• 停止している理由が何も表示されない
• IFとWHILEコマンドの直後の空白
• その他の表現では空白は不要
【正】IF (&i<5.)
【誤】IF(&i<5.)
【正】&x=(5.+8.*2.)/(3/+&i)
【誤】&x = ( 5. + 8. * 2 ) / ( 3 + &i )
58 / 62April/8/2019
Pitfalls
• ファイル名の指定に関数が含まれてはならない
• 値を指定する際、値の表現を0x10 や 16. というように明確に指定する
• ディレクトリパスの表現は、OS.PPD(), OS.PWDを使う
• TRACE32に組み込まれているファイル操作コマンドを使う
【正】&dir=STRing.TRIM("&dir")Data.LOAD.Elf "&dir/myprog.elf“
【誤】Data.LOAD.Elf STRing.TRIM("&dir")+"/myprog.elf"
59 / 62April/8/2019
Agenda
• 準備する環境
• コマンド実行のスクリプト化(バッチ処理化)
• コマンド実行のフロー制御
• カスタムダイアログ
• 使用環境に合わせたスクリプティング
• Pythonとの連携
60 / 62April/8/2019
PowerViewを Pythonからコントロール
• TRACE32 Remote API を介し、TRACE32 PowerViewを操作
• Python以外にも、C, C#, .NET, VBA用のAPI
61 / 62April/8/2019
PowerViewを Pythonからコントロール
• [マニュアル] C:/T32/PDF/app_python.pdf
• [サンプル] C:/T32/demo/api/python
python t32apimenu.py python t32_run_script.py
Takahito Kagawa • [email protected] • April / 8 / 2019