[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(itron-club 1724) TOPPERS/JSP
isig_tim
の実装について
- To: itron-club __at__ ertl.jp (itron-club ML)
- From: Tatsuhiro Ujihara <ujihara __at__ roland.co.jp>
- Date: Wed, 21 Jul 2004 11:53:30 +0900
はじめまして。氏原と申します。
#長文注意
現在TOPPERS/JSPを評価中なのですが、気になることがあったので投稿させてい
ただきました。特にCPUには依存しないので、動作環境は割愛させていただき
ます。
#過去ログは一応検索かけましたが、もしダブっていたらご容赦ください。
<現象>
周期が1のcyclicハンドラーを作成して、実際に動作させたところ、最初のタイ
マー割り込みで2回そのcyclicハンドラーが呼ばれるようです。その後は思惑通
り1回のタイマー割り込みで1回呼ばれるようになります。
configuratorの部分
CRE_CYC(CYCHDR1, { TA_HLNG|TA_ACT,(VP_INT) 0, cyc_task, 1, 0 });
<考察>
isig_tim()を眺めると以下のwhile文の判定式に原因がありそうです。
while (last_index > 0 && EVTTIM_LE(TMEVT_NODE(1).time, next_time)) {
判定文だけ取り出して、マクロを展開すると
last_index > 0 &&
tmevt_heap[0].time <= next_time
となります。
初回のタイマー割り込み時の状態は
last_index = 1
tmevt_heap[0].time = 0
next_time = 1
となります。条件が合うのでcyclicハンドラーが実行されます。
次のwhileの判定では
last_index = 1
tmevt_heap[0].time = 1
next_time = 1
となり、これも条件に合致してしまい、再びcyclicハンドラーがコールされてし
まうようです。
次回のwhile判定は
last_index = 1
tmevt_heap[0].time = 2
next_time = 1
なので条件に合致せず、while文を抜けます。
次のタイマー割り込みでは
last_index = 1
tmevt_heap[0].time = 2
next_time = 2
となるので、以降1回しか実行されなくなります。
<結論>
長々と書いてしまいましたが、このwhile文は
while (last_index > 0 && EVTTIM_LT(TMEVT_NODE(1).time, next_time))
^^
もしくは
while (last_index > 0 && EVTTIM_LT(TMEVT_NODE(1).time, current_time))
^^^^^^^^^^^^
が正しいのではないでしょうか。
とくに後者のほうにすればnext_timeという変数は必要なくなると思います。
--
Roland Corporation Japan
Tatsuhiro Ujihara