source: asp3_wo_tecs/trunk/doc/systim_design.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

File size: 39.3 KB
Line 
1 TOPPERS Confidential
2 TOPPERS/ASP3カーネル 設計メモ
3 ASP3カーネルにおけるシステム時刻管理機能の設計について
4
5 作成者
6: 高田広章(名古屋大学)
7 最終更新: 2014年6月22日
8
9○メモの位置付け
10
11このメモは,TOPPERS/ASP3カーネルにおけるシステム時刻管理機能の設計につ
12いて記述するものである.最終的な設計ドキュメントは,ASP3カーネルの設計
13書にå…
14¥ã‚Œè¾¼ã‚€äºˆå®šã§ã‚るが,このメモは,設計ドキュメントを作成する過程を
15記録することも目的とする.
16
17○参ç…
18§æ–‡çŒ®
19
20[1] TOPPERS第3世代カーネル(ITRON系)統合仕様書 Release 3.A.0(最終更新:
212014年5月18日).
22
23[2] TOPPERSプロジェクト ディスカッションメモ「TOPPERS第3世代カーネル
24(ITRON系)における時間管理について」(最終更新: 2014年5月18日).
25
26[3] TOPPERS/ASP3カーネル 設計メモ Release 3.A.0(最終更新: 2014年5月31
27日).
28
29○実装
30対象とする外部仕様
31
32このメモでは,文献[1]の以下の部分に記述されている仕様の中で,ASP3カーネ
33ル(ドリフト調整機能拡張パッケージを含む)でサポートする機能を実装
34する
35ための設計ドキュメントを作成する.
36
37 「2.3.2 サービスコールとパラメータ」の節の次の部分
38 (2) システム時刻と相対時間
39 (3) タイムアウトとポーリング
40
41 「4.6.1 システム時刻管理」の節のå…
42¨ä½“
43
44また,実装
45で想定するハードウェア構成として,次の記述も考æ…
46®ã™ã‚‹ï¼Ž
47
48 「2.1.4 想定するハードウェア構成」の節の(c)
49
50å…
51·ä½“的には,以下のタグを持つ仕様が実装
52対象となる(仕様書に記述されてい
53る順にリストアップする).なお,下のリスト中の「⇒」以降の記述は,後の
54工程で追記したものである.この工程では,まずはリストアップのみを行って
55いる.
56
57●2.1.4 想定するハードウェア構成
58
59NGKI0556:(c)〔3〕
60
61●2.3.2(2) システム時刻と相対時間
62
63NGKI0548:(a*)〔3〕 ⇒ASPD1001,ASPD1043,t_stddef.h
64NGKI0041:(b) ⇒ASPD1001,…
65NGKI0042:(a) ⇒ASPD1001,…
66NGKI0549:(a)〔3〕 ⇒ASPD1001,…,t_stddef.h
67NGKI0550:(b*)〔3〕 ⇒ASPD1001,システム時刻管理機能の設計å…
68¨ä½“に影響
69NGKI0551:(b*)〔3〕 ⇒t_stddef.h
70NGKI0046:(a*) ⇒ASPD1026,ASPD1027
71NGKI0048:(b) ⇒NGKI1233,NGKI2472,NGKI2481
72NGKI0049:(a) ⇒ASPD1049
73NGKI0050:(a) ⇒ASPD1049
74NGKI0552:(a)〔3〕 ⇒time_event.c
75
76●2.3.2(3) タイムアウトとポーリング(一部)
77
78NGKI0553:(b)〔3〕 ⇒ASPD1001,…
79NGKI0554:(a)〔3〕 ⇒ASPD1001,…
80
81●4.6.1 システム時刻管理
82
83NGKI3603:(a)
84NGKI2333:(a)
85NGKI3559:(a)〔3〕
86NGKI2336:(a)
87NGKI2337:(a)
88NGKI2338:(a)〔M〕 ⇒ASP3対象外
89NGKI2339:(a)〔M〕 ⇒ASP3対象外
90NGKI2340:(a)〔M〕 ⇒ASP3対象外
91NGKI2341:(a)〔M〕 ⇒ASP3対象外
92NGKI2342:(a)〔M〕 ⇒ASP3対象外
93NGKI3560:(a)〔3〕
94NGKI3593:(a)〔3〕 ⇒ドリフト機能拡張
95NGKI3594:(b)〔3〕 ⇒ドリフト機能拡張
96NGKI3595:(a)〔3M〕 ⇒ASP3対象外
97NGKI3580:(a)〔3〕
98NGKI3574:(d)〔3〕
99NGKI3573:(a)〔3〕
100NGKI3575:(a)〔3〕
101NGKI3576:(a)〔3M〕 ⇒ASP3対象外
102NGKI3561:(a)〔3〕←NGKI3594
103NGKI3562:(a)〔3〕
104NGKI3578:(a)〔3〕
105NGKI3579:(a)〔3〕
106ASPS0224:(a)〔3〕
107ASPS0225:(a)〔3〕
108NGKI3563:(a*)〔3〕 ⇒time_manage.c
109NGKI3564:(a*)〔3〕 ⇒time_manage.c
110NGKI3565:(a*)〔3〕 ⇒time_manage.c
111NGKI3566:(a)〔3P〕 ⇒ASP3対象外
112NGKI3567:(a)〔3〕 ⇒ASPD1059,ASPD1060
113NGKI3568:(a)〔3M〕 ⇒ASP3対象外
114NGKI2349:(a*) ⇒time_manage.c
115NGKI2350:(a*) ⇒time_manage.c
116NGKI2351:(a*) ⇒time_manage.c
117NGKI2352:(a)〔P〕 ⇒ASP3対象外
118NGKI2353:(a)〔P〕 ⇒ASP3対象外
119NGKI2354:(a) ⇒ASPD1057,ASPD1058
120NGKI3591:(a)〔3〕 ⇒ASPD1041,ASPD1057,ASPD1058
121NGKI3592:(a)〔3〕 ⇒ASPD1059,ASPD1060
122NGKI2355:(a)〔M〕 ⇒ASP3対象外
123NGKI3581:(a*)〔3〕 ⇒time_manage.c
124NGKI3583:(a*)〔3〕 ⇒time_manage.c
125NGKI3584:(a*)〔3〕 ⇒time_manage.c
126NGKI3585:(a)〔3P〕 ⇒ASP3対象外
127NGKI3586:(a*)〔3〕 ⇒ASPD1053
128NGKI3587:(a*)〔3〕 ⇒ASPD1053
129NGKI3588:(a*)〔3〕 ⇒time_event.c
130NGKI3589:(a*)〔3〕 ⇒time_event.c
131NGKI3590:(a)〔3M〕 ⇒ASP3対象外
132NGKI3596:(a)〔3〕 ⇒ドリフト機能拡張
133NGKI3598:(a)〔3〕 ⇒ドリフト機能拡張
134NGKI3599:(a)〔3〕←NGKI3594 ⇒ドリフト機能拡張
135NGKI3600:(a)〔3P〕 ⇒ASP3対象外
136NGKI3601:(a)〔3〕 ⇒ドリフト機能拡張
137NGKI3602:(a)〔3M〕 ⇒ASP3対象外
138ASPS0226:(a)〔3〕 ⇒サポート範囲に関する要求
139ASPS0227:(a)〔3〕 ⇒サポート範囲に関する要求
140NGKI3569:(a*)〔3〕 ⇒time_manage.c
141NGKI3571:(a*)〔3〕 ⇒time_manage.c
142NGKI3572:(a*)〔3〕 ⇒time_manage.c
143NGKI3577:(a)〔3M〕 ⇒ASP3対象外
144
145これらの中で,ASP3カーネルでサポートしない機能に関するタグには,「⇒
146ASP3対象外」と記載する.å…
147·ä½“的には,保護機能対応カーネルやマルチプロセッ
148サ対応カーネルのみに適用されるタグがこれに該当する.
149
150また,「⇒ドリフト機能拡張」と記載したタグは,[ASPS0224]により標準で
151はサポートしないが,[ASPS0225]によりドリフト調整機能拡張パッケージで
152サポートすることを示す.「⇒サポート範囲に関する要求」は,ASP3カーネル
153および拡張パッケージで,どの範囲の仕様をサポートするかに関する記述であ
154る.
155
156外部仕様書からの要求事項
157に加えて,ASP3カーネル 設計メモ(文献[3])の
158「TOPPERS/ASP3カーネルの実装
159設計方針」の章に記述されている以下の要求事
160項
161も考æ…
162®ã™ã‚‹ï¼Ž
163
164(1) ソースコードの読みやすさ・改造しやすさを重視する
165(2) 新しいターゲットシステムへのポーティングが容易な構造とする
166(3) 検証が容易な構造とする
167(4) 実行性能とメモリ使用量にé…
168æ…
169®ã™ã‚‹
170(5) スケーラビリティにé…
171æ…
172®ã™ã‚‹
173(6) ティックレスの時間管理(ティックレスカーネル)
174
175●TOPPERS/ASP3カーネルの実装
176設計方針
177
178ASPR0001:(a)
179ASPR0002:(a)
180ASPR0003:(a)
181ASPR0004:(a)
182ASPR0005:(a)
183ASPR0006:(a)
184ASPR0007:(a)
185ASPR0008:(a)
186ASPR0009:(a)
187ASPR0010:(a)
188ASPR0011:(a)〔3〕
189
190○設計ドキュメントの本体
191
192●ティックレスのタイムイベント処理
193
194オーバランハンドラの起動以外のタイムイベント処理(タイムアウト処理,タ
195スクの遅
196延,周期ハンドラの起動,アラームハンドラの起動)は,システム時
197刻をきっかけとして行われる[NGKI3603].
198
199ASP3カーネルでは,システム時刻は,ハードウェアが持つ高分解能タイマを用
200いて実現する.高分解能タイマは,一定時間毎にカウントアップし,指定した
201回数カウントアップしたら,タイマ割込みを発生させる機能を持つものとする
202[NGKI0556].
203
204処理すべきタイムイベントがない時にタイマ割込みを発生させないようにする
205ためには[ASPR0011],発生を待
206っているタイムイベントの中で,最も早く発
207生するタイムイベントの発生時刻に割込みを発生させるように,高分解能タイ
208マを設定するのが基本である【ASPD1002】.
209
210●タイムイベントヒープ
211
212タイムイベントを効率的に処理するために,発生を待
213っているタイムイベント
214の集合を管理し,その中で発生時刻が最も早いものを効率的に取り出せるデー
215タ構造が必
216要である.このデータ構造には,TOPPERS/JSPカーネルで導å…
217¥ã—てか
218ら長い実績のあるタイムイベントヒープを用いる.タイムイベントヒープの設
219計については,別に記述することとする.
220
221タイムイベントヒープに登録されているタイムイベントの中で,発生時刻が最
222も早いものを,å…
223ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã¨å‘¼ã¶ï¼Ž
224
225●イベント時刻
226
227システム時刻は64ビットの整数型になる場合があるが[NGKI0548],タイムイ
228ベントの発生時刻を64ビットで管理するのは効率が悪い.なぜなら,タイムイ
229ベントの発生時刻は相対時間でしか指定できず[NGKI0041],相対時間は32ビッ
230トで表現されることから[NGKI0549],ある時点でタイムイベントヒープに登
231録されているタイムイベントの発生時刻は,おおよそ,32ビットで表現できる
232時間幅
233に収まるためである.そこで,タイムイベントヒープに登録されている
234タイムイベントの発生時刻は,32ビットの符号無し整数型で表現することにす
235る【ASPD1001】.この時刻を,イベント時刻と呼ぶ.
236
237実際には,ある時点で登録されているタイムイベントの発生時刻が32ビットで
238表現できる時間幅
239に収まるように,外部仕様を定めている.以下では,これが
24032ビットで表現できる時間幅
241に収まることを論証する.
242
243タイムイベントの発生時刻を相対時間で指定する場合,相対時間の基準時刻は,
244周期ハンドラの起動時刻を除いては[NGKI2372][NGKI2373],相対時間を指
245定するサービスコールを呼び出した時刻(言い換えると現在時刻)である
246[NGKI0042].そのため,相対時間に指定できる最大値をTMAX_RELTIMと書くこ
247とにすると,タイムイベントヒープに登録されているタイムイベントの発生時
248刻は,おおよそ,現在時刻以降で,(現在時刻+TMAX_RELTIM)以前である.周期
249ハンドラの起動時刻に関しては,「周期ハンドラのタイムイベントの登録」の
250節で検討する.
251
252ただし,以下に挙げるいくつかの理由で,登録されているタイムイベントの発
253生時刻が,現在時刻より前や,(現在時刻+TMAX_RELTIM)より後になる場合があ
254る.
255
256そこで,TMAX_RELTIMを4,000,000,000とし[NGKI0550],32ビットで表現でき
257る最大値(4,294,967,296)との間に,294,967,295(約294秒)のマージンを設
258けている.そのため,以下に挙げる理由毎の最大幅
259の合計が294秒を超
260えなけれ
261ば,32ビットで表現できる時間幅
262に収まることになる.
263
264以下では,登録されているタイムイベントの発生時刻が,現在時刻より前にな
265る理由と前になる最大幅
266,(現在時刻+TMAX_RELTIM)より後になる理由と後にな
267る最大幅
268について検討する.
269
270(1) 現在時刻より前になる理由
271
272(1-1) タイムイベント処理の遅
273れ
274
275タイムイベントを処理するためのタイマ割込みが発生してから,タイムイベン
276トが処理されるまでの間は,タイムイベントの発生時刻は,現在時刻より前に
277なっている.特に,タイマ割込みが長時間マスクされていた場合や,タイマ割
278込みより優å…
279ˆã•ã‚Œã‚‹å‡¦ç†ãŒé•·æ™‚間実行されていた場合,プロセッサが処理でき
280る以上の頻度でタイムイベントが発生した場合には,タイムイベントの処理は
281大幅
282に遅
283れることになる.タイムイベントの処理が大幅
284に遅
285れる原因はアプリ
286ケーションによって作られるものであるため,この状況を防ぐのはアプリケー
287ションの責任とする.å…
288·ä½“的には,タイムイベントの処理が2秒以上遅
289れる状況
290では,カーネルの動作は保証されないものとしている[NGKI3608].そのため,
291タイムイベント処理の遅
292れにより,登録されているタイムイベントの発生時刻
293が現在時刻より前になる最大幅
294は,2秒と考えてよい.
295
296(1-2) システム時刻の調整によりシステム時刻を進めた
297
298システム時刻を調整するサービスコール(adj_tim)によりシステム時刻を進め
299ると,登録されているタイムイベントの発生時刻が,現在時刻より前になる可
300能性がある.これに関しては,adj_timの1回の呼出しで進められる時間範囲が
301最大1秒に制限されている[NGKI3561][NGKI3584]ことに加えて,1秒以上過
302去の発生時刻を持つタイムイベントが処理されずに残っている場合は,それ以
303上システム時刻を進めることができない[NGKI3588]こととしている.そのた
304め,システム時刻を進めたことにより,登録されているタイムイベントの発生
305時刻が現在時刻より前になる最大幅
306は,2秒以下である.
307
308外部仕様の制限[NGKI3608]は,システム時刻の調整によりシステム時刻を進
309めた場合にも適用されるものである.そのため,(1-2)の理由によりタイムイベ
310ントの発生時刻が現在時刻より前になる最大幅
311(2秒以下)は,(1-1)の理由に
312よる最大幅
313(2秒)に含まれる.実際には,(1-2)の最大幅
314を考æ…
315®ã—て,外部仕
316様[NGKI3608]の制限時間を定めた.
317
318(2) (現在時刻+TMAX_RELTIM)より後になる理由
319
320(2-1) 相対時間を長い方に丸める
321
322詳しいことは後述するが,相対時間を指定した新たなタイムイベントを登録す
323る時には,相対時間を長い方に丸めるために,タイムイベントの発生時刻に高
324分解能タイマの進み幅
325を加える.そのため,登録するタイムイベントの発生時
326刻が,(現在時刻+TMAX_RELTIM)より,高分解能タイマの進み幅
327の分,後になる
328場合がある.高分解能タイマの進み幅
329はターゲットにより定まるが,ターゲッ
330ト依存部に対して,1ミリ秒以下にするという制約を課すことにする
331【ASPD1021】.
332
333(2-2) システム時刻の調整によりシステム時刻を戻した
334
335システム時刻を調整するサービスコール(adj_tim)によりシステム時刻を戻す
336と,登録されているタイムイベントの発生時刻が,(現在時刻+TMAX_RELTIM)よ
337り後になる可能性がある.これに関しては,adj_timの1回の呼出しで戻せる時
338間範囲が最大1秒に制限されている[NGKI3561][NGKI3584]ことに加えて,現
339在のシステム時刻が,システム時刻が最も進んでいた時のシステム時刻より1秒
340以上戻っている場合には,システム時刻をそれ以上戻せない[NGKI3589]こと
341としている.そのため,システム時刻を戻したことにより,登録されているタ
342イムイベントの発生時刻が(現在時刻+TMAX_RELTIM)より後になる最大幅
343は,2
344秒以下である.
345
346●イベント時刻の比較方法
347
348イベント時刻を32ビットで表現すると,周回することは避けられない.イベン
349ト時刻が周回する(UINT32_MAXを超
350える)と,イベント時刻は0に戻るため,イ
351ベント時刻の前後関係を,イベント時刻の単純な大小関係で判定することがで
352きなくなる.
353
354イベント時刻が周回した場合でも,イベント時刻の前後関係を判定できるよう
355にするために,周回する前のイベント時刻(値としては大きい)と周回後のイ
356ベント時刻(値としては小さい)の境界を示す値を,グローバル変数で管理す
357る【ASPD1008】.これを,境界イベント時刻と呼ぶ.イベント時刻の前後関係
358は,比較対象のイベント時刻から境界イベント時刻を引いた値(オーバフロー
359は無視する)の大小関係で判定する【ASPD1009】.
360
361前後関係の判定が必
362要なイベント時刻は,タイムイベントヒープに登録されて
363いるすべてのタイムイベントの発生時刻と,現在のイベント時刻である.その
364ため,直感的には,境界イベント時刻は,前述のマージンの中に設定されてい
365ればよい.å…
366·ä½“的には,境界イベント時刻は,現在時刻から(1-1)の最大幅
367を引
368いたイベント時刻と,(現在時刻+TMAX_RELTIM)に(2-1)と(2-2)の最大幅
369を加え
370たイベント時刻の間(イベント時刻は循環しているため,2つの「間」があるが,
371マージンとなっている方の間)に設定されていればよい.
372
373前述のマージンから,(1-1)(2-1)(2-2)の最大幅
374を引くと,約290秒のマージン
375が残る.境界イベント時刻は,この間のどこに置いても良いが,(1-1)の最大幅
376
377はアプリケーションの設計が悪いと超
378えてしまう可能性があるため,これが超
379
380えた場合のロバスト性を考æ…
381®ã—て,現在のイベント時刻の200秒前に設定するこ
382ととする【ASPD1010】.
383
384●現在時刻の算出
385
386イベント時刻と,高分解能タイマのカウント値(以下,単にカウント値と呼ぶ)
387の対応を管理するために,現在時刻を算出する度に,算出した時点でのカウン
388ト値とイベント時刻を,グローバル変数に保存する【ASPD1012】.すなわち,
389それらのグローバル変数には,現在時刻を前回に算出した時点でのカウント値
390とイベント時刻を保持している.
391
392現在時刻(現在のイベント時刻)を必
393要とする場合には,次の処理を行う.ま
394ず,高分解能タイマから,現在のカウント値を読み出す【ASPD1013】.読み出
395したカウント値と前回のカウント値の差から,イベント時刻がどれだけ進んだ
396かを求める【ASPD1014】.その値を,前回のイベント時刻に加えて,現在のイ
397ベント時刻を算出する【ASPD1015】.算出したイベント時刻は,読み出した現
398在のカウント値とともに,グローバル変数に格納する【ASPD1016】.さらに,
399境界イベント時刻を更新する【ASPD1011】.
400
401なお,最後に現在時刻を算出した時点でのイベント時刻は,カーネルの初期化
402時に0に初期化する【ASPD1047】.また,境界イベント時刻も,それに合わせて
403初期化する【ASPD1048】.
404
405●高分解能タイマ割込みの発生タイミングの設定
406
407前述したように,高分解能タイマからの割込みの発生タイミングは,タイムイ
408ベントヒープのå…
409ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã®ç™ºç”Ÿæ™‚刻に設定するのが基本である
410[ASPD1002].
411
412ただし,高分解能タイマのタイマ周期が,APIで指定できる最大相対時間よりも
413短い場合には,上のような設定ができない場合がある.å…
414·ä½“的には,å…
415ˆé ­ã®ã‚¿
416イムイベントの発生時刻までの時間が,高分解能タイマのタイマ周期よりも長
417い場合に,å…
418ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã®ç™ºç”Ÿæ™‚刻に割込みを発生するように設定で
419きない.この場合,タイマ周期が経過する以前にダミーの割込みを発生させ,
420時刻を更新する処理を行う【ASPD1003】.不必
421要なタイミングで割込みが発生
422することになるが,タイマ周期が経過する以前に時刻を更新する処理を行わな
423いと,高分解能タイマが周回したかがわからなくなるため,やむをえない.
424
425ここで,ダミーの割込みを発生させるタイミングが問題になる.タイマ周期が
426経過する直前に割込みがかかるように設定した場合,何らかの理由で割込み処
427理が遅
428延すると,割込みハンドラ内
429で高分解能タイマを読んだ時点でタイマが
430周回している可能性があり,タイマが周回したことを見落とす可能性がある.
431そこで,ダミーの割込みを発生させるまでの時間は,タイマ周期からタイマ割
432込みの最大遅
433延時間を引いた時間よりも短い時間に設定しなければならない
434【ASPD1004】.ダミーの割込みを発生させるまでの時間は,ターゲット依存に
435定めることとする【ASPD1005】.
436
437同じ理由で,タイムイベントヒープのå…
438ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã®ç™ºç”Ÿã¾ã§ã®æ™‚é–“
439が,ダミーの割込みを発生させるまでの時間よりも長い場合には,ダミーの割
440込みを発生させるまでの時間が経過したタイミングで割込みを発生させ,時刻
441を更新する処理を行う【ASPD1006】.ダミーの割込みを発生させるまでの時間
442はタイマ周期よりも短く設定されることから,この処理により[ASPD1003]も
443実現される.
444
445さらに,タイムイベントヒープが空の場合にも,ダミーの割込みを発生させる
446までの時間が経過したタイミングで割込みを発生させ,時刻を更新する処理を
447行う【ASPD1007】.
448
449システム時刻を調整した場合や,何らかの理由で割込み処理が遅
450延した場合に
451は,高分解能タイマの割込み発生タイミングを設定しようとした時点で,å…
452ˆé ­
453のタイムイベントの発生時刻を過ぎている可能性がある.このような場合には,
454タイマ割込みをすぐに発生させる【ASPD1017】.
455
456●高分解能タイマ割込みの処理
457
458高分解能タイマ割込みが発生すると,まず,前述の方法で現在時刻を算出する
459【ASPD1022】.次に,タイムイベントヒープ中のタイムイベントの中で,発生
460時刻が現在時刻以前のものを,以下の手順で処理する.
461
462タイムイベントヒープが空でない場合には,å…
463ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã®ç™ºç”Ÿæ™‚刻
464と現在時刻を比較し,発生時刻が現在時刻以前である場合には,そのタイムイ
465ベントをタイムイベントヒープから削除し,タイムイベントを処理する
466【ASPD1018】.これを,タイムイベントヒープが空になるか,å…
467ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤
468ベントの発生時刻が現在時刻以前でなくなるまで繰り返す【ASPD1019】.
469
470[ASPD1019]の繰り返しの間に,タイムイベントを1つ以上処理していた場合に
471は,その間に時間が経過していると考えられるため,再度,前述の方法で現在
472時刻を算出し,前の段落に記述した処理を行う【ASPD1020】.
473
474タイムイベントを1つも処理せずに[ASPD1019]の繰り返しを終えた場合には,
475前述の方法で高分解能タイマ割込みの発生タイミングを設定し,割込み処理を
476終える【ASPD1025】.
477
478●相対時間指定によるタイムイベントの登録
479
480相対時間を指定してタイムイベントを登録する場合には,現在時刻を遅
481い方に
482丸めた時刻に,指定された相対時間を加えて,タイムイベントの発生時刻を求
483める【ASPD1026】.
484
485現在時刻を遅
486い方に丸めるのは,[NGKI0046]により,タイムイベントの処理
487を行うまでの時間を,相対時間によって指定した以上としなければならないた
488めである.それに対して,前述の方法で現在時刻を算出すると,現在時刻を早
489い方に丸めた時刻が求まる.そこで,前述の方法で算出した現在時刻に,高分
490解能タイマの進み幅
491(これを,TSTEP_HRTCNTと書く)を加えて,現在時刻を遅
492
493い方に丸めた時刻とする【ASPD1027】.
494
495以上の処理の後,タイムイベントをタイムイベントヒープに挿å…
496¥ã™ã‚‹
497【ASPD1030】.登録したタイムイベントが,å…
498ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã«ãªã£ãŸå ´
499合には,前述の方法で高分解能タイマ割込みの発生タイミングを設定する
500【ASPD1031】.
501
502ただし,高分解能タイマ割込みの処理の途中でタイムイベントが登録される場
503合には,タイマ割込み処理を終える前に高分解能タイマ割込みの発生タイミン
504グが設定されるため,ここで設定する必
505要はない.これを実現するために,高
506分解能タイマ割込みの処理中であることを示すフラグをグローバル変数に用意
507し【ASPD1032】,このフラグがセットされている場合には,高分解能タイマ割
508込みの発生タイミングの設定を行わない【ASPD1034】.なお,このフラグは,
509システムの初期化時にクリアし,高分解能タイマ割込みの処理のå…
510¥å£ã§ã‚»ãƒƒãƒˆ
511し,出口でクリアする【ASPD1033】.
512
513●周期ハンドラのタイムイベントの登録
514
515ASP3カーネルでは,TA_PHS属性の周期ハンドラをサポートしない[ASPS0172]
516ため,周期ハンドラを動作開始する時刻が,周期ハンドラを起動する時刻の基
517準時刻となる[NGKI2372].
518
519周期ハンドラの初回の起動時刻は,周期ハンドラを動作開始する時刻から,周
520期ハンドラの起動位相後である[NGKI2365].周期ハンドラを起動するタイム
521イベントを登録する処理の内
522容は,周期ハンドラを静的APIにより動作開始する
523場合と,サービスコールにより動作開始する場合で異なる.
524
525周期ハンドラを静的APIにより動作開始する場合には,カーネルの初期化処理で,
526タイムイベントを登録する.この時点ではシステム時刻は0であるため,周期ハ
527ンドラを動作開始する時刻は0ということになり,起動位相を発生時刻として,
528タイムイベントをタイムイベントヒープに挿å…
529¥ã™ã‚‹ã€ASPD1035】.起動位相と
530して指定できる時間は0以上TMAX_RELTIM以下であるため[NGKI2399],タイム
531イベントの発生時刻は,現在時刻以降,(現在時刻+TMAX_RELTIM)以前という範
532囲に収まる.周期ハンドラの動作開始の有無にかかわらず,カーネルの初期化
533処理の最後で,高分解能タイマ割込みの発生タイミングを設定する必
534要がある
535ため,タイムイベントを登録する時点では,高分解能タイマ割込みの発生タイ
536ミングは設定しない.
537
538周期ハンドラをサービスコールにより動作開始する場合には,現在時刻を基準
539時刻,起動位相を相対時間としてタイムイベントを登録すればよいため,すで
540に検討したタイムイベントの発生時刻を相対時間で指定する場合と同様である
541【ASPD1036】.
542
543周期ハンドラの2回目以降の起動時刻は,前回の起動時刻から,周期ハンドラの
544起動周期後である[NGKI2365].そのためのタイムイベントの登録処理は,高
545分解能タイマ割込みの処理から呼び出される周期ハンドラ起動ルーチンの中で,
546周期ハンドラを呼び出す前に,周期ハンドラを次回起動するためのタイムイベ
547ントを登録する形で行う【ASPD1037】.登録するタイムイベントの発生時刻は,
548周期ハンドラの今回の起動時刻に起動周期を加えた時刻とする【ASPD1038】.
549
550周期ハンドラ起動ルーチンが呼ばれた時点で,周期ハンドラを今回起動するタ
551イムイベントは,直前まで,タイムイベントヒープのå…
552ˆé ­ã«ã‚ったタイムイベ
553ントである.また,起動周期として指定できる時間は0より大きくTMAX_RELTIM
554以下であることから[NGKI2397],登録するタイムイベントの発生時刻は,直
555前までå…
556ˆé ­ã«ã‚ったタイムイベントの発生時刻より後で,(直前までå…
557ˆé ­ã«ã‚っ
558たタイムイベントの発生時刻+TMAX_RELTIM)以前という範囲に収まる.タイム
559イベントの処理が2秒以上遅
560れる状況では,カーネルの動作は保証されないもの
561としている[NGKI3608]ことから,直前までå…
562ˆé ­ã«ã‚ったタイムイベントの発
563生時刻が,現在時刻より前になる最大幅
564は2秒と考えてよく,既に検討した
565(1-1)の最大幅
566の範囲内
567である.
568
569タイムイベントを登録する周期ハンドラ起動ルーチンは,高分解能タイマ割込
570みの処理から呼び出されるため,ここで高分解能タイマ割込みの発生タイミン
571グを設定する必
572要はない.
573
574●タイムイベントの登録解除
575
576タイムイベントの登録を解除する場合には,タイムイベントをタイムイベント
577ヒープから削除する【ASPD1039】.
578
579高分解能タイマ割込みの処理の途中でタイムイベントが登録解除される場合で
580なく,削除したタイムイベントがå…
581ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã§ã‚った場合には,前
582述の方法で高分解能タイマ割込みの発生タイミングを設定する【ASPD1040】.
583
584●タイムイベントが発生するまでの時間の計算
585
586タイムイベントが発生するまでの時間を計算する場合には,タイムイベントの
587発生時刻から,現在時刻を遅
588い方に丸めた時刻を引くことによって求める
589【ASPD1049】.現在時刻を遅
590い方に丸めた時刻は,[ASPD1027]の方法で求め
591る【ASPD1050】.
592
593現在時刻を遅
594い方に丸めるのは,[NGKI0050]により,タイムイベントが発生
595する時刻を相対時間で返す場合には,タイムイベントが処理されるのは,基準
596時刻から相対時間として返された以上の時間が経過した後としなければならな
597いためである.ここでの基準時刻は,相対時間を返すサービスコールを呼び出
598した時刻(言い換えると現在時刻)である[NGKI0049].
599
600ただし,タイムイベントの発生時刻が,現在時刻以前である場合には,タイム
601イベントまでの残り時間として0を返す[NGKI0552].
602
603●システム時刻の管理
604
605システム時刻を参ç…
606§ã™ã‚‹ã‚µãƒ¼ãƒ“スコール(get_tim)は,システム時刻が最も進
607んでいた時のシステム時刻(adj_timでシステム時刻を戻していない場合には,
608現在のシステム時刻に一致する)を返す[NGKI3591].これを実現するために,
609システム時刻が最も進んでいた時のイベント時刻を,グローバル変数で管理す
610る【ASPD1041】.
611
612最も進んでいた時のイベント時刻は,カーネルの初期化時に0に初期化し
613【ASPD1046】,現在のイベント時刻を進める度に更新する.å…
614·ä½“的には,最も
615進んでいた時のイベント時刻と進める前の現在のイベント時刻の差が,現在の
616イベント時刻の進み分よりも小さい場合には,最も進んでいた時のイベント時
617刻を,進めた後の現在のイベント時刻に一致させる【ASPD1042】.
618
619システム時刻とイベント時刻は,同じ速度で進むため,システム時刻を設定し
620ない間は,その差は一定である.その差を管理するために,get_timで参ç…
621§ã™ã‚‹
622するシステム時刻(64ビットの符号無し整数型.ただし,64ビットの整数型が
623サポートされていないターゲットでは32ビットの符号無し整数型[NGKI0548])
624と,最も進んでいた時のイベント時刻(32ビットの符号無し整数型)の差を,
625グローバル変数で管理する【ASPD1043】.この差を,システム時刻のオフセッ
626トと呼ぶ.
627
628カーネルの初期化時には,システム時刻は0に初期化され[NGKI2333],最も進
629んでいた時のイベント時刻も0に初期化される[ASPD1046]ことから,システム
630時刻のオフセットも0に初期化する【ASPD1044】.また,システム時刻が64ビッ
631トの符号無し整数型の場合には,最も進んでいた時のイベント時刻を進めた結
632果,その値が周回した時には,システム時刻のオフセットに2^32を加算する
633【ASPD1045】.
634
635●システム時刻の参ç…
636§ã¨è¨­å®š
637
638システム時刻の参ç…
639§ï¼ˆget_tim)の処理本体(排他制御の内
640側の処理)では,ま
641ず,前述の方法で現在時刻を算出・更新し,それに伴って,最も進んでいた時
642のイベント時刻も更新する【ASPD1057】.その後,最も進んでいた時のイベン
643ト時刻にシステム時刻のオフセットを加えることで,最も進んでいた時のシス
644テム時刻を求め,指定されたメモリ領域に返す【ASPD1058】.
645
646システム時刻の設定(set_tim)の処理本体(排他制御の内
647側の処理)では,ま
648ず,前述の方法で現在時刻を算出・更新し,それに伴って,最も進んでいた時
649のイベント時刻も更新する【ASPD1059】.その後,指定されたシステム時刻と
650最も進んでいた時のイベント時刻の差を求め,システム時刻のオフセットに格
651納する【ASPD1060】.
652
653ï¼»NGKI3592]で変化しないことが要求されている「get_timで参ç…
654§ã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ 
655時刻の進みが止まっている時間」は,最も進んでいた時のイベント時刻と現在
656のイベント時刻の差で実現されている.上記のset_timの処理手順では,現在時
657刻と最も進んでいた時のイベント時刻を,サービスコールが呼び出された時点
658の状æ…
659‹ã«æ›´æ–°ã™ã‚‹ä»¥å¤–には,最も進んでいた時のイベント時刻と現在のイベン
660ト時刻の差を変更することはない.そのため,上の処理手順で[NGKI3592]の
661要求を満たしている.
662
663●システム時刻の調整
664
665システム時刻の調整(adj_tim)の処理本体(排他制御の内
666側の処理)は,以下
667の手順で行う.
668
669まず,前述の方法で現在時刻を算出する【ASPD1051】.次に,E_OBJエラーの
670チェックを行う【ASPD1052】.E_OBJエラーのチェックの内
671容は,システム時刻
672を進める場合と遅
673らせる場合で異なる.システム時刻を進める場合には,タイ
674ムイベントヒープが空でなく,å…
675ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã®ç™ºç”Ÿæ™‚刻が現在時刻よ
676りも1秒以上前である場合に,E_OBJエラーとする[NGKI3588].システム時刻
677を遅
678らせる場合には,最も進んでいた時のイベント時刻と現在のイベント時刻
679との差が1秒以上の場合に,E_OBJエラーとする[NGKI3589].
680
681E_OBJエラーでない場合には,現在のイベント時刻に,指定された調整量を加え
682る【ASPD1053】.これにより,システム時刻の現在値に指定された調整量を加
683えられ[NGKI3586],タイムイベントが発生するまでの相対時間も調整される
684[NGKI3587].また,境界イベント時刻を更新する【ASPD1055】.
685
686ここで,イベント時刻を進める場合には,[ASPD1042]と同じ方法で,最も進
687んでいた時のイベント時刻も更新する【ASPD1054】.
688
689最後に,前述の方法で高分解能タイマ割込みの発生タイミングを設定する
690【ASPD1056】.
691
692●カーネルの初期化時の処理
693
694カーネルの初期化時には,タイムイベント管理モジュールの初期化処理におい
695て,最後に現在時刻を算出した時点でのイベント時刻,境界イベント時刻,最
696も進んでいた時のイベント時刻,高分解能タイマ割込みの処理中であることを
697示すフラグを初期化し,タイムイベントヒープを空に初期化する【ASPD1061】.
698
699その後に呼び出される周期ハンドラ機能の初期化処理において,静的APIにより
700動作開始する周期ハンドラの,初回の起動のためのタイムイベントを登録する
701【ASPD1062】.
702
703カーネルの初期化処理の最後(カーネル動作を開始する直前)に,高分解能タ
704イマの現在のカウント値を読み出し,その値で,最後に現在時刻を算出した時
705点でのカウント値を初期化する【ASPD1063】.最後に,前述の方法で,高分解
706能タイマ割込みの発生タイミングを設定する【ASPD1064】.
707
708●高分解能タイマモジュール(ターゲット依存部)の仕様
709
710★
711未完成
712
713○トレーサビリティ
714
715●ASPD1001に関する補足説明
716
717ASPD1001(タイムイベントの発生時刻を,カーネル内
718部では32ビットで扱う)
719は,すり合わせ設計の結果である.å…
720·ä½“的には,外部仕様の多くの要求に依存
721して決定されていることに加えて,これに依存して他の多くの設計が出てきて
722いる.つまり,外部仕様と設計が多対多に関係している中で,ASPD1001がハブ
723になっている.
724
725また,ASPD1001から外部仕様に対する制限事項
726が抽出されているという意味で
727も,すり合わせ設計になっている.この関係を素直に表現すると,設計から外
728部仕様に対してリンクがあることになるが,このような逆関係は避けるべきと
729考えたため,外部仕様から設計へのリンクとして表現している.これに該当す
730るリンクは,下のトレーサビリティ一覧で"#"をつけて区別した.また,外部仕
731様書の仕様決定の理由に,これらの制限事項
732が,実装
733を考æ…
734®ã—たものである旨
735を記述している.
736
737●設計項
738目に対する上位要求からのトレーサビリティ
739
740ASPD1001:(a*) ←ASPR0006,NGKI0548,NGKI0041,NGKI0042,
741 NGKI0549,NGKI0550#,NGKI0553,NGKI0554,
742 NGKI3608#,NGKI3561#,NGKI3584#,NGKI3588#,
743 NGKI3589,NGKI2372,NGKI2373,ASPS0172,
744 NGKI2365,NGKI2397,NGKI2399
745ASPD1002:(a*) ←ASPR0011
746ASPD1003:(b*)(e:ASPD1002)
747ASPD1004:(d)
748ASPD1005:(d)
749ASPD1006:(a*)(e:ASPD1002) ←ASPD1003
750ASPD1007:(a*)
751ASPD1008:(a*) ←ASPD1001
752ASPD1009:(a*) ←ASPD1001
753ASPD1010:(ab*) ←ASPD1001
754ASPD1011:(a*) ←ASPD1016,ASPD1010
755ASPD1012:(a*) ←NGKI3559,ASPR0011
756ASPD1013:(a*) ←NGKI3559
757ASPD1014:(a*) ←NGKI3559
758ASPD1015:(a*) ←NGKI3559
759ASPD1016:(a*) ←ASPD1012
760ASPD1017:(a*)(e:ASPD1002)
761ASPD1018:(a*)
762ASPD1019:(a*)
763ASPD1020:(a*)
764ASPD1021:(d)
765ASPD1022:(a*)
766ASPD1023:欠番
767ASPD1024:欠番
768ASPD1025:(a*)
769ASPD1026:(a*)
770ASPD1027:(a*) ⇒ASPD1050
771ASPD1028:欠番
772ASPD1029:欠番
773ASPD1030:(a*)
774ASPD1031:(a*)
775ASPD1032:(a*)
776ASPD1033:(a*)
777ASPD1034:(a*)
778ASPD1035:(a*)
779ASPD1036:(a*)
780ASPD1037:(a*)
781ASPD1038:(a*)
782ASPD1039:(a*)
783ASPD1040:(a*)
784ASPD1041:(a*) ←NGKI3591
785ASPD1042:(a*) ←ASPD1041
786ASPD1043:(a*)
787ASPD1044:(a*)
788ASPD1045:(a*)
789ASPD1046:(a*) ←ASPD1041
790ASPD1047:(a*)
791ASPD1048:(a*) ←ASPD1010
792ASPD1049:(a*) ←NGKI0049,NGKI0050
793ASPD1050:(a*) ←ASPD1027
794ASPD1051:(a*)
795ASPD1052:(a*)
796ASPD1053:(a*) ←NGKI3586,NGKI3587
797ASPD1054:(a*)
798ASPD1055:(a*) ←ASPD1010
799ASPD1056:(a*)
800ASPD1057:(a*) ←NGKI2354,NGKI3591
801ASPD1058:(a*) ←NGKI2354,NGKI3591
802ASPD1059:(a*) ←NGKI3567,NGKI3592
803ASPD1060:(a*) ←NGKI3567,NGKI3592
804ASPD1061:(a*)
805ASPD1062:(a*)
806ASPD1063:(a*)
807ASPD1064:(a*)
808
809以上
Note: See TracBrowser for help on using the repository browser.