|
| マイコン組込リアルタイムOS(UDN-OS for RX6x) |
|
UDN-OS for RX6x はルネサスRXマイコン用にカスタマイズしたUDNオリジナルのマイコン用
マルチタスクOSです。
イベントフラグやセマフォでタスクをスイッチングできます。
最近のマイコンは通信やセンサ、その他のデバイスなどシステムが増大する傾向にあります。
そのような環境で、UDN-OS for RX6x は威力を発揮します。
マルチタスクOSは複雑な並行処理のプログラミングを簡略化できます。
|
|
・少ないOSメモリ使用量(プログラムコード2KB以下)
・タスク数に制限無し
・リアルタイムで軽いタスクスイッチング
・イベントフラグとセマフォが利用可能
・高いポータビリティで各種マイコンに対応
|
|
開発ツール | メーカー |
CS+ for CC V.3.03.00 | ルネサス エレクトロニクス |
|
|
3. UDN-OS for RX6x 導入手順
|
≪
TOP
≫
|
|
|
|
・サンプルプロジェクトをコピーし、ユーザーが作成するソースをプロジェクトに追加する。
|
|
・タスク管理テーブル(tasks.c )にユーザータスクのスタートアドレスおよびスタックなどを設定。
・タスクの実体となる関数を作成する。
・初期化ルーチン(InitHandler())の内容を作成する。
|
|
タスクIDは、タスク定義の順に、0(ゼロ)から番号が割り振られます。
よって、タスクが3個の場合は、IDはそれぞれ、0、1、2 となります。
|
|
タスク状態 | 詳細 |
停止中 | 実行されません。 |
実行中・実行待ち | 実際に実行中のタスクと実行待ちのタスクの状態は同じステータスです。 優先順位で実行タスクが決まります。 |
イベント待ち | イベント発生で実行中・実行待ちへ移行します。 |
セマフォ待ち | 利用可能なセマフォが得られると実行中・実行待ちへ移行します。 |
※ タスク状態の定数は、osapi.h 内で定義されています。
|
|
スケジューラは次の局面で動作します。
スケジューラ動作条件 | 詳細 |
割り込みからの復帰 | 割り込みから通常処理に復帰する場合のみ(多重割り込みからの復帰では呼び出されない)
割り込み内でイベントセットを行う割り込みはハンドラをアセンブラで記述し、戻りで
__Switcher にジャンプする必要があります。
|
イベントAPIの呼び出し | 通常処理または割り込み処理からのイベント発行APIの呼び出し時 |
セマフォAPIの呼び出し | 通常処理からのセマフォのリリースAPIの呼び出し時 (割り込みハンドラでセマフォをリリースする事は出来ません。) |
|
|
フィールド | 詳細 |
タスク数 | システム全体のタスクの数( mos.h 内で定義) |
実行中タスク | 実行中のタスク番号を保持します。 |
イベント数 | タスクの数と同じになります。 |
セマフォ数 | ( mos.h 内で定義) |
| |
|
|
ブロック | サイズ | 詳細 |
スタック | ユーザーが任意に定義 | ローカル変数及び戻りアドレス、レジスタ値 |
スタックポインタ | | スタック使用位置 |
初期開始位置 | | タスクのメジャー関数のアドレス |
タスク状態変数 | | 実行状態及び、待ちイベント・セマフォ |
タスク優先度 | 4バイト | 小さな値ほど優先度が高く、0が最高優先順位です。 |
永久レジスタ退避領域 | 4×8バイト | 一時レジスタはスタックに保存されますが、永久レジスタはタスク毎に退避領域を持っています。 |
|
|
タスク毎に32ビットのイベントフラグを持っています。
割り込みハンドラ内からもイベントが発行できるAPIが用意されています。
|
|
mos.h をカスタマイズする事でセマフォの数を増やす事ができます。
セマフォの解放でディレイ無く該当のセマフォをウェイトしていたタスクをディスパッチできます。
|
|
tasks.c 及び mos.h をカスタマイズします。
|
|
|
5.1. ユーザーが設定するタスク情報
|
≪
TOP
≫
|
|
tasks.c 内のタスク管理テーブルで以下の項目を設定します。
項目 | 説明 |
スタートアドレス | タスクのメジャー関数のアドレス |
優先順位 | タスク優先順位は値が小さいほど優先度が高く、0が最高優先順位です。 |
初期実行状態 | osapi.h に定義されているタスク状態定数のうちのいずれか |
また、 mos.h 内でタスク数及び使用するセマフォの数を定義します。
|
|
スタックサイズをカスタマイズできます。( mos.h 内で定義)
但し、全てのタスクに同じサイズのスタックが適用されます。
|
|
全てのタスクの実行に先立って、
void InitHandler(void);
が呼び出されます。
InitHandler() はユーザーがシステムの初期化コードを記述するためのプレースホルダです。
|
|
OS は下記APIを提供します。
API | 説明 |
SetPriority | タスクのプライオリティを変更(設定)する |
SetEvent | イベントを発行する |
ClearEvent | イベントをクリアする。 |
RefEvent | イベントフラグを参照する |
WaitEvent | イベント待ちに入る |
WaitSem | セマフォをウェイトする |
ReleaseSem | セマフォをリリースする |
ResetTask | タスクを強制的にリセット(リスタート)する |
TerminateTask | タスクを強制的に止める |
TaskAbort | タスクを終了する。 |
SetEventInt | イベントを発行する(割込み中で使用) |
|
|
関数名 : SetPriority
概要 : タスクのプライオリティを変更(設定)する
コーリングシーケンス : unsigned long SetPriority(unsigned long pr);
戻り値 : unsigned long : 直前のプライオリティ
引数
引数 | 説明 |
unsigned long pr | 新しいプライオリティ |
備考 :
|
|
関数名 : SetEvent
概要 : イベントを発行する
コーリングシーケンス : void SetEvent(long id, unsigned long efg);
戻り値 : void
引数
引数 | 説明 |
int id | 発行する先のタスク番号(0〜) |
unsigned long efg | 発行するイベントのビット |
備考 :
|
|
関数名 : ClearEvent
概要 : イベントをクリアする。
コーリングシーケンス : void ClearEvent(long id);
戻り値 : void
引数
引数 | 説明 |
int id | クリアするイベントID(タスク番号) |
備考 :
|
|
関数名 : RefEvent
概要 : イベントフラグを参照する
コーリングシーケンス : unsigned long RefEvent(void);
戻り値 : unsigned long : 現在のタスクのイベントフラグ
引数
引数 | 説明 |
void | クリアするイベントID(タスク番号) |
備考 :
|
|
関数名 : WaitEvent
概要 : イベント待ちに入る
コーリングシーケンス : unsigned long WaitEvent(unsigned long wev);
戻り値 : unsigned long : 現在のイベントフラグ
引数
引数 | 説明 |
unsigned long wev | 待つべきイベントビット |
備考 :
|
|
関数名 : WaitSem
概要 : セマフォをウェイトする
コーリングシーケンス : long WaitSem(long sId);
戻り値 : long : 正常終了=セマフォ番号(0〜)、異常=−1
引数
引数 | 説明 |
long sId | セマフォ番号(0〜) |
備考 :
|
|
関数名 : ReleaseSem
概要 : セマフォをリリースする
コーリングシーケンス : void ReleaseSem(long sId);
戻り値 : void
引数
引数 | 説明 |
long sId | セマフォ番号(0〜) |
備考 :
|
|
関数名 : ResetTask
概要 : タスクを強制的にリセット(リスタート)する
コーリングシーケンス : void ResetTask(long id, void *f(void));
戻り値 : void
引数
引数 | 説明 |
int id | タスク番号(0〜) |
void *f(void) | リスタートアドレス(0の場合はデフォルトのスタートアドレス) |
備考 : タスクが自分のタスクをリセットする事は出来ません。定義初期状態が停止でも、実行状態で開始します。
|
|
|
6.9. TerminateTask
|
≪
TOP
≫
|
|
関数名 : TerminateTask
概要 : タスクを強制的に止める
コーリングシーケンス : void TerminateTask(long id);
戻り値 : void
引数
備考 : タスクが自分のタスクを TerminateTask() で停止する事は出来ません。その場合は、TaskAbort() を使用します。
|
|
関数名 : TaskAbort
概要 : タスクを終了する。
コーリングシーケンス : void TaskAbort(void);
戻り値 : void
引数
備考 : タスクが自分のタスクを終了したい時に呼び出します。
|
|
|
6.11. SetEventInt
|
≪
TOP
≫
|
|
関数名 : SetEventInt
概要 : イベントを発行する(割込み中で使用)
コーリングシーケンス : void SetEventInt(long id, unsigned long efg);
戻り値 : void
引数
引数 | 説明 |
int id | イベントID(タスク番号) |
unsigned long efg | 発行するイベントフラグビット |
備考 :
|
|
割り込み関数でイベントを発行する場合は、割り込み関数をアセンブラで記述し、
C言語の処理関数を内部で呼び出します。
割り込みからの復帰は下記の例のようにタスクスイッチャにジャンプします。
割り込み関数定義の例
.glb __Switcher
.glb _ExceptHandlerXX
_ExceptHandlerXX:
.RVECTOR ***,_ExceptHandlerXX
;
PUSHM R14-R15
PUSHM R1-R5
;
(割り込み処理)
;
BRA __Switcher
;
|
割り込みからの復帰は、__Switcher にジャンプする事で行います。
R14-R15、R1-R5 以外のレジスタをスタック退避した場合は、__Switcher にジャンプする前に、
復元する必要があります。
|
|
8. レジスタ、スタックコンベンション
|
≪
TOP
≫
|
|
|
|
レジスタコンベンション
レジスタ | コンベンション |
R0 | スタックポインタ |
R1-R5 | 一時レジスタ |
R14-R15 | 一時レジスタ |
R6-R13 | 永久レジスタ |
|
|
|
8.2.1. RTE 命令実行時のスタック状態
|
≪
TOP
≫
|
|
アドレス | 内容 |
SP | リターンアドレス |
SP+4 | PSW |
|
|
|
8.3. ディスパッチ直前のスタック状態
|
≪
TOP
≫
|
|
アドレス | 内容 |
SP | R1-R5, R14-R15 |
SP+(7*4) | リターンアドレス |
SP+(7*4)+4 | PSW |
|
|
ソースファイル | 詳細 |
osStart.src | スタートアッププログラム(アセンブラ) |
criticalfunc.src | 特殊関数群(アセンブラ) |
ostool.c | OS API関数群 |
osapi.h | APIプロトタイプヘッダファイル |
ユーザーがカスタマイズするべきファイル | 詳細 |
tasks.c | タスクアドレス、タスク優先順位の定義 |
mos.h | タスクに関するパラメータ(タスク数、セマフォ数、スタックサイズ) |
mos.h
#ifndef __MOS_H__
#define __MOS_H__
#define TASK_NUM 3 // タスク数
#define STACK_SPACE 0x400 // count of long word
#define SEM_MAX 2 // セマフォの数
#endif //__MOS_H__
|
tasks.c
#include"monitor.h"
#include"osapi.h"
extern void Task0(void); // ← アプリケーションで定義
extern void Task1(void); // ← アプリケーションで定義
extern void Task2(void); // ← アプリケーションで定義
struct REGISTER_FRM tskFrm[TASK_NUM]=
{ // 0, タスクエントリ, 優先順位, 実行状態
{0,Task0, 1, TASK_STAT_RUN}, // ← アプリケーションでカスタマイズ
{0,Task1, 5, TASK_STAT_RUN}, // ← アプリケーションでカスタマイズ
{0,Task2, 15, TASK_STAT_STP} // ← アプリケーションでカスタマイズ
};
|
|
|
・高速通信など速度が要求される割り込みハンドラ内でスケジューラを呼ぶ場合、性能評価を厳密に行って下さい。
これは、タスクが増えるとスケジューラの処理が大きくなり、割り込み処理の応答性が落ちるためです。
・本OSでは、CPUの高速割り込みには対応していません。また、浮動小数点は全タスク共通となり、タスク毎に
個別の設定を行ったり、タスク毎に異常演算を検出する事は出来ません。
・本OSでは、全てのタスクをカーネルモードでのみ動かす仕様となっています。
これはソフトウェアの構造をシンプルにするための選択です。
|
| |