[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(itron-club 1724) TOPPERS/JSP isig_tim の実装について



はじめまして。氏原と申します。

#長文注意

現在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