Universal Device Network
HOME ソフトウェア製品 マイコン組込関連製品  組織  お問い合わせ
 
  マイコン組込リアルタイムOS(UDN-OS for RX6x)

インデックス
1.  概要
  1.1.  特徴
2.  開発環境
3.  UDN-OS for RX6x 導入手順
  3.1.  プロジェクトの作成
  3.2.  ソースファイルの編集
4.  マルチタスクの管理
  4.1.  タスクID
  4.2.  タスク状態
  4.3.  スケジューラ
  4.4.  管理エリア
  4.5.  タスクフレーム
  4.6.  イベント
  4.7.  セマフォ
5.  タスク定義
  5.1.  ユーザーが設定するタスク情報
  5.2.  スタックサイズ
  5.3.  初期化ルーチン
6.  API
  6.1.  SetPriority
  6.2.  SetEvent
  6.3.  ClearEvent
  6.4.  RefEvent
  6.5.  WaitEvent
  6.6.  WaitSem
  6.7.  ReleaseSem
  6.8.  ResetTask
  6.9.  TerminateTask
  6.10.  TaskAbort
  6.11.  SetEventInt
7.  割り込み関数定義
8.  レジスタ、スタックコンベンション
  8.1.  RXコンパイラ仕様
  8.2.  RX CPU仕様
    8.2.1.  RTE 命令実行時のスタック状態
  8.3.  ディスパッチ直前のスタック状態
9.  ファイル構成
10.  注意事項、制限事項


 1.  概要   TOP   

UDN-OS for RX6x はルネサスRXマイコン用にカスタマイズしたUDNオリジナルのマイコン用 マルチタスクOSです。 イベントフラグやセマフォでタスクをスイッチングできます。
最近のマイコンは通信やセンサ、その他のデバイスなどシステムが増大する傾向にあります。 そのような環境で、UDN-OS for RX6x は威力を発揮します。 マルチタスクOSは複雑な並行処理のプログラミングを簡略化できます。


  1.1.  特徴   TOP   
・少ないOSメモリ使用量(プログラムコード2KB以下)
・タスク数に制限無し
・リアルタイムで軽いタスクスイッチング
・イベントフラグとセマフォが利用可能
・高いポータビリティで各種マイコンに対応



 2.  開発環境   TOP   

 開発ツール メーカー
  CS+ for CC V.3.03.00 ルネサス エレクトロニクス


 3.  UDN-OS for RX6x 導入手順   TOP   


  3.1.  プロジェクトの作成   TOP   
・サンプルプロジェクトをコピーし、ユーザーが作成するソースをプロジェクトに追加する。


  3.2.  ソースファイルの編集   TOP   
・タスク管理テーブル(tasks.c )にユーザータスクのスタートアドレスおよびスタックなどを設定。
・タスクの実体となる関数を作成する。
・初期化ルーチン(InitHandler())の内容を作成する。


 4.  マルチタスクの管理   TOP   


  4.1.  タスクID   TOP   
タスクIDは、タスク定義の順に、0(ゼロ)から番号が割り振られます。
よって、タスクが3個の場合は、IDはそれぞれ、0、1、2 となります。


  4.2.  タスク状態   TOP   
 タスク状態 詳細
 停止中 実行されません。
 実行中・実行待ち 実際に実行中のタスクと実行待ちのタスクの状態は同じステータスです。
優先順位で実行タスクが決まります。
 イベント待ち イベント発生で実行中・実行待ちへ移行します。
 セマフォ待ち 利用可能なセマフォが得られると実行中・実行待ちへ移行します。
※ タスク状態の定数は、osapi.h 内で定義されています。


  4.3.  スケジューラ   TOP   
スケジューラは次の局面で動作します。
 スケジューラ動作条件 詳細
 割り込みからの復帰 割り込みから通常処理に復帰する場合のみ(多重割り込みからの復帰では呼び出されない)
割り込み内でイベントセットを行う割り込みはハンドラをアセンブラで記述し、戻りで
__Switcher にジャンプする必要があります。
 イベントAPIの呼び出し 通常処理または割り込み処理からのイベント発行APIの呼び出し時
 セマフォAPIの呼び出し 通常処理からのセマフォのリリースAPIの呼び出し時
(割り込みハンドラでセマフォをリリースする事は出来ません。)


  4.4.  管理エリア   TOP   

 フィールド 詳細
 タスク数 システム全体のタスクの数( mos.h 内で定義)
 実行中タスク 実行中のタスク番号を保持します。
 イベント数 タスクの数と同じになります。
 セマフォ数 ( mos.h 内で定義)
  


  4.5.  タスクフレーム   TOP   

 ブロック サイズ 詳細
 スタック ユーザーが任意に定義 ローカル変数及び戻りアドレス、レジスタ値
 スタックポインタ  スタック使用位置
 初期開始位置  タスクのメジャー関数のアドレス
 タスク状態変数  実行状態及び、待ちイベント・セマフォ
 タスク優先度 4バイト 小さな値ほど優先度が高く、0が最高優先順位です。
 永久レジスタ退避領域 4×8バイト 一時レジスタはスタックに保存されますが、永久レジスタはタスク毎に退避領域を持っています。


  4.6.  イベント   TOP   
タスク毎に32ビットのイベントフラグを持っています。
割り込みハンドラ内からもイベントが発行できるAPIが用意されています。


  4.7.  セマフォ   TOP   
mos.h をカスタマイズする事でセマフォの数を増やす事ができます。
セマフォの解放でディレイ無く該当のセマフォをウェイトしていたタスクをディスパッチできます。


 5.  タスク定義   TOP   


tasks.c   及び mos.h をカスタマイズします。


  5.1.  ユーザーが設定するタスク情報   TOP   
tasks.c 内のタスク管理テーブルで以下の項目を設定します。
 項目 説明
 スタートアドレス タスクのメジャー関数のアドレス
 優先順位 タスク優先順位は値が小さいほど優先度が高く、0が最高優先順位です。
 初期実行状態 osapi.h に定義されているタスク状態定数のうちのいずれか
また、 mos.h 内でタスク数及び使用するセマフォの数を定義します。


  5.2.  スタックサイズ   TOP   
スタックサイズをカスタマイズできます。( mos.h 内で定義)
但し、全てのタスクに同じサイズのスタックが適用されます。


  5.3.  初期化ルーチン   TOP   
全てのタスクの実行に先立って、
void InitHandler(void);
が呼び出されます。
InitHandler() はユーザーがシステムの初期化コードを記述するためのプレースホルダです。


 6.  API   TOP   

OS は下記APIを提供します。
 API 説明
 SetPriority  タスクのプライオリティを変更(設定)する
 SetEvent  イベントを発行する
 ClearEvent  イベントをクリアする。
 RefEvent  イベントフラグを参照する
 WaitEvent  イベント待ちに入る
 WaitSem  セマフォをウェイトする
 ReleaseSem  セマフォをリリースする
 ResetTask  タスクを強制的にリセット(リスタート)する
 TerminateTask  タスクを強制的に止める
 TaskAbort  タスクを終了する。
 SetEventInt  イベントを発行する(割込み中で使用)


  6.1.  SetPriority   TOP   
関数名 : SetPriority
概要 : タスクのプライオリティを変更(設定)する

コーリングシーケンス : unsigned long SetPriority(unsigned long pr);
戻り値 : unsigned long : 直前のプライオリティ

引数
 引数 説明
  unsigned long pr   新しいプライオリティ

備考 :


  6.2.  SetEvent   TOP   
関数名 : SetEvent
概要 : イベントを発行する

コーリングシーケンス : void SetEvent(long id, unsigned long efg);
戻り値 : void

引数
 引数 説明
  int id   発行する先のタスク番号(0〜)
  unsigned long efg   発行するイベントのビット

備考 :


  6.3.  ClearEvent   TOP   
関数名 : ClearEvent
概要 : イベントをクリアする。

コーリングシーケンス : void ClearEvent(long id);
戻り値 : void

引数
 引数 説明
  int id   クリアするイベントID(タスク番号)

備考 :


  6.4.  RefEvent   TOP   
関数名 : RefEvent
概要 : イベントフラグを参照する

コーリングシーケンス : unsigned long RefEvent(void);
戻り値 : unsigned long : 現在のタスクのイベントフラグ

引数
 引数 説明
  void  クリアするイベントID(タスク番号)

備考 :


  6.5.  WaitEvent   TOP   
関数名 : WaitEvent
概要 : イベント待ちに入る

コーリングシーケンス : unsigned long WaitEvent(unsigned long wev);
戻り値 : unsigned long : 現在のイベントフラグ

引数
 引数 説明
  unsigned long wev   待つべきイベントビット

備考 :


  6.6.  WaitSem   TOP   
関数名 : WaitSem
概要 : セマフォをウェイトする

コーリングシーケンス : long WaitSem(long sId);
戻り値 : long : 正常終了=セマフォ番号(0〜)、異常=−1

引数
 引数 説明
  long sId   セマフォ番号(0〜)

備考 :


  6.7.  ReleaseSem   TOP   
関数名 : ReleaseSem
概要 : セマフォをリリースする

コーリングシーケンス : void ReleaseSem(long sId);
戻り値 : void

引数
 引数 説明
  long sId   セマフォ番号(0〜)

備考 :


  6.8.  ResetTask   TOP   
関数名 : 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

引数
 引数 説明
  long id   タスクID

備考 : タスクが自分のタスクを TerminateTask() で停止する事は出来ません。その場合は、TaskAbort() を使用します。


  6.10.  TaskAbort   TOP   
関数名 : TaskAbort
概要 : タスクを終了する。

コーリングシーケンス : void TaskAbort(void);
戻り値 : void

引数
 引数 説明
  void  タスクID

備考 : タスクが自分のタスクを終了したい時に呼び出します。


  6.11.  SetEventInt   TOP   
関数名 : SetEventInt
概要 : イベントを発行する(割込み中で使用)

コーリングシーケンス : void SetEventInt(long id, unsigned long efg);
戻り値 : void

引数
 引数 説明
  int id   イベントID(タスク番号)
  unsigned long efg   発行するイベントフラグビット

備考 :






 7.  割り込み関数定義   TOP   

割り込み関数でイベントを発行する場合は、割り込み関数をアセンブラで記述し、 C言語の処理関数を内部で呼び出します。
割り込みからの復帰は下記の例のようにタスクスイッチャにジャンプします。

割り込み関数定義の例
      .glb   __Switcher
      .glb   _ExceptHandlerXX
_ExceptHandlerXX:
      .RVECTOR   ***,_ExceptHandlerXX
;
      PUSHM R14-R15
      PUSHM R1-R5
;
(割り込み処理)
;
      BRA      __Switcher
;
割り込みからの復帰は、__Switcher にジャンプする事で行います。
R14-R15、R1-R5 以外のレジスタをスタック退避した場合は、__Switcher にジャンプする前に、 復元する必要があります。



 8.  レジスタ、スタックコンベンション   TOP   


  8.1.  RXコンパイラ仕様   TOP   
レジスタコンベンション
 レジスタ コンベンション
 R0 スタックポインタ
 R1-R5 一時レジスタ
 R14-R15 一時レジスタ
 R6-R13 永久レジスタ


  8.2.  RX CPU仕様   TOP   

  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


 9.  ファイル構成   TOP   

 ソースファイル 詳細
 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}               // ← アプリケーションでカスタマイズ
};


 10.  注意事項、制限事項   TOP   

・高速通信など速度が要求される割り込みハンドラ内でスケジューラを呼ぶ場合、性能評価を厳密に行って下さい。
これは、タスクが増えるとスケジューラの処理が大きくなり、割り込み処理の応答性が落ちるためです。

・本OSでは、CPUの高速割り込みには対応していません。また、浮動小数点は全タスク共通となり、タスク毎に 個別の設定を行ったり、タスク毎に異常演算を検出する事は出来ません。

・本OSでは、全てのタスクをカーネルモードでのみ動かす仕様となっています。 これはソフトウェアの構造をシンプルにするための選択です。


 


Copyright© 2019 Universal Device Network All Rights Reserved.