Changeset 167 for UsbWattMeter/trunk/asp_dcre/kernel/time_event.c
- Timestamp:
- Mar 8, 2016, 8:37:45 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
UsbWattMeter/trunk/asp_dcre/kernel/time_event.c
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc; charset=SHIFT_JIS
r164 r167 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * 11 * ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 12 * Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 13 * ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 14 * (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 15 * \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[ 16 * XR[hÉÜÜêĢ鱯D 17 * (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 18 * pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 19 gip 20 * Ò}j 21 AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL 22 * Ì³ÛØKèðfÚ·é±ÆD 23 * (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 24 * pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 25 * ÆD 26 * (a) Äzzɺ¤hL 27 gipÒ}j 28 AÈÇjÉCãLÌ 29 * ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD 30 * (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 31 * ñ·é±ÆD 32 * (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 33 * Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 34 * ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 35 * RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 36 * ÆÓ·é±ÆD 11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 16 * スコード中に含まれていること. 17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 20 * の無保証規定を掲載すること. 21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 23 * と. 24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 25 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 27 * 報告すること. 28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 32 * 免責すること. 37 33 * 38 * {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨39 * æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI40 * ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF41 * AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»42 * ÌÓCðíÈ¢D34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 38 * の責任を負わない. 43 39 * 44 40 * $Id$ … … 46 42 47 43 /* 48 * ^CCxgÇW 49 [ 44 * タイムイベント管理モジュール 50 45 */ 51 46 … … 54 49 55 50 /* 56 * ^CCxgq[vì}N57 */ 58 #define PARENT(index) ((index) >> 1) /* em[hðßé*/59 #define LCHILD(index) ((index) << 1) /* ¶Ìqm[hðßé*/51 * タイムイベントヒープ操作マクロ 52 */ 53 #define PARENT(index) ((index) >> 1) /* 親ノードを求める */ 54 #define LCHILD(index) ((index) << 1) /* 左の子ノードを求める */ 60 55 #define TMEVT_NODE(index) (tmevt_heap[(index) - 1]) 61 56 62 57 /* 63 * Cxg¶är}N64 * 65 * Cxg¶ÍCmin_time©çÌÎlÅär·éD·Èí¿C66 * min_time ðŬliÅàߢjCmit_time-1ªÅåliÅà¢j67 * ÆÝȵÄär·éD58 * イベント発生時刻比較マクロ 59 * 60 * イベント発生時刻は,min_timeからの相対値で比較する.すなわち, 61 * min_timeを最小値(最も近い時刻),mit_time-1が最大値(最も遠い時刻) 62 * とみなして比較する. 68 63 */ 69 64 #define EVTTIM_LT(t1, t2) (((t1) - min_time) < ((t2) - min_time)) … … 73 68 74 69 /* 75 * »ÝÌVXeiPÊ: 1~bj76 * 77 * µ§ÉÍCOÌ^CeBbNÌVXeD70 * 現在のシステム時刻(単位: 1ミリ秒) 71 * 72 * 厳密には,前のタイムティックのシステム時刻. 78 73 */ 79 74 EVTTIM current_time; 80 75 81 76 /* 82 * ^CCxgq[vÅLøÈŬÌVXeiPÊ: 1~bj77 * タイムイベントヒープ中で有効な最小のシステム時刻(単位: 1ミリ秒) 83 78 */ 84 79 EVTTIM min_time; 85 80 86 81 /* 87 * Ì^CeBbNÌVXeiPÊ: 1~bj82 * 次のタイムティックのシステム時刻(単位: 1ミリ秒) 88 83 */ 89 84 EVTTIM next_time; 90 85 91 86 /* 92 * VXeÏZpÏiPÊ: 1/TIC_DENO~bj87 * システム時刻積算用変数(単位: 1/TIC_DENOミリ秒) 93 88 */ 94 89 #if TIC_DENO != 1U … … 97 92 98 93 /* 99 * ^CCxgq[vÌÅãÌgpÌæÌCfbNX94 * タイムイベントヒープの最後の使用領域のインデックス 100 95 */ 101 96 uint_t last_index; 102 97 103 98 /* 104 * ^C}W 105 [Ìú» 99 * タイマモジュールの初期化 106 100 */ 107 101 void … … 120 114 121 115 /* 122 * ^CCxgÌ}üÊuðãü«ÉTõ123 * 124 * timeɶ·é^CCxgð}ü·ém[hðó¯é½ßÉC125 * q[vÌãÉü©ÁÄóm[hðÚ®³¹éDÚ®OÌóm[hÌÊuð126 * index Én·ÆCÚ®ãÌóm[hÌÊui·Èí¿}üÊujðÔ·D116 * タイムイベントの挿入位置を上向きに探索 117 * 118 * 時刻timeに発生するタイムイベントを挿入するノードを空けるために, 119 * ヒープの上に向かって空ノードを移動させる.移動前の空ノードの位置を 120 * indexに渡すと,移動後の空ノードの位置(すなわち挿入位置)を返す. 127 121 */ 128 122 #ifdef TOPPERS_tmeup … … 135 129 while (index > 1) { 136 130 /* 137 * em[hÌCxg¶Ìûª¢iܽͯ¶jÈçÎC138 * index ª}üÊuÈÌÅ[vð²¯éD131 * 親ノードのイベント発生時刻の方が早い(または同じ)ならば, 132 * indexが挿入位置なのでループを抜ける. 139 133 */ 140 134 parent = PARENT(index); … … 144 138 145 139 /* 146 * em[hðindexÌÊuÉÚ®³¹éD140 * 親ノードをindexの位置に移動させる. 147 141 */ 148 142 TMEVT_NODE(index) = TMEVT_NODE(parent); … … 150 144 151 145 /* 152 * index ðem[hÌÊuÉXVD146 * indexを親ノードの位置に更新. 153 147 */ 154 148 index = parent; … … 160 154 161 155 /* 162 * ^CCxgÌ}üÊuðºü«ÉTõ163 * 164 * timeɶ·é^CCxgð}ü·ém[hðó¯é½ßÉC165 * q[v̺Éü©ÁÄóm[hðÚ®³¹éDÚ®OÌóm[hÌÊuð166 * index Én·ÆCÚ®ãÌóm[hÌÊui·Èí¿}üÊujðÔ·D156 * タイムイベントの挿入位置を下向きに探索 157 * 158 * 時刻timeに発生するタイムイベントを挿入するノードを空けるために, 159 * ヒープの下に向かって空ノードを移動させる.移動前の空ノードの位置を 160 * indexに渡すと,移動後の空ノードの位置(すなわち挿入位置)を返す. 167 161 */ 168 162 #ifdef TOPPERS_tmedown … … 175 169 while ((child = LCHILD(index)) <= last_index) { 176 170 /* 177 * ¶EÌqm[hÌCxg¶ðärµC¢ûÌqm[h178 * ÌÊuðchildÉÝè·éDȺÌqm[hÍC±±ÅIÎê½û179 * Ìqm[ẖÆD171 * 左右の子ノードのイベント発生時刻を比較し,早い方の子ノード 172 * の位置をchildに設定する.以下の子ノードは,ここで選ばれた方 173 * の子ノードのこと. 180 174 */ 181 175 if (child + 1 <= last_index … … 186 180 187 181 /* 188 * qm[hÌCxg¶Ìûªx¢iܽͯ¶jÈçÎC189 * index ª}üÊuÈÌÅ[vð²¯éD182 * 子ノードのイベント発生時刻の方が遅い(または同じ)ならば, 183 * indexが挿入位置なのでループを抜ける. 190 184 */ 191 185 if (EVTTIM_LE(time, TMEVT_NODE(child).time)) { … … 194 188 195 189 /* 196 * qm[hðindexÌÊuÉÚ®³¹éD190 * 子ノードをindexの位置に移動させる. 197 191 */ 198 192 TMEVT_NODE(index) = TMEVT_NODE(child); … … 200 194 201 195 /* 202 * index ðqm[hÌÊuÉXVD196 * indexを子ノードの位置に更新. 203 197 */ 204 198 index = child; … … 210 204 211 205 /* 212 * ^CCxgq[vÖÌo^213 * 214 * p_tmevtb Åwèµ½^CCxgubNðCtimeÅwèµ½Ôªo215 * ßãÉCxgª¶·éæ¤ÉC^CCxgq[vÉo^·éD206 * タイムイベントヒープへの登録 207 * 208 * p_tmevtbで指定したタイムイベントブロックを,timeで指定した時間が経 209 * 過後にイベントが発生するように,タイムイベントヒープに登録する. 216 210 */ 217 211 #ifdef TOPPERS_tmeins … … 223 217 224 218 /* 225 * last_index ðCNgµC»±©çãÉ}üÊuðT·D219 * last_indexをインクリメントし,そこから上に挿入位置を探す. 226 220 */ 227 221 index = tmevt_up(++last_index, time); 228 222 229 223 /* 230 * ^CCxgðindexÌÊuÉ}ü·éD224 * タイムイベントをindexの位置に挿入する. 231 225 */ 232 226 TMEVT_NODE(index).time = time; … … 238 232 239 233 /* 240 * ^CCxgq[v©çÌí234 * タイムイベントヒープからの削除 241 235 */ 242 236 #ifdef TOPPERS_tmedel … … 250 244 251 245 /* 252 * íÉæè^CCxgq[vªóÉÈéêͽàµÈ¢D246 * 削除によりタイムイベントヒープが空になる場合は何もしない. 253 247 */ 254 248 if (--last_index == 0) { … … 257 251 258 252 /* 259 * íµ½m[hÌÊuÉÅãÌm[hilast_index+1ÌÊuÌm[hj260 * ð}üµC»êðKØÈÊuÖÚ®³¹éDÀÛÉÍCÅãÌm[h261 * ðÀÛÉ}ü·éÌÅÍÈCíµ½m[hÌÊuªóm[hÉÈ262 * éÌÅCÅãÌm[hð}ü·×«ÊuÖü¯Äóm[hðÚ®³¹263 * éD264 * ÅãÌm[hÌCxg¶ªCíµ½m[hÌem[hÌC265 * xg¶æèOÌêÉÍCãÉü©ÁÄ}üÊuðT·D»266 * ¤ÅÈ¢êÉÍCºÉü©ÁÄT·D253 * 削除したノードの位置に最後のノード(last_index+1の位置のノード) 254 * を挿入し,それを適切な位置へ移動させる.実際には,最後のノード 255 * を実際に挿入するのではなく,削除したノードの位置が空ノードにな 256 * るので,最後のノードを挿入すべき位置へ向けて空ノードを移動させ 257 * る. 258 * 最後のノードのイベント発生時刻が,削除したノードの親ノードのイ 259 * ベント発生時刻より前の場合には,上に向かって挿入位置を探す.そ 260 * うでない場合には,下に向かって探す. 267 261 */ 268 262 if (index > 1 && EVTTIM_LT(event_time, 269 263 TMEVT_NODE(parent = PARENT(index)).time)) { 270 264 /* 271 * em[hðindexÌÊuÉÚ®³¹éD265 * 親ノードをindexの位置に移動させる. 272 266 */ 273 267 TMEVT_NODE(index) = TMEVT_NODE(parent); … … 275 269 276 270 /* 277 * íµ½m[hÌem[h©çãÉü©ÁÄ}üÊuðT·D271 * 削除したノードの親ノードから上に向かって挿入位置を探す. 278 272 */ 279 273 index = tmevt_up(parent, event_time); … … 281 275 else { 282 276 /* 283 * íµ½m[h©çºÉü©ÁÄ}üÊuðT·D277 * 削除したノードから下に向かって挿入位置を探す. 284 278 */ 285 279 index = tmevt_down(index, event_time); … … 287 281 288 282 /* 289 * ÅãÌm[hðindexÌÊuÉ}ü·éD283 * 最後のノードをindexの位置に挿入する. 290 284 */ 291 285 TMEVT_NODE(index) = TMEVT_NODE(last_index + 1); … … 296 290 297 291 /* 298 * ^CCxgq[vÌæªÌm[hÌí292 * タイムイベントヒープの先頭のノードの削除 299 293 */ 300 294 Inline void … … 305 299 306 300 /* 307 * íÉæè^CCxgq[vªóÉÈéêͽàµÈ¢D301 * 削除によりタイムイベントヒープが空になる場合は何もしない. 308 302 */ 309 303 if (--last_index == 0) { … … 312 306 313 307 /* 314 * [gm[hÉÅãÌm[hilast_index + 1 ÌÊuÌm[hjð315 * }üµC»êðKØÈÊuÖÚ®³¹éDÀÛÉÍCÅãÌm[hð316 * ÀÛÉ}ü·éÌÅÍÈC[gm[hªóm[hÉÈéÌÅCÅ317 * ãÌm[hð}ü·×«ÊuÖü¯Äóm[hðÚ®³¹éD308 * ルートノードに最後のノード(last_index + 1 の位置のノード)を 309 * 挿入し,それを適切な位置へ移動させる.実際には,最後のノードを 310 * 実際に挿入するのではなく,ルートノードが空ノードになるので,最 311 * 後のノードを挿入すべき位置へ向けて空ノードを移動させる. 318 312 */ 319 313 index = tmevt_down(1, event_time); 320 314 321 315 /* 322 * ÅãÌm[hðindexÌÊuÉ}ü·éD316 * 最後のノードをindexの位置に挿入する. 323 317 */ 324 318 TMEVT_NODE(index) = TMEVT_NODE(last_index + 1); … … 327 321 328 322 /* 329 * ^CCxgÜÅÌcèÔÌvZ323 * タイムイベントまでの残り時間の計算 330 324 */ 331 325 #ifdef TOPPERS_tmeltim … … 339 333 if (EVTTIM_LE(time, next_time)) { 340 334 /* 341 * Ì^CeBbNųêéêÉÍ0ðÔ·D335 * 次のタイムティックで処理される場合には0を返す. 342 336 */ 343 337 return(0U); … … 351 345 352 346 /* 353 * ^CeBbNÌ347 * タイムティックの供給 354 348 */ 355 349 #ifdef TOPPERS_sigtim … … 366 360 367 361 /* 368 * current_time ðXV·éD362 * current_timeを更新する. 369 363 */ 370 364 current_time = next_time; 371 365 372 366 /* 373 * next_time Cnext_subtimeðXV·éD367 * next_time,next_subtimeを更新する. 374 368 */ 375 369 #if TIC_DENO == 1U … … 385 379 386 380 /* 387 * current_time æèCxg¶Ì¢iܽͯ¶j^CCx388 * gðC^CCxgq[v©çíµCR[obNÖðÄÑ389 * o·D381 * current_timeよりイベント発生時刻の早い(または同じ)タイムイベ 382 * ントを,タイムイベントヒープから削除し,コールバック関数を呼び 383 * 出す. 390 384 */ 391 385 while (last_index > 0 && EVTTIM_LE(TMEVT_NODE(1).time, current_time)) { … … 396 390 397 391 /* 398 * min_time ðXV·éD392 * min_timeを更新する. 399 393 */ 400 394 min_time = current_time; -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.