#概要
本記事は,「TOPPERS/TTSPを動作させる」の TTSPのターゲット依存部についての解説記事です.
依存コードは,以下の4種類/合計9個あります.
- タイマ依存部(3個)
- 割り込み依存部(2個)
- CPU例外依存部(2個)
- タスク依存部(2個)
#実装概要および詳細
タイマ依存部
前提知識として,ASPのシステム時間は,1ms周期タイマで定期更新(signal_time())されます.
TTSPのテストでは,システム時間管理用のタイマを停止/開始/1ms進行させるAPIを使用することで,ASPのシステム時間が適切に更新/非更新されていることを確認します.
(1) 停止: ttsp_target_stop_tick
タイマを止めるため,以下の操作を実施.
- 割り込みコントローラの割り込みを禁止状態にする
- タイマ動作を停止
- ペンディング中の割り込み要求もクリア
SIL_PRE_LOC;
SIL_LOC_INT();
x_disable_int(INTNO_TIMER);
SetTimerStopTAA(INTNO_TIMER);
x_clear_int(INTNO_TIMER);
SIL_UNL_INT();
(2) 開始: ttsp_target_start_tick
タイマを開始するため,以下の操作を実施.
- タイマ動作を開始
- 割り込みコントローラの割り込みを許可状態にする
SIL_PRE_LOC;
SIL_LOC_INT();
SetTimerStartTAA(TIMER_DTIM_ID);
x_enable_int(INTNO_TIMER);
SIL_UNL_INT();
(3) 1ms進行: ttsp_target_gain_tick
システム時間を1ms進行させるために,タイマ割り込みが1回発生する.
本機能を実装するために,以下の待ち合わせ処理を実施.
なお,本関数の呼び出し条件はタイマ停止状態とされている.
- 現在のタイマカウント値を取得
- タイマの動作開始
- 次の割り込み発生までHALT命令で待つ
- タイマの動作停止
SIL_PRE_LOC;
SIL_LOC_INT();
SetTimerStartTAA(TIMER_DTIM_ID);
x_enable_int(INTNO_TIMER);
do_halt();
SIL_UNL_INT();
SIL_LOC_INT();
x_disable_int(INTNO_TIMER);
SetTimerStopTAA(INTNO_TIMER);
SIL_UNL_INT();
以下,上記関数実行後のタイマ依存部のテスト実行結果です.
[CPU>
system1 : 0
system2 : 10
timer_interrupt : OK
system1 : 10
system2 : 10
ttsp_target_stop_tick() : OK
system1 : 19
system2 : 20
ttsp_target_gain_tick() : OK
system1 : 21
system2 : 31
ttsp_target_start_tick() : OK
Check point 1 passed.
All check points passed.
q
[NEXT> pc=0x8d0a target_config.c 44
[DBG>e
clock = cpu 20426497 intc 1767 real_time 35.077789
割り込み依存部
(4) 割り込み発生: ttsp_int_raise
本関数では,引数(intno)の値を割り込み番号として,当該割り込みを発生させる必要があります.実機上で任意の割り込みを発生させることは困難であり,タイマ割り込みを利用することでなんとか要求仕様を満たす形になると思われます.
一方,仮想環境ではこの辺りはうまくやれます.具体的には,プログラム実行中に任意の割り込みを発生できるように,athrillではデバッグ用変数athrill_device_raise_interruptを用意しています.以下,実装詳細です.
athrill_device_raise_interrupt = intno;
上記変数代入直後に割り込みが発生します.
(5) 割り込み要求クリア: ttsp_clear_int_req
本関数では,引数(intno)の値を割り込み番号として,当該割り込み要求をクリアします.
以下,実装詳細です.
x_clear_int(intno);
以下,上記関数実行後の割り込み依存部のテスト実行結果です.
[CPU>Check point 1 passed.
Check point 2 passed.
ttsp_int_raise(TTSP_INTNO_A) : OK
Check point 3 passed.
Check point 4 passed.
Check point 5 passed.
ttsp_int_raise(TTSP_INTNO_A) : OK
Check point 6 passed.
Check point 7 passed.
Check point 8 passed.
ttsp_int_raise(TTSP_INTNO_D) : OK
Check point 9 passed.
ttsp_int_raise(TTSP_INTNO_E) : OK
Check point 10 passed.
ttsp_int_raise(TTSP_INTNO_F) : OK
Check point 11 passed.
ttsp_int_raise(TTSP_INTNO_A) : OK
Check point 12 passed.
ttsp_int_raise(TTSP_INTNO_B) : OK
Check point 13 passed.
ttsp_int_raise(TTSP_INTNO_C) : OK
Check point 14 passed.
Check point 15 passed.
Check point 16 passed.
All check points passed.
q
[NEXT> pc=0x92b8 target_config.c 44
[DBG>e
clock = cpu 908748 intc 520 real_time 0.596828
上記のテスト内容を解析した結果をシーケンス図で残しておきます.
CPU例外依存部
(6) CPU例外発生: ttsp_cpuexc_raise
本関数では,引数(excno)の値を例外番号として,CPU例外を発生させる必要があります.
今回はTRAP命令でCPU例外を発生させることにしました.
以下,実装詳細です.
do_trap(0x01);
(7) CPU例外発生時のフック関数: ttsp_cpuexc_hook
athrill固有のフック関数実装は不要と思われたので,一旦,実装対象から外しました.
以下,上記実装を行って,CPU例外テストを実行した結果です.
Check point 1 passed.
[TSK]ttsp_cpuexc_raise(TTSP_EXCNO_A) : OK
Check point 2 passed.
Check point 3 passed.
Check point 4 passed.
[TEX]ttsp_cpuexc_raise(TTSP_EXCNO_A) : OK
Check point 5 passed.
Check point 6 passed.
Check point 7 passed.
Check point 8 passed.
[ALM]ttsp_cpuexc_raise(TTSP_EXCNO_A) : OK
Check point 9 passed.
Check point 10 passed.
Check point 11 passed.
Check point 12 passed.
[CYC]ttsp_cpuexc_raise(TTSP_EXCNO_A) : OK
Check point 13 passed.
Check point 14 passed.
Check point 15 passed.
All check points passed.
タスク依存部
athrill固有のタスク依存処理は不要でしたので,実装対象から外しました.
#関連記事