Changeset 389 for azure_iot_hub/trunk/asp3_dcre/kernel/time_event.c
- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/kernel/time_event.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r388 r389 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * 11 * ä¸è¨èä½æ¨©è 12 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 13 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 14 * å¤ã»åé 15 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 16 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 17 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 18 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 19 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 20 * ç¨ã§ããå½¢ã§åé 21 å¸ããå ´åã«ã¯ï¼åé 22 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 23 * è 24 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 25 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 26 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 27 * ç¨ã§ããªãå½¢ã§åé 28 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 29 * ã¨ï¼ 30 * (a) åé 31 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 32 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 33 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 34 * (b) åé 35 å¸ã®å½¢æ 36 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 37 * å ±åãããã¨ï¼ 38 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 39 * 害ãããï¼ä¸è¨èä½æ¨©è 40 ããã³TOPPERSããã¸ã§ã¯ããå 41 責ãããã¨ï¼ 42 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 43 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 44 ããã³TOPPERSããã¸ã§ã¯ãã 45 * å 46 責ãããã¨ï¼ 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 * 免責すること. 47 33 * 48 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 49 ã 50 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 51 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 52 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 53 * ã®è²¬ä»»ãè² ããªãï¼ 34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 38 * の責任を負わない. 54 39 * 55 40 * $Id$ … … 57 42 58 43 /* 59 * ã¿ã¤ã ã¤ãã³ã管çã¢ã¸ã¥ã¼ã«44 * タイムイベント管理モジュール 60 45 */ 61 46 … … 64 49 65 50 /* 66 * TSTEP_HRTCNT ã®ç¯å²ãã§ãã¯51 * TSTEP_HRTCNTの範囲チェック 67 52 */ 68 53 #if TSTEP_HRTCNT > 4000U … … 71 56 72 57 /* 73 * HRTCNT_BOUND ã®ç¯å²ãã§ãã¯58 * HRTCNT_BOUNDの範囲チェック 74 59 */ 75 60 #if HRTCNT_BOUND >= 4294000000U … … 84 69 85 70 /* 86 * ã¿ã¤ã ã¤ãã³ããã¼ãæä½ãã¯ã71 * タイムイベントヒープ操作マクロ 87 72 */ 88 73 #define PARENT(p_tmevtn) (tmevt_heap + (((p_tmevtn) - tmevt_heap) >> 1)) 89 /* 親ãã¼ããæ±ãã*/74 /* 親ノードを求める */ 90 75 #define LCHILD(p_tmevtn) (tmevt_heap + (((p_tmevtn) - tmevt_heap) << 1)) 91 /* å·¦ã®åãã¼ããæ±ãã */ 92 /* 93 * ã¿ã¤ã ã¤ãã³ããã¼ãä¸ã®å 94 é ã®ãã¼ã 76 /* 左の子ノードを求める */ 77 /* 78 * タイムイベントヒープ中の先頭のノード 95 79 */ 96 80 #define p_top_tmevtn (&(tmevt_heap[1])) 97 81 #define top_evttim (tmevt_heap[1].p_tmevtb->evttim) 98 /* å 99 é ã®ã¿ã¤ã ã¤ãã³ãã®çºçæå» */ 100 /* 101 * ã¿ã¤ã ã¤ãã³ããã¼ãä¸ã®æå¾ã®ãã¼ã 82 /* 先頭のタイムイベントの発生時刻 */ 83 /* 84 * タイムイベントヒープ中の最後のノード 102 85 */ 103 86 #define p_last_tmevtn (tmevt_heap[0].p_last) 104 87 105 88 /* 106 * ã¤ãã³ãæå»ã®åå¾é¢ä¿ã®å¤å®ï¼»ASPD1009ï¼½89 * イベント時刻の前後関係の判定[ASPD1009] 107 90 * 108 * ã¤ãã³ãæå»ã¯ï¼boundary_evttimããã®ç¸å¯¾å¤ã§æ¯è¼ããï¼ããªãã¡ï¼ 109 * boundary_evttimãæãæ©ãæå»ï¼boundary_evttim-1ãæãé 110 ãæå»ã¨ã¿ 111 * ãªãã¦æ¯è¼ããï¼ 91 * イベント時刻は,boundary_evttimからの相対値で比較する.すなわち, 92 * boundary_evttimを最も早い時刻,boundary_evttim-1が最も遅い時刻とみ 93 * なして比較する. 112 94 */ 113 95 #define EVTTIM_ADVANCE(t) ((t) - boundary_evttim) … … 118 100 119 101 /* 120 * å¢çã¤ãã³ãæå»ï¼»ASPD1008ï¼½102 * 境界イベント時刻[ASPD1008] 121 103 */ 122 104 EVTTIM boundary_evttim; 123 105 124 106 /* 125 * æå¾ã«ç¾å¨æå»ãç®åºããæç¹ã§ã®ã¤ãã³ãæå»ï¼»ASPD1012ï¼½107 * 最後に現在時刻を算出した時点でのイベント時刻[ASPD1012] 126 108 */ 127 109 EVTTIM current_evttim; 128 110 129 111 /* 130 * æå¾ã«ç¾å¨æå»ãç®åºããæç¹ã§ã®é«å解è½ã¿ã¤ãã®ã«ã¦ã³ãå¤ï¼»ASPD1012ï¼½112 * 最後に現在時刻を算出した時点での高分解能タイマのカウント値[ASPD1012] 131 113 */ 132 114 HRTCNT current_hrtcnt; 133 115 134 116 /* 135 * æãé²ãã§ããæã®ã¤ãã³ãæå»ï¼»ASPD1041ï¼½117 * 最も進んでいた時のイベント時刻[ASPD1041] 136 118 */ 137 119 EVTTIM monotonic_evttim; 138 120 139 121 /* 140 * ã·ã¹ãã æå»ã®ãªãã»ããï¼»ASPD1043ï¼½122 * システム時刻のオフセット[ASPD1043] 141 123 */ 142 124 SYSTIM systim_offset; 143 125 144 126 /* 145 * é«å解è½ã¿ã¤ãå²è¾¼ã¿ã®å¦çä¸ã§ãããã¨ã示ããã©ã°ï¼»ASPD1032ï¼½127 * 高分解能タイマ割込みの処理中であることを示すフラグ[ASPD1032] 146 128 */ 147 129 bool_t in_signal_time; 148 130 149 131 /* 150 * ã¿ã¤ã ã¤ãã³ã管çã¢ã¸ã¥ã¼ã«ã®åæåï¼»ASPD1061ï¼½132 * タイムイベント管理モジュールの初期化[ASPD1061] 151 133 */ 152 134 void 153 135 initialize_tmevt(void) 154 136 { 155 current_evttim = 0U; /* ï¼»ASPD1047ï¼½*/137 current_evttim = 0U; /*[ASPD1047]*/ 156 138 boundary_evttim = current_evttim - BOUNDARY_MARGIN; 157 /* ï¼»ASPD1048ï¼½*/158 monotonic_evttim = 0U; /* ï¼»ASPD1046ï¼½*/159 systim_offset = 0U; /* ï¼»ASPD1044ï¼½*/160 in_signal_time = false; /* ï¼»ASPD1033ï¼½*/139 /*[ASPD1048]*/ 140 monotonic_evttim = 0U; /*[ASPD1046]*/ 141 systim_offset = 0U; /*[ASPD1044]*/ 142 in_signal_time = false; /*[ASPD1033]*/ 161 143 p_last_tmevtn = tmevt_heap; 162 144 } … … 165 147 166 148 /* 167 * ã¿ã¤ã ã¤ãã³ãã®æ¿å 168 ¥ä½ç½®ãä¸åãã«æ¢ç´¢ 149 * タイムイベントの挿入位置を上向きに探索 169 150 * 170 * æå»evttimã«çºçããã¿ã¤ã ã¤ãã³ããæ¿å 171 ¥ãããã¼ãã空ããããã«ï¼ 172 * ãã¼ãã®ä¸ã«åãã£ã¦ç©ºãã¼ãã移åãããï¼ç§»ååã®ç©ºãã¼ãã®ä½ç½®ã 173 * p_tmevtnã«æ¸¡ãã¨ï¼ç§»åå¾ã®ç©ºãã¼ãã®ä½ç½®ï¼ããªãã¡æ¿å 174 ¥ä½ç½®ï¼ãè¿ãï¼ 151 * 時刻evttimに発生するタイムイベントを挿入するノードを空けるために, 152 * ヒープの上に向かって空ノードを移動させる.移動前の空ノードの位置を 153 * p_tmevtnに渡すと,移動後の空ノードの位置(すなわち挿入位置)を返す. 175 154 */ 176 155 #ifdef TOPPERS_tmeup … … 183 162 while (p_tmevtn > p_top_tmevtn) { 184 163 /* 185 * 親ãã¼ãã®ã¤ãã³ãçºçæå»ã®æ¹ãæ©ãï¼ã¾ãã¯åãï¼ãªãã°ï¼ 186 * p_tmevtnãæ¿å 187 ¥ä½ç½®ãªã®ã§ã«ã¼ããæããï¼ 164 * 親ノードのイベント発生時刻の方が早い(または同じ)ならば, 165 * p_tmevtnが挿入位置なのでループを抜ける. 188 166 */ 189 167 p_parent = PARENT(p_tmevtn); … … 193 171 194 172 /* 195 * 親ãã¼ããp_tmevtnã®ä½ç½®ã«ç§»åãããï¼173 * 親ノードをp_tmevtnの位置に移動させる. 196 174 */ 197 175 *p_tmevtn = *p_parent; … … 199 177 200 178 /* 201 * p_tmevtn ã親ãã¼ãã®ä½ç½®ã«æ´æ°ï¼179 * p_tmevtnを親ノードの位置に更新. 202 180 */ 203 181 p_tmevtn = p_parent; … … 209 187 210 188 /* 211 * ã¿ã¤ã ã¤ãã³ãã®æ¿å 212 ¥ä½ç½®ãä¸åãã«æ¢ç´¢ 189 * タイムイベントの挿入位置を下向きに探索 213 190 * 214 * æå»evttimã«çºçããã¿ã¤ã ã¤ãã³ããæ¿å 215 ¥ãããã¼ãã空ããããã«ï¼ 216 * ãã¼ãã®ä¸ã«åãã£ã¦ç©ºãã¼ãã移åãããï¼ç§»ååã®ç©ºãã¼ãã®ä½ç½®ã 217 * p_tmevtnã«æ¸¡ãã¨ï¼ç§»åå¾ã®ç©ºãã¼ãã®ä½ç½®ï¼ããªãã¡æ¿å 218 ¥ä½ç½®ï¼ãè¿ãï¼ 191 * 時刻evttimに発生するタイムイベントを挿入するノードを空けるために, 192 * ヒープの下に向かって空ノードを移動させる.移動前の空ノードの位置を 193 * p_tmevtnに渡すと,移動後の空ノードの位置(すなわち挿入位置)を返す. 219 194 */ 220 195 #ifdef TOPPERS_tmedown … … 227 202 while ((p_child = LCHILD(p_tmevtn)) <= p_last_tmevtn) { 228 203 /* 229 * å·¦å³ã®åãã¼ãã®ã¤ãã³ãçºçæå»ãæ¯è¼ãï¼æ©ãæ¹ã®åãã¼ã230 * ã®ä½ç½®ãp_childã«è¨å®ããï¼ä»¥ä¸ã®åãã¼ãã¯ï¼ããã§é¸ã°ãã231 * æ¹ã®åãã¼ãã®ãã¨ï¼204 * 左右の子ノードのイベント発生時刻を比較し,早い方の子ノード 205 * の位置をp_childに設定する.以下の子ノードは,ここで選ばれた 206 * 方の子ノードのこと. 232 207 */ 233 208 if (p_child + 1 <= p_last_tmevtn … … 238 213 239 214 /* 240 * åãã¼ãã®ã¤ãã³ãçºçæå»ã®æ¹ãé 241 ãï¼ã¾ãã¯åãï¼ãªãã°ï¼ 242 * p_tmevtnãæ¿å 243 ¥ä½ç½®ãªã®ã§ã«ã¼ããæããï¼ 215 * 子ノードのイベント発生時刻の方が遅い(または同じ)ならば, 216 * p_tmevtnが挿入位置なのでループを抜ける. 244 217 */ 245 218 if (EVTTIM_LE(evttim, p_child->p_tmevtb->evttim)) { … … 248 221 249 222 /* 250 * åãã¼ããp_tmevtnã®ä½ç½®ã«ç§»åãããï¼223 * 子ノードをp_tmevtnの位置に移動させる. 251 224 */ 252 225 *p_tmevtn = *p_child; … … 254 227 255 228 /* 256 * p_tmevtn ãåãã¼ãã®ä½ç½®ã«æ´æ°ï¼229 * p_tmevtnを子ノードの位置に更新. 257 230 */ 258 231 p_tmevtn = p_child; … … 264 237 265 238 /* 266 * ã¿ã¤ã ã¤ãã³ããã¼ãã¸ã®è¿½å239 * タイムイベントヒープへの追加 267 240 * 268 * p_tmevtb ã§æå®ããã¿ã¤ã ã¤ãã³ããããã¯ãï¼ã¿ã¤ã ã¤ãã³ããã¼ãã«269 * 追å ããï¼241 * p_tmevtbで指定したタイムイベントブロックを,タイムイベントヒープに 242 * 追加する. 270 243 */ 271 244 Inline void … … 275 248 276 249 /* 277 * p_last_tmevtnãã¤ã³ã¯ãªã¡ã³ããï¼ããããä¸ã«æ¿å 278 ¥ä½ç½®ãæ¢ãï¼ 250 * p_last_tmevtnをインクリメントし,そこから上に挿入位置を探す. 279 251 */ 280 252 p_tmevtn = tmevt_up(++p_last_tmevtn, p_tmevtb->evttim); 281 253 282 254 /* 283 * ã¿ã¤ã ã¤ãã³ããp_tmevtnã®ä½ç½®ã«æ¿å 284 ¥ããï¼ 255 * タイムイベントをp_tmevtnの位置に挿入する. 285 256 */ 286 257 p_tmevtn->p_tmevtb = p_tmevtb; … … 289 260 290 261 /* 291 * ã¿ã¤ã ã¤ãã³ããã¼ãããã®åé¤262 * タイムイベントヒープからの削除 292 263 */ 293 264 Inline void … … 299 270 300 271 /* 301 * åé¤ã«ããã¿ã¤ã ã¤ãã³ããã¼ãã空ã«ãªãå ´åã¯ä½ãããªãï¼272 * 削除によりタイムイベントヒープが空になる場合は何もしない. 302 273 */ 303 274 if (--p_last_tmevtn < p_top_tmevtn) { … … 306 277 307 278 /* 308 * åé¤ãããã¼ãã®ä½ç½®ã«æå¾ã®ãã¼ãï¼p_last_tmevtn + 1 ã®ä½ç½®ã® 309 * ãã¼ãï¼ãæ¿å 310 ¥ãï¼ãããé©åãªä½ç½®ã¸ç§»åãããï¼å®éã«ã¯ï¼æå¾ 311 * ã®ãã¼ããå®éã«æ¿å 312 ¥ããã®ã§ã¯ãªãï¼åé¤ãããã¼ãã®ä½ç½®ã空ãã¼ 313 * ãã«ãªãã®ã§ï¼æå¾ã®ãã¼ããæ¿å 314 ¥ãã¹ãä½ç½®ã¸åãã¦ç©ºãã¼ãã移 315 * åãããï¼ 279 * 削除したノードの位置に最後のノード(p_last_tmevtn + 1 の位置の 280 * ノード)を挿入し,それを適切な位置へ移動させる.実際には,最後 281 * のノードを実際に挿入するのではなく,削除したノードの位置が空ノー 282 * ドになるので,最後のノードを挿入すべき位置へ向けて空ノードを移 283 * 動させる. 316 284 * 317 * æå¾ã®ãã¼ãã®ã¤ãã³ãçºçæå»ãï¼åé¤ãããã¼ãã®è¦ªãã¼ãã®ã¤ 318 * ãã³ãçºçæå»ããåã®å ´åã«ã¯ï¼ä¸ã«åãã£ã¦æ¿å 319 ¥ä½ç½®ãæ¢ãï¼ã 320 * ãã§ãªãå ´åã«ã¯ï¼ä¸ã«åãã£ã¦æ¢ãï¼ 285 * 最後のノードのイベント発生時刻が,削除したノードの親ノードのイ 286 * ベント発生時刻より前の場合には,上に向かって挿入位置を探す.そ 287 * うでない場合には,下に向かって探す. 321 288 */ 322 289 event_evttim = (p_last_tmevtn + 1)->p_tmevtb->evttim; … … 325 292 (p_parent = PARENT(p_tmevtn))->p_tmevtb->evttim)) { 326 293 /* 327 * 親ãã¼ããp_tmevtnã®ä½ç½®ã«ç§»åãããï¼294 * 親ノードをp_tmevtnの位置に移動させる. 328 295 */ 329 296 *p_tmevtn = *p_parent; … … 331 298 332 299 /* 333 * åé¤ãããã¼ãã®è¦ªãã¼ãããä¸ã«åãã£ã¦æ¿å 334 ¥ä½ç½®ãæ¢ãï¼ 300 * 削除したノードの親ノードから上に向かって挿入位置を探す. 335 301 */ 336 302 p_tmevtn = tmevt_up(p_parent, event_evttim); … … 338 304 else { 339 305 /* 340 * åé¤ãããã¼ãããä¸ã«åãã£ã¦æ¿å 341 ¥ä½ç½®ãæ¢ãï¼ 306 * 削除したノードから下に向かって挿入位置を探す. 342 307 */ 343 308 p_tmevtn = tmevt_down(p_tmevtn, event_evttim); … … 345 310 346 311 /* 347 * æå¾ã®ãã¼ããp_tmevtnã®ä½ç½®ã«æ¿å 348 ¥ããï¼ 312 * 最後のノードをp_tmevtnの位置に挿入する. 349 313 */ 350 314 *p_tmevtn = *(p_last_tmevtn + 1); … … 353 317 354 318 /* 355 * ã¿ã¤ã ã¤ãã³ããã¼ãã®å 356 é ã®ãã¼ãã®åé¤ 319 * タイムイベントヒープの先頭のノードの削除 357 320 */ 358 321 Inline TMEVTB * … … 364 327 365 328 /* 366 * åé¤ã«ããã¿ã¤ã ã¤ãã³ããã¼ãã空ã«ãªãå ´åã¯ä½ãããªãï¼329 * 削除によりタイムイベントヒープが空になる場合は何もしない. 367 330 */ 368 331 if (--p_last_tmevtn >= p_top_tmevtn) { 369 332 /* 370 * ã«ã¼ããã¼ãã«æå¾ã®ãã¼ãï¼p_last_tmevtn + 1 ã®ä½ç½®ã®ãã¼ 371 * ãï¼ãæ¿å 372 ¥ãï¼ãããé©åãªä½ç½®ã¸ç§»åãããï¼å®éã«ã¯ï¼æå¾ 373 * ã®ãã¼ããå®éã«æ¿å 374 ¥ããã®ã§ã¯ãªãï¼ã«ã¼ããã¼ãã空ãã¼ã 375 * ã«ãªãã®ã§ï¼æå¾ã®ãã¼ããæ¿å 376 ¥ãã¹ãä½ç½®ã¸åãã¦ç©ºãã¼ãã 377 * 移åãããï¼ 333 * ルートノードに最後のノード(p_last_tmevtn + 1 の位置のノー 334 * ド)を挿入し,それを適切な位置へ移動させる.実際には,最後 335 * のノードを実際に挿入するのではなく,ルートノードが空ノード 336 * になるので,最後のノードを挿入すべき位置へ向けて空ノードを 337 * 移動させる. 378 338 */ 379 339 event_evttim = (p_last_tmevtn + 1)->p_tmevtb->evttim; … … 381 341 382 342 /* 383 * æå¾ã®ãã¼ããp_tmevtnã®ä½ç½®ã«æ¿å 384 ¥ããï¼ 343 * 最後のノードをp_tmevtnの位置に挿入する. 385 344 */ 386 345 *p_tmevtn = *(p_last_tmevtn + 1); … … 391 350 392 351 /* 393 * ç¾å¨ã®ã¤ãã³ãæå»ã®æ´æ°352 * 現在のイベント時刻の更新 394 353 */ 395 354 #ifdef TOPPERS_tmecur … … 401 360 EVTTIM previous_evttim; 402 361 403 new_hrtcnt = target_hrt_get_current(); /* ï¼»ASPD1013ï¼½*/404 hrtcnt_advance = new_hrtcnt - current_hrtcnt; /* ï¼»ASPD1014ï¼½*/362 new_hrtcnt = target_hrt_get_current(); /*[ASPD1013]*/ 363 hrtcnt_advance = new_hrtcnt - current_hrtcnt; /*[ASPD1014]*/ 405 364 #ifdef TCYC_HRTCNT 406 365 if (new_hrtcnt < current_hrtcnt) { … … 410 369 411 370 previous_evttim = current_evttim; 412 current_evttim += (EVTTIM) hrtcnt_advance; /* ï¼»ASPD1015ï¼½*/413 current_hrtcnt = new_hrtcnt; /* ï¼»ASPD1016ï¼½*/414 boundary_evttim = current_evttim - BOUNDARY_MARGIN; /* ï¼»ASPD1011ï¼½*/371 current_evttim += (EVTTIM) hrtcnt_advance; /*[ASPD1015]*/ 372 current_hrtcnt = new_hrtcnt; /*[ASPD1016]*/ 373 boundary_evttim = current_evttim - BOUNDARY_MARGIN; /*[ASPD1011]*/ 415 374 416 375 if (monotonic_evttim - previous_evttim < (EVTTIM) hrtcnt_advance) { 417 376 #ifdef UINT64_MAX 418 377 if (current_evttim < monotonic_evttim) { 419 systim_offset += 1LLU << 32; /* ï¼»ASPD1045ï¼½*/378 systim_offset += 1LLU << 32; /*[ASPD1045]*/ 420 379 } 421 380 #endif /* UINT64_MAX */ 422 monotonic_evttim = current_evttim; /* ï¼»ASPD1042ï¼½*/381 monotonic_evttim = current_evttim; /*[ASPD1042]*/ 423 382 } 424 383 } … … 427 386 428 387 /* 429 * ç¾å¨ã®ã¤ãã³ãæå»ãé 430 ãæ¹ã«ä¸¸ããã¤ãã³ãæå»ã®ç®åºï¼»ASPD1027ï¼½ 388 * 現在のイベント時刻を遅い方に丸めたイベント時刻の算出[ASPD1027] 431 389 * 432 * ç¾å¨ã®ã¤ãã³ãæå»ãæ´æ°ããå¾ã«å¼ã¶ãã¨ãæ³å®ãã¦ããï¼390 * 現在のイベント時刻を更新した後に呼ぶことを想定している. 433 391 */ 434 392 Inline EVTTIM … … 439 397 440 398 /* 441 * é«å解è½ã¿ã¤ãå²è¾¼ã¿ã®çºçã¿ã¤ãã³ã°ã®è¨å®399 * 高分解能タイマ割込みの発生タイミングの設定 442 400 */ 443 401 #ifdef TOPPERS_tmeset … … 449 407 450 408 if (p_last_tmevtn < p_top_tmevtn) { 451 target_hrt_set_event(HRTCNT_BOUND); /* ï¼»ASPD1007ï¼½*/409 target_hrt_set_event(HRTCNT_BOUND); /*[ASPD1007]*/ 452 410 } 453 411 else if (EVTTIM_LE(top_evttim, current_evttim)) { 454 target_hrt_raise_event(); /* ï¼»ASPD1017ï¼½*/412 target_hrt_raise_event(); /*[ASPD1017]*/ 455 413 } 456 414 else { 457 415 hrtcnt = (HRTCNT)(top_evttim - current_evttim); 458 416 if (hrtcnt > HRTCNT_BOUND) { 459 target_hrt_set_event(HRTCNT_BOUND); /* ï¼»ASPD1006ï¼½*/417 target_hrt_set_event(HRTCNT_BOUND); /*[ASPD1006]*/ 460 418 } 461 419 else { 462 target_hrt_set_event(hrtcnt); /* ï¼»ASPD1002ï¼½*/420 target_hrt_set_event(hrtcnt); /*[ASPD1002]*/ 463 421 } 464 422 } … … 468 426 469 427 /* 470 * ã¿ã¤ã ã¤ãã³ããããã¯ã®ãã¼ãã¸ã®æ¿å 471 ¥ 428 * タイムイベントブロックのヒープへの挿入 472 429 */ 473 430 #ifdef TOPPERS_tmereg … … 482 439 483 440 /* 484 * ç¸å¯¾æéæå®ã«ããã¿ã¤ã ã¤ãã³ãã®ç»é²441 * 相対時間指定によるタイムイベントの登録 485 442 * 486 443 */ … … 491 448 { 492 449 /* 493 * ç¾å¨ã®ã¤ãã³ãæå»ã¨ã¿ã¤ã ã¤ãã³ãã®çºçæå»ãæ±ããï¼»ASPD1026ï¼½ï¼450 * 現在のイベント時刻とタイムイベントの発生時刻を求める[ASPD1026]. 494 451 */ 495 452 update_current_evttim(); … … 497 454 498 455 /* 499 * ã¿ã¤ã ã¤ãã³ããããã¯ããã¼ãã«æ¿å 500 ¥ããï¼»ASPD1030ï¼½ï¼ 456 * タイムイベントブロックをヒープに挿入する[ASPD1030]. 501 457 */ 502 458 tmevtb_insert(p_tmevtb); 503 459 504 460 /* 505 * é«å解è½ã¿ã¤ãå²è¾¼ã¿ã®çºçã¿ã¤ãã³ã°ãè¨å®ããï¼»ASPD1031ï¼½506 * ï¼»ASPD1034ï¼½ï¼461 * 高分解能タイマ割込みの発生タイミングを設定する[ASPD1031] 462 * [ASPD1034]. 507 463 */ 508 464 if (!in_signal_time && p_tmevtb->p_tmevtn == p_top_tmevtn) { … … 514 470 515 471 /* 516 * ã¿ã¤ã ã¤ãã³ãã®ç»é²è§£é¤472 * タイムイベントの登録解除 517 473 */ 518 474 #ifdef TOPPERS_tmedeq … … 524 480 525 481 /* 526 * ã¿ã¤ã ã¤ãã³ããããã¯ããã¼ãããåé¤ããï¼»ASPD1039ï¼½ï¼482 * タイムイベントブロックをヒープから削除する[ASPD1039]. 527 483 */ 528 484 p_tmevtn = p_tmevtb->p_tmevtn; … … 530 486 531 487 /* 532 * é«å解è½ã¿ã¤ãå²è¾¼ã¿ã®çºçã¿ã¤ãã³ã°ãè¨å®ããï¼»ASPD1040ï¼½ï¼488 * 高分解能タイマ割込みの発生タイミングを設定する[ASPD1040]. 533 489 */ 534 490 if (!in_signal_time && p_tmevtn == p_top_tmevtn) { … … 541 497 542 498 /* 543 * ã·ã¹ãã æå»ã®èª¿æ´æã®ã¨ã©ã¼ãã§ãã¯499 * システム時刻の調整時のエラーチェック 544 500 */ 545 501 #ifdef TOPPERS_tmechk … … 549 505 { 550 506 if (adjtim > 0) { 551 return(p_last_tmevtn >= p_top_tmevtn /* ï¼»NGKI3588ï¼½*/507 return(p_last_tmevtn >= p_top_tmevtn /*[NGKI3588]*/ 552 508 && EVTTIM_LE(top_evttim, current_evttim - TMAX_ADJTIM)); 553 509 } 554 else if (adjtim < 0) { /* ï¼»NGKI3589ï¼½*/510 else if (adjtim < 0) { /*[NGKI3589]*/ 555 511 return(monotonic_evttim - current_evttim >= -TMIN_ADJTIM); 556 512 } … … 561 517 562 518 /* 563 * ã¿ã¤ã ã¤ãã³ããçºçããã¾ã§ã®æéã®è¨ç®519 * タイムイベントが発生するまでの時間の計算 564 520 */ 565 521 #ifdef TOPPERS_tmeltim … … 571 527 572 528 /* 573 * ç¾å¨ã®ã¤ãã³ãæå»ãé 574 ãæ¹ã«ä¸¸ããæå»ãæ±ããï¼»ASPD1050ï¼½ï¼ 529 * 現在のイベント時刻を遅い方に丸めた時刻を求める[ASPD1050]. 575 530 */ 576 531 update_current_evttim(); … … 578 533 579 534 /* 580 * ã¿ã¤ã ã¤ãã³ãçºçã¾ã§ã®ç¸å¯¾æéãæ±ããï¼»ASPD1049ï¼½ï¼535 * タイムイベント発生までの相対時間を求める[ASPD1049]. 581 536 */ 582 537 evttim = p_tmevtb->evttim; 583 538 if (EVTTIM_LE(evttim, current_evttim_ub)) { 584 539 /* 585 * ã¿ã¤ã ã¤ãã³ãã®çºçæå»ãéãã¦ããå ´åã«ã¯0ãè¿ãï¼»NGKI0552ï¼½ï¼540 * タイムイベントの発生時刻を過ぎている場合には0を返す[NGKI0552]. 586 541 */ 587 542 return(0U); … … 595 550 596 551 /* 597 * é«å解è½ã¿ã¤ãå²è¾¼ã¿ã®å¦ç552 * 高分解能タイマ割込みの処理 598 553 */ 599 554 #ifdef TOPPERS_sigtim … … 609 564 610 565 lock_cpu(); 611 in_signal_time = true; /* ï¼»ASPD1033ï¼½*/566 in_signal_time = true; /*[ASPD1033]*/ 612 567 613 568 do { 614 569 /* 615 * ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºããªããã°ã«ã¼ããæããï¼»ASPD1020ï¼½ï¼570 * コールバック関数を呼び出さなければループを抜ける[ASPD1020]. 616 571 */ 617 572 callflag = false; 618 573 619 574 /* 620 * ç¾å¨ã®ã¤ãã³ãæå»ãæ±ããï¼»ASPD1022ï¼½ï¼575 * 現在のイベント時刻を求める[ASPD1022]. 621 576 */ 622 577 update_current_evttim(); 623 578 624 579 /* 625 * çºçæå»ãcurrent_evttim以åã®ã¿ã¤ã ã¤ãã³ããããã°ï¼ã¿ã¤626 * ã ã¤ãã³ããã¼ãããåé¤ãï¼ã³ã¼ã«ããã¯é¢æ°ãå¼ã³åºã627 * ï¼»ASPD1018][ASPD1019ï¼½ï¼580 * 発生時刻がcurrent_evttim以前のタイムイベントがあれば,タイ 581 * ムイベントヒープから削除し,コールバック関数を呼び出す 582 * [ASPD1018][ASPD1019]. 628 583 */ 629 584 while (p_last_tmevtn >= p_top_tmevtn … … 633 588 callflag = true; 634 589 } 635 } while (callflag); /* ï¼»ASPD1020ï¼½*/636 637 /* 638 * é«å解è½ã¿ã¤ãå²è¾¼ã¿ã®çºçã¿ã¤ãã³ã°ãè¨å®ããï¼»ASPD1025ï¼½ï¼590 } while (callflag); /*[ASPD1020]*/ 591 592 /* 593 * 高分解能タイマ割込みの発生タイミングを設定する[ASPD1025]. 639 594 */ 640 595 set_hrt_event(); 641 596 642 in_signal_time = false; /* ï¼»ASPD1033ï¼½*/597 in_signal_time = false; /*[ASPD1033]*/ 643 598 unlock_cpu(); 644 599 }
Note:
See TracChangeset
for help on using the changeset viewer.