SSブログ

Smalight OSを使おう 2タスク目 システムタイマーの設定 [Smalight OS]

この記事は、某SNSで書いているものを転載しています。
※書き忘れたけれど、smalight osのシステムタイマーは符号付32bit、つまり実質31bitしかない。 これは約24日間でロールオーバーする計算だけれど、ロールオーバーした後は一体どうなるの?。 ちなみにITRONでは48bitなので9000年はロールオーバーしない。

今回は、時間管理機構を使う為のシステムタイマーの設定の解説と、LEDをボヤっと光らせる蛍アプリケーションの作成まで行います。

システムタイマーを調整して見ます。

smalight osと一緒にインストールしたワークスペースは、デフォルトで約10MHzのCPUクロックを発生します。
これはuser.cの中のinit_clockの中で設定されています。

OSで時間管理機構をサポートする場合には、タイマー割り込みで一定周期のタイミングを発生する必要が有ります。
このワークスペースでは、やはりuser.cの中のinit_timerRAでタイマーの初期化を行い、intTimが割り込みハンドラとなっています。
※ITRON仕様で言う所の「周期ハンドラ」と、smalight osでの「周期ハンドラ」は基本的に異なるので、注意が必要です。

init_timerRAの設定状況を見てみると、源振10MHzを÷8÷250÷100で50Hzに落としているのがわかります。つまり一周期20msです。

smalight-osフォルダーの中にconfig.cが有りますが、これがOSの初期化情報を書いたファイルとなっており、タスクの登録や、システムタイマーのタイムティックの設定なんかを行っています。
このファイルの中のSYSTIM_CYCLIC_TIMと言う定義名を見ると20となっています。そうです、この20と言うのはシステムタイマーの更新時に加算するべき値の事を指しています。

μITRONもそうですが時間管理の基本単位はmsで、タイマー割り込みの周期に合わせてシステムタイマーにタイマー周期を加算する事で、トータルの経過時間を合せ込んでいます。

割り込みハンドラの中でslos_cyclic_timerと言う専用の関数を呼んでいますが、この中でシステムタイマーの更新が行われていると思われます。
※HOSの様にソースコードが提供されている訳ではないので、確認できない。

ここまで読めばもうお判りかと思いますが、システムタイマーを駆動するタイマー割り込みの周期と、タイムティック毎に加算される値をいじる事で、システムタイマーの調整を行う事が出来ます。

しかしなんでタイマーの調整が必要なのでしょうか。
実はデフォルトの設定の場合、実際にタイマー処理が行われるのに最大で20msの誤差が生じます。
500ms周期とか1000ms周期でLEDを点滅させている程度ならその誤差を認識できないのですが、これから行ってみる蛍アプリケーションの場合はこの誤差は致命的となります。

tslp_tskの動きは、引数の時間周期で起床要求が発生する訳ではなく、このサービスコールが発行された時間から引数の時間(相対時間)の後で起床要求が発生します。
つまり現在のシステムタイマーが1000、引数が5だとした場合、1000+5=1005の後のシステムタイマーの更新タイミングで比較が行われます。

この処理はslos_cyclic_timerの中で行われる筈です。しかしタイマー割り込みの周期が20msならば、次の比較タイミングは1020で行われる事となり、15msの誤差が出る事となります。
いくらtslp_tsk( 1 )と書いても、実際に起床してその後の処理を再開するのは、最悪20ms後という事です。

勿論先に書いた様にその誤差が問題にならないアプリケーションでは、特にタイマーの調整を必要としないでしょう。むやみやたらと細かい周期でシステムタイマーの更新を行う事は、OSの動作を重くし、結果、十分なパフォーマンスを発揮できなくなるかもしれません。

ではLEDの明度をPWMで実現する蛍アプリケーションの場合はどうでしょうか。この場合PWMはソフトウエア的に行います。タイマーのPWM機能を利用するのが本来だと思いますが、簡易的に実現する為にソフトウエアで行います。その為、更新周期が長いと、暗い側で点滅が目で見えるようになってしまいます。やっぱり蛍なのでぼやーっと光らせたいですよね。

ではconfig.cの中の加算値であるSYSTIM_CYCLIC_TIMを1とし、
user.cのタイマーの初期化関数の一部を以下の様にしますと、

tra = 5 - 1;


1ms周期でシステムタイマーが更新される事となります。

tsk01を以下の様に改造してみます。

void tsk01(void)
{
  int on_time;

  while( 1 )
  {
    /*明るくなる方向*/
    for( on_time = 2; on_time <= 25; on_time++ )
    {
      p2_0 = 0;
      tslp_tsk( on_time );
      p2_0 = 1;
      tslp_tsk( 25 - on_time );
    }

    /*暗くなる方向*/
    for( on_time = 25; on_time >= 2; on_time-- )
    {
      p2_0 = 0;
      tslp_tsk( on_time );
      p2_0 = 1;
      tslp_tsk( 25 - on_time );
    }
  }
}
ついでにtsk02も同様の改造を、しかし微妙にタイミングをずらして動作させると、結構いい感じです。 smalight osを理解するには、結局のところITRON仕様も知っておく方がより理解も進むので、以下の本もどうぞ!。(営業モード)
μITRON4.0標準ガイドブック

μITRON4.0標準ガイドブック

  • 作者: 坂村 健
  • 出版社/メーカー: パーソナルメディア
  • 発売日: 2001/11
  • メディア: 単行本

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。