タスクの作り方


タスクの作成法

【タスクとは?】

PICROSでいうタスクとは、ユーザが作成する機能を果たす部分の
全ての呼称で、イベント駆動型で考えて作成する。
すなわち、割り込みや、入力など何らかのイベント発生により、タスク
は起動され、マクロ命令を使うことで他のタスクとの連携を取り合い
全体の機能を果たす様に作成する。


【タスクの構成方法】

PICROSのタスク部は下記3つの要素から構成されます。以下それ
ぞれの作り方を説明します。

 (1)ユーザ初期化ルーチン
 (2)ユーザアイドルルーチン
 (3)一般タスク

【ユーザ初期化処理】

 PICROS内部では、タイマと割込み処理関連のみ初期化処理が行われ
ていますが、PORTや他のレジスタ類の初期化はユーザで行うことが
必要となります。
そこで、その初期化処理は下記のようにして作成します。

(1)ユーザ初期化処理へのジャンプ命令のセット
  ユーザ処理へジャンプさせるためのCALL命令を下記のように
  して1番地の挿入します。

     ORG 1
     CALL USERINI  ユーザ作成の初期化処理へ

(2)ユーザ初期化処理を作成します。
  ラベルを上記CALL命令と合わせて最後はRETURNで戻ります。

   USERINI
         処理本体
         RETURN

(3)タイマに関連するレジスタを変更するときの注意
  PICROS内部ではタイマー0をインターバルタイマとして
  使っています。そこでユーザでレジスタでモード設定を変更
  するときには下記設定となるように注意して下さい。

  TMR0のモード設定内容
   ・T0CS = 0 
     タイマのクロックとして内部クロックを指定
   ・T0SE = 0
     カウントエッジを立ち上がりエッジを指定
   ・PSA = 0
     プリスケーラをTMR0使用モードに設定
   ・PS0 = PS1 =PS2 =1
     プリセットカウンタのモードを256カウントに設定


【ユーザアイドル処理の作成方法】

PICROS内部では実行すべきタスクがひとつも無いときにはアイドル
ループでアイドリングしています。
このアイドル時にユーザがウォッチドッグタイマ処理など、何らかの
処理を追加したいときには、ユーザアイドル処理を作成し追加する
ことが出来ます。その作成方法は下記のようにします。

(1)ユーザアイドル処理へのジャンプ命令のセット
  ユーザ処理へジャンプさせるためのCALL命令を下記のように
  して1番地の挿入します。

     ORG 0xB      00B番地にセット
     CALL USERIDLE  ユーザ作成の初期化処理へ

(2)ユーザアイドル処理部を作成します。
  ラベルを上記CALL命令と合わせて最後はRETURNで戻ります。

   USERIDLE
         処理本体
         RETURN
   
(3)ウォッチドッグタイマの使い方
  ウォッチドッグタイマを使う時にはTMR0のインターバルタイマで
  プリスケーラを使ってしまっているので。ウォッチドッグタイマでは
  プリスケーラは使えません。従ってウォッチドッグタイマを有効に
  するときには、約18msecのウォッチドッグタイマとなりますので
  約15msec以内にはウォッチドッグタイマリセット命令を実行する
  必要があるので注意が必要です。

(4)アイドル処理の注意
  アイドル処理はかなり高速で繰り返し実行されますので、それを
  意識した処理をする必要があります。
  例えばむやみに入出力するような処理を挿入すると、ノイズ源にも
  なりますし、誤動作の原因となることも考えられますので注意が
  必要です。


【一般タスクの作り方】

一般タスクは別ページで紹介したようないくつかの構成方法があります。
これらは例であって他にもいろいろ考えられます。
しかし、これらの例はPICROSのマクロ命令などを使ってうまく実行制御
出来る様にするための期待される構成です。

(1)割込み処理からのタスク起動にはTRIGマクロを使え
  TRIGマクロは無条件で指定タスクを起動し、かつ直ぐ戻ってくるので
  割込み処理の中で実行しても問題無く使えます。

(2)割込み処理完了待ちタスクの待ち解除にはPOSTマクロを使え。
  周辺機器の処理待ちは、多くが周辺機器からの割込みで処理が
  なされ待ちが解除されます。このような時、割込み処理の中で
  指定タスクのイベント待ちを解除するにはPOSTマクロを使います。
  POSTマクロは直ぐ戻るので割り込み処理の中で使用しても問題
  ありません。

(3)タスク間で単純待ち合わせするときには、WAITマクロとPOSTマクロ
  2つのタスク間で単純に同期を取って待ち合わせるような時、
  WAITマクロは無条件で発行元タスクをイベント待ちとし、POSTマクロ
  は、やはり無条件で指定タスクのイベント待ちを解除する機能を持っ
  ています。そこでこの2つを使えば、単純にタスクの同期をとって
  互いの実行を待ち合わせながら進めることが出来ます。

(4)RQSTマクロとEVNTマクロはペアで使え
  複数のタスクから要求される待ち合わせには、EVNTマクロとRQST
  マクロをペアで使います。 EVNTマクロを発行すると、そのタスクを
  RQST起動した相手のタスクを自動的に探してその相手のイベント
  待ちを解除します。
  従って複数のタスクから起動されるタスクが、起動元を待ち状態に
  するときには、RQSTマクロで起動してもらい、EVNTマクロでその
  起動元のイベント待ちを解除するようにします。

(5)Bankをまたがって実行は出来ない
  アドレス空間はBank毎に独立とし、2つの空間をまたがって作成
  してはならない。

(6)タスクの実行時間が長過ぎないようにせよ
  長時間の実行時間を独占し、終了しない形のタスクを作成しては
  ならない。その場合には、いくつかのブロックに分割してstageに
  するか、ONTMマクロなどで間を空けながら実行するようにする。

(7)バッファ処理はすべてユーザの責任
  バッファ処理はPICROSでは何もしないので、バッファを使うときには
  全てタスク側で制御する必要がある。

【タスク構成例】

実際のタスクを構成する例を以下にあげる。

(1)最も単純なタスク例
  下図はもっとも単純なタスク構成の例で、割り込みが入ってきて、
  データを入力し、それをメモリに格納してタスク2をTRIGマクロで
  起動します。
  タスク2は高速で動作する周辺機器(液晶表示器など)を制御する
  ものとします。このような時には、タスクとしてはWAITマクロを必要
  とせず、バッファにあるデータを出し切るまで繰り返し終了したら
  EXITマクロで終了するようにします。



(2)待ち合わせをするタスクの例
 下図は比較的単純な待ち合わせのあるタスクの例です。
 割込み1でデータ入力の処理をしタスク1を起動します。 タスク1は
 最初だけStage0でデータを処理して機器へ出力しますが、それ以後は
 Stage1の方でバッファのデータを取り出しては処理します。機器は
 プリンタのような処理時間を必要とするものとし、出力したら完了を
 待つ必要があるものとします。その待ち合わせのため、WAITマクロを
 使用します。この待ちは、機器の割込み2により終了させられることに
 なるので、POSTマクロを割込み処理で実行します。このマクロにより
 タスク1の待ちが解除され、Stage1の実行が再開されます。
 これをバッファのデータが無くなるまで繰り返し、無くなったらEXITマクロ
 で終了します。これで、次はまたStage0から起動することになります。







  次のページへ     目次ページへ