(toppers-users 4374) Re: カウンタ最大値2倍+1までカウントする理由について。

hisae @ jp.tdk.com hisae @ jp.tdk.com
2015年 5月 14日 (木) 18:41:51 JST


鴫原様

お世話になっております。久江です。

下記の例について、1回ラップアラウンドが発生していた場合は経過時間が8と
ありますが、基準値3から1回ラップアラウンドして現在値5ならば、基準値3からの
経過時間は11+(5-3)=13ではないのですか?
経過時間は8が正しいとすれば、基準値をどこに取って、どのような計算を
行っているのでしょうか。

又、OSの処理は、どのタイミングでラップアラウンド回数のカウントを開始するの
でしょうか?
例えば、一回目のGetElapsedValueコールで基準値が3であることがOSに伝わり、
二回目以降のコールで、OSはラップアラウンドの回数をカウントするのでしょう
か?(この例では、一回目にラップアラウンドが発生することはない。)
或いは単純に、現在値タイマの値が「ユーザ定義カウンタ最大値」以下の時は
ラップアラウンドが発生していないと見なし、それより大きく、かつ「ユーザ定義
カウンタ最大値2倍+1」以下の時はラップアラウンドが発生していると見なすの
でしょうか?

ややこしい質問をしてしまい、申し訳ありません。
ご教示頂けますようお願い申し上げます。



送信元:
鴫原一人 <ksigihar @ fsi.co.jp>
宛先:
users @ toppers.jp
日付:
2015/05/14 17:04
件名:
(toppers-users 4373) Re:        カウンタ最大値2倍+1までカウントする理由に
ついて。
送信者:
users-bounces @ toppers.jp



久江様

お世話になっております。
富士ソフト 鴫原です。


現在値タイマを、ユーザ定義カウンタ最大値2倍+1までカウントする理由は、
GetElapsedValueの以下の仕様を実現するためです。

[SWS_Os_00533] Caveats of GetElapsedValue():
If the timer already passed the <Value> value a second (or multiple) time,
the result returned is wrong. The reason is that the service can not 
detect
such a relative overflow.

例えば、カウンタ最大値が10で、現在値が5であるとします。
この時に、経過時間の基準値に3を指定してGetElapsedValueを
呼び出した際、経過時間が単純に2なのか、1回ラップアラウンドが
発生していて8なのか、を区別できるようにしています。
SWS_Os_00533の通り、2回以上基準値(Value)を通過していた場合
(2回ラップアラウンドしていた場合)は、不正値が返ることになりますが、
1回のラップアラウンドでは正しい値を返すために、OS内部では、
「ユーザ定義カウンタ最大値2倍+1」で管理しています。


以上、宜しくお願いします。


2015年5月14日 16:31 <hisae @ jp.tdk.com>:
各位

お世話になっております。

TDK株式会社の久江と申します。

現在、TOPPERS/ATK2のFL850F1L(テセラ・テクノロジー)簡易パッケージ の
ソースコードを解析させて頂いております。

下記ファイル
 ・arch\v850_gcc\tauj_hw_counter.c
のヘッダコメント部分を読みますと、OSのカウンタオブジェクトの一つは、
二つのハードウェアタイマを使用して構成されているようです。
一つが現在値タイマで、もう一つが差分タイマです。

 *  使用するタイマ:
 *    差分タイマ:目的の時間を設定する時の現在時間(現在値タイマ)
 *              と次の満了時間との相対時間をカウントすることで
 *              目的の絶対時間に満了したこととする
 *              count mode:count down once
 *
 *    現在値タイマ:カウンタ周期分のベースタイマを実現
 *              (絶対時間をカウント)
 *              count mode:continuous count down
 *
 *    また上記のタイマは32bitのダウンカウンタタイマである
 *
 *  制御方針:
 *
 *   現在値タイマはユーザ定義カウンタ最大値2倍+1までカウントし,
 *   周期タイマとして連続カウントダウンして,常に現在時刻を
 *   取得する.割込み発生する必要がないため,割込みなしモード
 *
 *   差分タイマは,満了処理を行うため,割込みありモードで動く
 *   アラームなどの満了点とタイマー1で示した現在時刻の差を
 *   現在値タイマに設定する
 *
 *  ポイント:
 *   満了処理は,現在時刻を影響しないため,現在値タイマを設けている>・サン
プルプログラムにて,TAUJ0, TAUJ1を使用.

二つのハードウェアタイマを使用する理由は理解できたのですが、
「制御方針」に書いてある内容で、「現在値タイマはユーザ定義
カウンタ最大値2倍+1までカウント」する必要がある理由が分かりません。

「ユーザ定義カウンタ最大値」とは、コンフィギュレーションファイルに
設定される値、詳しくはtarget_hw_counter.yamlにて記述する、
コンテナOsCounterMaxAllowedValueの値になります。
サンプルでは次のように定義されていますので、
 OsCounterMaxAllowedValue: 0x1FFFFFFF
このカウンタオブジェクトは0から0x1FFFFFFFまでカウントしたら
0に戻るカウンタということになります。

普通に考えれば、現在値タイマは0から0x1FFFFFFFまでカウント
すれば必要十分に思えます。
にも関わらず、「現在値タイマはユーザ定義カウンタ最大値2倍+1
までカウント」する必要がある理由について、ご教示頂きたく
お願い申し上げます。

よろしくお願いいたします。