source: asp3_wo_tecs/trunk/doc/test_hrt.txt@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

  • Property svn:mime-type set to application/octet-stream
File size: 8.2 KB
Line 
1 TOPPERS Confidential
2 TOPPERSプロジェクト ディスカッションメモ
3 高分解能タイマを用いたシステム時刻管理機能のテスト方法
4
5 作成者
6: 高田広章(名古屋大学)
7 最終更新: 2014年5月31日
8
9○メモの位置付け
10
11このドキュメントは,高分解能タイマを用いたTOPPERS/ASP3カーネルのシステ
12ム時刻管理機能のテスト方法に関して検討するものである。
13
14○テストのアプローチ
15
16高分解能タイマを用いて実現したシステム時刻管理機能に関する網羅
17的なテス
18トを行うには,ターゲットに標準の高分解能タイマを使ってテストするだけで
19は不十分で,テスト用の高分解能タイマモジュールを用いることが必
20要である。
21テスト用の高分解能タイマモジュールは,ハードウェアタイマではなく,テス
22トデータに駆動されて動作するものである。
23
24テストプログラムでは,高分解能タイマモジュールの関数が,どのタイミング
25でどのパラメータで呼び出されるかを検査する。また,高分解能タイマモジュー
26ルの関数が返す値が,テストデータとなる。
27
28そこで,高分解能タイマモジュールの関数の中で,以下の3つの関数を,テスト
29プログラム側で用意することとする。
30
31 HRTCNT target_hrt_get_current(void)
32 void target_hrt_set_event(HRTCNT hrtcnt)
33 void target_hrt_raise_event(void)
34
35高分解能タイマモジュールの性質は,以下の3つの定数で決定される。そこで,
36この3つの定数の組を複数用意しておき,テストプログラムによって定数の組を
37切り換えることにする。
38
39 TCYC_HRTCNT
40 TSTEP_HRTCNT
41 HRTCNT_BOUND
42
43○テスト用の高分解能タイマモジュール
44
45テスト用の高分解能タイマモジュールの実現は,どうしてもターゲットに依存
46してしまう。å…
47·ä½“的には,テストプログラムからタイマ割込みをかける処理が
48ターゲットに依存せざるをえない。これに対して,2つの対応案が考えられる。
49
50(案1) このテスト用のターゲット依存部を作成する。
51
52(案2) 既存のターゲット依存部が提供するタイマドライバ中を,条件コンパイ
53ルにより,このテストを行うためのターゲット依存部が作れるようにする。
54
55どちらの案も有力ではあるが,テストのためにターゲット依存部を複雑化させ
56るのを避けるという観点から,案1で進めることとする。å…
57·ä½“的には,Mac OS
58X上でシステム時刻管理機能テストを行うためのターゲット依存部として,
59test_hrt_macosx_gccを作る。
60
61高分解能タイマモジュールの関数の中で,以下の2つの関数は,テスト用の高分
62解能タイマモジュールの中で実装
63する。
64
65 void target_hrt_initialize(intptr_t exinf)
66 void target_hrt_terminate(intptr_t exinf)
67
68また,テストプログラムからタイマ割込みをかけるために,以下の関数を,テ
69スト用の高分解能タイマモジュールの中で実装
70する。
71
72 void target_raise_hrt_int(uint_t timing)
73
74この関数は,テストプログラムから直接呼び出すためのもので,timingが0Uの
75場合には呼び出した直後に,1Uの場合には一定時間(テストプログラムの処理
76が落ち着く時間)後に,高分解能タイマ割込み(または,それを模擬するため
77の割込み)を発生させる。
78
79さらに,高分解能タイマ割込み(または,それを模擬するための割込み)を処
80理する割込みハンドラ(または,割込みサービスルーチン)も,テスト用の高
81分解能タイマモジュールの中で実装
82する。
83
84○高分解能タイマモジュールの性質
85
86高分解能タイマモジュールの性質を決定する3つの定数の組として,以下を用意
87する。どれを用いるかは,コンパイルオプションに-DHRT_CONFIGnを付けること
88で決定するものとする。
89
90(1) 1μ秒毎にカウントアップする32ビットタイマ
91
92#ifdef HRT_CONFIG1
93#undef TCYC_HRTCNT /* 2^32 */
94#define TSTEP_HRTCNT 1U
95#define HRTCNT_BOUND 4000000002U
96#endif /* HRT_CONFIG1 */
97
98※ HRTCNT_BOUNDを400000002U(=TMAX_RELTIM+TSTEP_HRTCNT+1)以上にして
99 おくと(最後の+1は,ドリフト調整機能で端数を切り上げる分),通常の
100 状況で高分解能タイマに設定する相対カウント値がHRTCNT_BOUNDを超
101えるこ
102 とはなく,ムダなタイマ割込みが減らせる。
103
104(2) 10μ毎にカウントアップする16ビットタイマ
105
106#ifdef HRT_CONFIG2
107#define TCYC_HRTCNT (0x10000U * 10U)
108#define TSTEP_HRTCNT 10U
109#define HRTCNT_BOUND (0x10000U * 9U)
110#endif /* HRT_CONFIG2 */
111
112○テストシーケンスの記述方法
113
114●第1次案
115
116現在のテストシーケンスの記述方法に,カーネルの処理単位に加えて,以下の
1173つの関数を記述できる機能を追加する。
118
119 HRTCNT target_hrt_get_current(void)
120 void target_hrt_set_event(HRTCNT hrtcnt)
121 void target_hrt_raise_event(void)
122
123これにより,次のような記述が可能になる。
124
125== target_hrt_get_current-1(1回目)==
1261: RETURN(10U)
127== target_hrt_set_event-1(1回目)==
1282: assert(hrtcnt == HRTCNT_BOUND)
129 RETURN
130== TASK1(優å…
131ˆåº¦ï¼šä¸­ï¼‰==
1323: sta_alm(ALM1, 100U)
133== target_hrt_get_current-2(2回目)==
1344: RETURN(20U)
135== target_hrt_set_event-2(2回目)==
1365: assert(hrtcnt == 101U)
137 RETURN
138== TASK1(続き)==
1396: DO(target_raise_hrt_int(1U))
140 slp_tsk()
141== target_hrt_get_current-3(3回目)==
1427: RETURN(130U)
143== ALM1-1(1回目)==
1448: wup_tsk(TASK1)
145 RETURN
146== target_hrt_get_current-4(4回目)==
1479: RETURN(140U)
148== target_hrt_set_event-3(3回目)==
14910: assert(hrtcnt == HRTCNT_BOUND)
150 RETURN
151== TASK1(続き)==
15211: END
153
154これでテストシーケンスの記述は可能であるが,記述がかなり冗長で,作成・
155保守が面倒である。å…
156·ä½“的には,次の問題を挙げることができる。
157
158(a) 関数の何回目の呼び出しであるかを,手動で記述する必
159要がある。
160
161(b) target_hrt_get_currentの中は「RETURN(N)」,target_hrt_set_eventの中
162 は「assert(hrtcnt == N)」「RETURN」と決まっているにもかかわらず,毎
163 回記述する必
164要がある。
165
166●第2次案
167
168(a)の問題を解決するために,何回目の呼び出しであるかを自動的に決めてくれ
169る記述方法を用意する。何回目の呼び出しであるかを変数で管理し,RETURNが
170あるとその変数をインクリメントする。
171
172å…
173·ä½“的な記述方法は次の通り。
174
175== target_hrt_get_current-N ==
1761: RETURN(10U)
177== target_hrt_set_event-N ==
1782: assert(hrtcnt == HRTCNT_BOUND)
179 RETURN
180== TASK1(優å…
181ˆåº¦ï¼šä¸­ï¼‰==
1823: sta_alm(ALM1, 100U)
183== target_hrt_get_current-N ==
1844: RETURN(20U)
185== target_hrt_set_event-N ==
1865: assert(hrtcnt == 101U)
187 RETURN
188(以下略)
189
190●第3次案
191
192(b)の問題を改善した記述方法として,以下のような記述方法を導å…
193¥ã™ã‚‹ã€‚
194
195== START ==
1961: [target_hrt_get_current -> 10U]
1972: [target_hrt_set_event <- HRTCNT_BOUND]
198== TASK1(優å…
199ˆåº¦ï¼šä¸­ï¼‰==
2003: sta_alm(ALM1, 100U)
2014: [target_hrt_get_current -> 20U]
2025: [target_hrt_set_event <- 101U]
2036: DO(target_raise_hrt_int(1U))
204 slp_tsk()
205== HRT_HANDLER ==
2067: [target_hrt_get_current -> 130U]
207== ALM1-1(1回目)==
2088: wup_tsk(TASK1)
209 RETURN
2109: [target_hrt_get_current -> 140U]
21110: [target_hrt_set_event <- HRTCNT_BOUND]
212== TASK1(続き)==
21311: END
214
215最初の「== START ==」は,テストシーケンスの開始を知らせるために必
216要であ
217る。途中の「== HRT_HANDLER ==」は,テストシーケンスを読みやすくするため
218のものであり,なくても差し支えない。
219
220この記述では,target_hrt_get_currentとして単に指定した値をリターンする
221だけ,target_hrt_set_eventとして単にパラメータの値をチェックしてリター
222ンするだけのコードしか生成できない。この他のコードを出したい場合には,
223第1次案または第2次案の記述方法を使う必
224要がある。
225
226以上
Note: See TracBrowser for help on using the repository browser.