【コンフィギュレーションとは?】
PICROSを実際に使う場合には、PICデバイスの指定、タスク構成、初期化など
いくつかの条件を指定する必要があります。
コンフィギュレーションはこれらの使用条件を指定することを言います。
PICのデバイス自身のコンフィギュレーションビットとは異なるものです。
【コンフィギュレーションに必要なもの】
PICROSで実際に必要となるコンフィギュレーションデータは下記となります。
(1) コンフィギュレーションファイル (usrconf.h)
使用するPICのデバイス指定や、タスクの内容について定義するファイルで
ここに全ての使用条件を記述する。コンパイル時に最初にチェックされる。
(2) タスクディスパッチテーブル(tdt.h)
タスクのディスパッチに使用するジャンプテーブルで、優先順位順に並べる。
「dispatch」という関数で定義して並べるのみ。
(3) タスクリンクファイル(tasklink.h)
実際のタスクのコードをリンクするためのヘッダーファイルで、全てのタスクと
必要な関数類、割込み処理関数などをリンクする必要がある。
(4) ユーザー初期化関数(usrini.c)
デバイスの実際の初期化を実行する命令を記述した関数で、ユーザー毎に異なる
ので別関数として用意する必要がある。
【コンフィギュレーションファイルの作り方】 usrconf.h
では実際にPICROSを使う場合のコンフィギュレーションファイル(usrconf.h)の作り方を
実際の例で説明していきます。
まずコンフィギュレーションファイルでは、下記のものを定義する必要があります。
・PICデバイスの指定とシステム定数ファイルのインクルード
・PIC自身のコンフィギュレーションビット指定
・クロック周波数指定
・デバッグモードの指定
・タスクの優先順位とIDの設定
・タスクのプロトタイプ
・共通変数の定義
・LCDやUSBなどの追加デバイスのヘッダーファイルリンク
(1) PICのデバイス指定とデバイスに伴う各種設定
これらは通常の使用法と同じで下記のように定数指定ファイルをインクルードし、
PIC16F87xの場合で10ビットのA/D変換を使う場合には、その指定をします。
次はPICのコンフィギュレーションビットの設定で、これも通常と全く同じようにして
設定します。87xシリーズでしたら下記が一般的です。次にクロックの周波数設定、
I/Oピンのモード設定を固定にしておきます。
クロックの周波数はFREQという定数ラベルを使って指定すれば、あとはdelay、
USART、USBなどのクロック関連設定をPICROS内部で自動的に行います。
(2) デバッグモードの指定<例> PIC16F877の場合
PICROS内部にはデバッグ用のコードが埋め込まれていて、各種のエラーメッセージ
などをUSART経由でパソコンなどに出力することが出来ます。
しかしそのコードをそのままにしておくことは余分なコードが付いてプログラムサイズ
が大きくなってしまいます。
そこでデバッグの時だけそのコードを追加し、必要ない時にはそれらを出力しないように
することが出来るようにしています。
ここではそれを指定します。
デバッグ用のフラグがいくつか用意されていて下記のように指定します。
フラグ名 機 能 設定値と機能 備 考 DEBUG_MODE エラーメッセージ指定
とデバッグライブラリ
のリンク指定TRUE:エラーメッセージを出力する
ERROR * $$$
*:タスクNO $$$:エラーコード
またデバッグライブラリもリンクする
FALSE:しない(コード出力されない)
デバッグライブラリもリンクしないエラーコード3桁 DETAIL ディスパッチの時の
タスクNOを出力する0:出力しない(コード出力されない)
FF:全て出力する
他:指定タスクのみ出力する指定は1個のみ
<記述例>
////// Define Debug Mode ///////////
#define DEBUG_MODE TRUE
#define DETAIL 0
(3) タスクの定義とID定義
ユーザーが使用する最大タスク数の指定と、作成したタスクのID、タスク関数のプロトタイプ
を記述します。
最大使用タスク数は、「task_number」という定数に定義します。
またタスクIDとは、サービス関数でパラメータとして使う定数名を指定するもので、定数に
単純な番号を対応させます。このID番号がディスパッチの時のタスクの優先順位と同じに
なりますので注意が必要です。
プロトタイプはコンパイラに前もってタスク関数の型式を通知するためのもので、通常の
プロトタイピングと全く同じものです。
<記述例>
上記の例では、最大タスク数が8個で実際には7個しかありません。このように最大タスク
数は余分に確保しても問題ありません。
IDとしてtask1からtask8まで設定しています。これは単に1から8までの数値として定義する
だけです。タスクの名前に類似させた方があとで判り易くなります。
プロトタイプではタスクの関数名を正確にコピーします。これが異なるとコンパイルエラー
となります。
(4) コモン変数定義
各タスク間でデータを授受するには、共通で使えるSTATIC変数が必要になります。
そこで、これらをまとめて定義しておきます。
この定義はここでなくても出来ますが、1箇所にまとめて置く方がデバッグの時に楽です。
(5) 追加デバイスのヘッダーファイルリンク
液晶表示器、USBなどPICでは標準でついていないデバイスで、PICROSがサポートして
いるデバイスのヘッダーファイルをここでリンクします。
単純に#include するだけです。
<記述例>
【ディスパッチテーブルファイルの作り方】 tdt.h
スケジューラで実際にタスクをディスパッチするときのジャンプテーブルです。
この作成は簡単で、「dispatch」という専用関数が用意されていますので、それを使って
記述するだけです。この記述形式は下記とします。
dispatch (m、taskname())
ここで m:タスク番号 taskname():タスク関数名そのもの
タスク番号は1から順番の番号です。この記述順序が実際のタスクの優先順位になります。
<記述例>
これだけの記述だけでディスパッチテーブルはコンパイル時に自動的に展開されます。
【タスクリンクファイル】 tasklink.h
実際のタスクの関数や割込み処理関数、その他作成した全ての関数を、コンパイルリンク
するためのヘッダーファイルです。
ここには単純にリンクする関数を全て#include で記述します。
<記述例>
上記のように、作成した関数を全て追加記述します。
【ユーザー初期化関数】 usrini.c
システム毎に入出力ポートの使い方や、内蔵モジュールの使い方は異なります。
それらをユーザー初期化関数として外に出して、ユーザーが自分で作成して用意
します。
ここには下記のような内容が含まれます。
・ポートの入出力モード設定
・A/D変換、CCPなどの内蔵モジュールの初期設定
・タイマ0以外のタイマの初期化、割込み許可
・デバッグ以外で使う場合のUSARTの初期設定、割込み許可
・初期起動タスクの起動
ここで重要な内容は、割込み関連で、デバイスの割込みを使う場合には、各デバイス
の割込み許可を実行しておく必要があります。
実際の割り込みは、PICROSでGLOBAL割込み許可、禁止により制御されます。
最初に起動するタスクがあれば、ここでRequest_Task関数を実行することで起動
することが出来ます。
<記述例>
【注意】 USARTの重複使用について
USARTをユーザー処理で使う場合には、デバッグで使う場合と重なる
ので、使い方に注意が必要です。いずれか片方でしか使うことは出来ません。
【プロジェクトの作成方法】
以上でコンフィギュレーションの準備が整います。
これらを使ってコンパイル時のプロジェクトを作成するには下記のようにします。
プロジェクトはMPLAB上で作成するものとします。
・まず、プロジェクト用のディレクトリを用意します。
このディレクトリの中に作成した全ての関数を置きます。そしてPICROS本体である
「picros.c」もこのディレクトリにコピーします。
・次にコピーしたpicros.cのファイル名をプロジェクト名と同じ名称に変更します。
例えば、 usbdmm.c (プロジェクト名:usbdmm)
・次にMPLABでNew Projectを指定して作成を始めます。
このときプロジェクト名は上記で決めた名称に合わせます。
PICデバイスを指定し、CCSコンパイラを指定します。
・HEXファイルのプロパティで、PCMかPCHを指定します。
・次にADDボタンで、ソースファイルとして「usbdmm.c」(上記で変更したファイル名)
を指定します。
・これでプロジェクトの作成は完了です。