第12章  サービス・コール
 本章では,RI78V4が提供しているサービス・コールについて解説しています。
 
 RI78V4が提供しているサービス・コールは,ユーザが記述した処理プログラムからRI78V4が管理している資源(タスク,セマフォなど)を間接的に操作するために用意されたサービス・ルーチンです。
 
 以下に,RI78V4が提供しているサービス・コールを管理モジュール別に示します。
 
 サービス・コールをC言語,またはアセンブリ言語で記述された処理プログラムから呼び出す方法を以下に示します。
 
 通常のC言語関数と同様の方法で呼び出しを行うことにより,サービス・コールのパラメータはRI78V4に引き数として渡され,該当処理が実行されます。
 
 【 C言語におけるサービス・コールの呼び出しイメージ 】
 
 	
  
  
    
 #include        <kernel.h>              /*標準ヘッダ・ファイルの定義*/
 
 #include        <kernel_id.h>           /*システム情報ヘッダ・ファイルの定義*/
 
 
 
 void
 
 func_task ( VP_INT exinf )
 
 {
         ER      ercd;                   /*変数の宣言*/
         ID      tskid = ID_tskA;        /*変数の宣言,初期化*/
 
 
         ercd = act_tsk ( tskid );       /*サービス・コールの呼び出し*/
 
 
         ............
         ............
 
 
         ext_tsk ( );                    /*自タスクの終了*/
 }
 
 | 
  
 
 
 備考 RI78V4が提供するサービス・コールを処理プログラムから呼び出す場合,以下に示したヘッダ・ファイルの定義(インクルード処理)が必要となります。
 
 kernel.h:	標準ヘッダ・ファイル(C言語用)
 
 kernel_id.h:	システム情報ヘッダ・ファイル(C言語用)
 
 アセンブラの関数呼び出し規約にしたがってパラメータの設定を行ったのち,CALL命令で呼び出しを行うことにより,サービス・コールのパラメータはRI78V4に引き数として渡され,該当処理が実行されます。
 
 【 アセンブリ言語におけるサービス・コールの呼び出しイメージ 】
 
 	
  
  
    
 $INCLUDE        (kernel.inc)            ;標準ヘッダ・ファイルの定義
 
 $INCLUDE        (kernel_id.inc)         ;システム情報ヘッダ・ファイルの定義
 
 
 
         .SECTION .bss, BSS
 _ercd:
 
         DS      (2)                     ;戻り値の保存用領域を確保
 
 
        .PUBLIC  _func_task
        .SECTION  .textf, TEXTF
 _func_task:
 
         MOV     A, #ID_tskA             ;パラメータの設定
         CALL    !!_act_tsk              ;サービス・コールの呼び出し
         MOVW    !LOWW(_ercd), AX        ;戻り値の設定
 
 
         ............
         ............
 
 
         CALL    !!_ext_tsk              ;自タスクの終了
         BR      !!__kernel_int_exit     ;カーネル終了処理へ分岐
 | 
  
 
 
 備考 RI78V4が提供するサービス・コールを処理プログラムから呼び出す場合,以下に示したヘッダ・ファイルの定義(インクルード処理)が必要となります。
 
 kernel.inc:	標準ヘッダ・ファイル(アセンブリ言語用)
 
 kernel_id.inc:	システム情報ヘッダ・ファイル(アセンブリ言語用)
 
 RI78V4では,サービス・コールの前処理/後処理でPC,PSW,HLといったレジスタ群の値を“該当サービス・コールを発行した処理プログラムのスタック(タスク・スタック,またはシステム・スタック)”に退避/復帰する処理を行っています。
 
 また,サービス・コールの引き数を格納するための領域として“該当サービス・コールを発行した処理プログラムのスタック”が,サービス・コールの内部処理を実行する際に必要となるスタック領域として“システム・スタック”が使用されます。
 
 したがって,タスク・スタック,システム・スタックの各領域を確保する際には,“サービス・コールの発行に伴うスタックの消費”を考慮する必要があります。
 
 以下に,サービス・コールの発行に伴い必要となる各スタックのサイズを示します。
 
 表12-1  サービス・コールのスタック使用量(単位:バイト)
 
 RI78V4が提供するサービス・コールを発行する際に使用するデータ・マクロ(データ・タイプ,現在状態など)について以下に示します。
 
 以下に,サービス・コールを発行する際に指定する各種パラメータのデータ・タイプを示します。
 
 なお,データ・タイプのマクロ定義は,標準ヘッダ・ファイル<ri_root>
\include\kernel.hから呼び出されるヘッダ・ファイル<ri_root>
\os
\types.hで行われています。
 
 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 データ・タイプが一定しない値(ポインタ),または符号付き32ビット整数
  
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
  
    | 
 | 
    
 | 
    
 | 
  
 
 注	 RI78V4のID型の定義は,μITRON4.0仕様の定義と異なります。
 
 なお,現在状態のマクロ定義は,標準ヘッダ・ファイル<ri_root>
\include\kernel.hで行われています。
 
 以下に,サービス・コール(
ref_tsk)の発行により獲得されるWAITING種別を示します。
 
 なお,WAITING種別のマクロ定義は,標準ヘッダ・ファイル<ri_root>
\include\kernel.hで行われています。
 
 なお,戻り値のマクロ定義は,標準ヘッダ・ファイル<ri_root>
\include\kernel.hで行われています。
 
 RI78V4のヘッダ・ファイルは,以下のマクロにより条件コンパイルされます。
 
 以下に,サービス・コールを発行する際に使用するその他のマクロを示します。
 
 なお,その他のマクロのマクロ定義は,標準ヘッダ・ファイル<ri_root>
\include\kernel.hで行われています。
 
 RI78V4が提供するサービス・コールを発行する際に使用するデータ構造体(タスク状態情報,セマフォ状態情報など)について以下に示します。
 
 以下に,
ref_tskを発行する際に使用するタスク状態情報T_RTSKを示します。
 
 なお,タスク状態情報T_RTSKの定義は,標準ヘッダ・ファイル<ri_root>
\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>
\include\os\{packet.h,packet.inc}で行われています。
 
  	
  
  
    
 typedef struct  t_rtsk {
         STAT    tskstat;        /*現在状態*/
         PRI     tskpri;         /*現在優先度*/
         PRI     tskbpri;        /*システム予約領域*/
         STAT    tskwait;        /*待ち要因*/
         ID      wobjid;         /*管理オブジェクトのID*/
         TMO     lefttmo;        /*システム予約領域*/
         UINT    actcnt;         /*起動要求数*/
         UINT    wupcnt;         /*起床要求数*/
         UINT    suscnt;         /*サスペンド要求数*/
 } T_RTSK;
 
 | 
  
 
  	
  
  
    
 rtsk_tskstat    .EQU     0x00     ;現在状態
 
 rtsk_tskpri     .EQU     0x02     ;現在優先度
 
 rtsk_tskbpri    .EQU     0x03     ;システム予約領域
 
 rtsk_tskwait    .EQU     0x04     ;待ち要因
 
 rtsk_wobjid     .EQU     0x06     ;管理オブジェクトのID
 
 rtsk_lefttmo    .EQU     0x08     ;システム予約領域
 
 rtsk_actcnt     .EQU     0x0c     ;起動要求数
 
 rtsk_wupcnt     .EQU     0x0e     ;起床要求数
 
 rtsk_suscnt     .EQU     0x10     ;サスペンド要求数
 
 | 
  
 
 以下に,タスク状態情報T_RTSKの詳細を示します。
 
 -	 tskstat,rtsk_tskstat
タスクの現在状態が格納されます。
 
 TTS_WAS:	WAITING-SUSPENDED状態
 
 -	 tskpri,rtsk_tskpri
タスクの現在優先度が格納されます。
 
 -	 tskbpri,rtsk_tskbpri
システム予約領域です。
 
 -	 tskwait,rtsk_tskwait
WAITING種別(WAITING状態の種類)が格納されます。
 
 TTW_NONE:	WAITING状態に遷移していない
 
 -	 wobjid,rtsk_wobjid
タスクがWAITING状態へと遷移するきっかけとなった管理オブジェクト(セマフォ,イベントフラグなど)のIDが格納されます。
 
 -	 lefttmo,rtsk_lefttmo
システム予約領域です。
 
 -	 actcnt,rtsk_actcnt
タスクの起動要求数が格納されます。
 
 -	 wupcnt,rtsk_wupcnt
タスクの起床要求数が格納されます。
 
 -	 suscnt,rtsk_suscnt
タスクのサスペンド要求数が格納されます。
 
 以下に,
ref_semを発行する際に使用するセマフォ状態情報T_RSEMを示します。
 
 なお,セマフォ状態情報T_RSEMの定義は,標準ヘッダ・ファイル<ri_root>
\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>
\include\os\{packet.h,packet.inc}で行われています。
 
  	
  
  
    
 typedef struct  t_rsem {
         ID      wtskid;         /*待ちタスクの有無*/
         UINT    semcnt;         /*現在資源数*/
 } T_RSEM;
 
 | 
  
 
  	
  
  
    
 rsem_wtskid     .EQU     0x00     ;待ちタスクの有無
 
 rsem_semcnt     .EQU     0x02     ;現在資源数
 
 | 
  
 
 以下に,セマフォ状態情報T_RSEMの詳細を示します。
 
 -	 wtskid,rsem_wtskid
セマフォの待ちキューにタスクがキューイングされているか否かが格納されます。
 
 TSK_NONE:	待ちキューにタスクはキューイングされていない
 
 その他:	待ちキューの先頭にキューイングされているタスクのID
 
 -	 semcnt,rsem_semcnt
セマフォの現在資源数が格納されます。
 
 以下に,
ref_flgを発行する際に使用するイベントフラグ状態情報T_RFLGを示します。
 
 なお,イベントフラグ状態情報T_RFLGの定義は,標準ヘッダ・ファイル<ri_root>
\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>
\include\os\{packet.h,packet.inc}で行われています。
 
  	
  
  
    
 typedef struct  t_rflg {
         ID      wtskid;         /*待ちタスクの有無*/
         FLGPTN  flgptn;         /*現在ビット・パターン*/
 } T_RFLG;
 
 | 
  
 
  	
  
  
    
 rflg_wtskid     .EQU     0x00     ;待ちタスクの有無
 
 rflg_flgptn     .EQU     0x02     ;現在ビット・パターン
 
 | 
  
 
 以下に,イベントフラグ状態情報T_RFLGの詳細を示します。
 
 -	 wtskid,rflg_wtskid
イベントフラグの待ちキューにタスクがキューイングされているか否かが格納されます。
 
 TSK_NONE:	待ちキューにタスクはキューイングされていない
 
 その他:	待ちキューの先頭にキューイングされているタスクのID
 
 -	 flgptn,rflg_flgptn
イベントフラグの現在ビット・パターンが格納されます。
 
 以下に,
ref_dtqを発行する際に使用するデータ・キュー詳細情報T_RDTQを示します。
 
 なお,データ・キュー詳細情報T_RDTQの定義は,標準ヘッダ・ファイル<ri_root>
\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>
\include\os\{packet.h,packet.inc}で行われています。
 
  	
  
  
    
 typedef struct  t_rdtq {
         ID      stskid;         /*データ送信待ちタスクの有無*/
         ID      rtskid;         /*データ受信待ちタスクの有無*/
         UINT    sdtqcnt;        /*未受信データの総数*/
 } T_RDTQ;
 
 | 
  
 
  	
  
  
    
 rdtq_stskid     .EQU     0x00     ;データ送信待ちタスクの有無
 rdtq_rtskid     .EQU     0x01     ;データ受信待ちタスクの有無
 rdtq_sdtqcnt    .EQU     0x02     ;未受信データの総数
 
 | 
  
 
 以下に,データ・キュー詳細情報T_RDTQの詳細を示します。
 
 -	 stskid
データ・キューの送信待ちキューにタスクがキューイングされているか否かが格納されます。
 
 TSK_NONE:	送信待ちキューにタスクはキューイングされていない
 
 その他:	送信待ちキューの先頭にキューイングされているタスクのID
 
 -	 rtskid
データ・キューの受信待ちキューにタスクがキューイングされているか否かが格納されます。
 
 TSK_NONE:	受信待ちキューにタスクはキューイングされていない
 
 その他:	受信待ちキューの先頭にキューイングされているタスクのID
 
 -	 sdtqcnt
データ・キューのデータ・キュー領域にキューイングされている未受信データの総数が格納されます。
 
 なお,メッセージT_MSG,T_MSG_PRIの定義は,標準ヘッダ・ファイル<ri_root>
\include\kernel.hから呼び出されるヘッダ・ファイル<ri_root>
\include\os\types.hで行われています。
 
 【 TA_MFIFO属性用メッセージT_MSGの構造 】
 
 	
  
  
    
 typedef struct  t_msg {
         struct  t_msg   __near   *msgque;        /*システム予約領域*/
 } T_MSG;
 
 | 
  
 
 
 【 TA_MPRI属性用メッセージT_MSG_PRIの構造 】
 
 	
  
  
    
 typedef struct  t_msg_pri {
         struct  t_msg   __near   *msgque;        /*システム予約領域*/
         PRI     msgpri;                         /*優先度*/
 } T_MSG_PRI;
 
 | 
  
 
 
 以下に,メッセージT_MSG,T_MSG_PRIの詳細を示します。
 
 -	 msgpri
メッセージの優先度が格納されます。
 
 備考1 RI78V4におけるメッセージの優先度は,その値が小さいほど,高い優先度であることを意味します。
 
 備考2 メッセージの優先度として指定可能な値は,“1~31”に限られます。
 
 以下に,
ref_mbxを発行する際に使用するメールボックス状態情報T_RMBXを示します。
 
 なお,メールボックス状態情報T_RMBXの定義は,標準ヘッダ・ファイル<ri_root>
\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>
\include\os\{packet.h,packet.inc}で行われています。
 
  	
  
  
    
 typedef struct  t_rmbx {
         ID      wtskid;                 /*待ちタスクの有無*/
         T_MSG   __near   *pk_msg;       /*待ちメッセージの有無*/
 } T_RMBX;
 
 | 
  
 
  	
  
  
    
 rmbx_wtskid     .EQU     0x00             ;待ちタスクの有無
 
 rmbx_pk_msg     .EQU     0x02             ;待ちメッセージの有無
 
 | 
  
 
 以下に,メールボックス状態情報T_RMBXの詳細を示します。
 
 -	 wtskid,rmbx_wtskid
メールボックスの待ちキューにタスクがキューイングされているか否かが格納されます。
 
 TSK_NONE:	待ちキューにタスクはキューイングされていない
 
 その他:	待ちキューの先頭にキューイングされているタスクのID
 
 -	 pk_msg,rmbx_pk_msg
メールボックスの待ちキューにメッセージがキューイングされているか否かが格納されます。
 
 NULL:	待ちキューにメッセージはキューイングされていない
 
 その他:	待ちキューの先頭にキューイングされているメッセージの先頭アドレス
 
 以下に,
ref_mpfを発行する際に使用する固定長メモリ・プール状態情報T_RMPFを示します。
 
 なお,固定長メモリ・プール状態情報T_RMPFの定義は,標準ヘッダ・ファイル<ri_root>
\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>
\include\os\{packet.h,packet.inc}で行われています。
 
  	
  
  
    
 typedef struct  t_rmpf {
         ID      wtskid;         /*待ちタスクの有無*/
         UINT    fblkcnt;        /*空きメモリ・ブロックの総数*/
 } T_RMPF;
 
 | 
  
 
  	
  
  
    
 rmpf_wtskid     .EQU     0x00     ;待ちタスクの有無
 
 rmpf_fblkcnt    .EQU     0x02     ;空きメモリ・ブロックの総数
 
 | 
  
 
 以下に,固定長メモリ・プール状態情報T_RMPFの詳細を示します。
 
 -	 wtskid,rmpf_wtskid
固定長メモリ・プールの待ちキューにタスクがキューイングされているか否かが格納されます。
 
 TSK_NONE:	待ちキューにタスクはキューイングされていない
 
 その他:	待ちキューの先頭にキューイングされているタスクのID
 
 -	 fblkcnt,rmpf_fblkcnt
固定長メモリ・プールから獲得可能な空きメモリ・ブロックの総数が格納されます。
 
 以下に,
ref_cycを発行する際に使用する周期ハンドラ状態情報T_RCYCを示します。
 
 なお,周期ハンドラ状態情報T_RCYCの定義は,標準ヘッダ・ファイル<ri_root>
\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>
\include\os\{packet.h,packet.inc}で行われています。
 
  	
  
  
    
 typedef struct  t_rcyc {
         STAT    cycstat;        /*現在状態*/
         RELTIM  lefttim;        /*残り時間*/
 } T_RCYC;
 
 | 
  
 
  	
  
  
    
 rcyc_cycstat    .EQU     0x00     ;現在状態
 
 rcyc_lefttim    .EQU     0x02     ;残り時間
 
 | 
  
 
 以下に,周期ハンドラ状態情報T_RCYCの詳細を示します。
 
 -	 cycstat,rcyc_cycstat
周期ハンドラの現在状態が格納されます。
 
 -	 lefttim,rcyc_lefttim
周期ハンドラが次に起動するまでの残り時間(単位:ティック)が格納されます。
なお,対象周期ハンドラが動作停止状態(STP状態)の場合には,本メンバの内容は不定値となります。
 
 以下に,
ref_verを発行する際に使用するバージョン情報T_RVERを示します。
 
 なお,バージョン情報T_RVERの定義は,標準ヘッダ・ファイル<ri_root>
\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>
\include\os\{packet.h,packet.inc}で行われています。
 
  	
  
  
    
 typedef struct  t_rver {
         UH      maker;          /*メーカ・コード*/
         UH      prid;           /*識別番号*/
         UH      spver;          /*ITRON仕様のバージョン番号*/
         UH      prver;          /*カーネルのバージョン番号*/
         UH      prno[4];        /*管理情報*/
 } T_RVER;
 
 | 
  
 
  	
  
  
    
 verinf_maker    .EQU     0x00     ;メーカ・コード
 
 verinf_prid     .EQU     0x02     ;識別番号
 
 verinf_spver    .EQU     0x04     ;ITRON仕様のバージョン番号
 
 verinf_prver    .EQU     0x06     ;カーネルのバージョン番号
 
 verinf_prno     .EQU     0x08     ;管理情報
 
 | 
  
 
 以下に,バージョン情報T_RVERの詳細を示します。
 
 -	 maker,verinf_maker
カーネルのメーカ・コードが格納されます。
 
 -	 prid,verinf_prid
カーネルの識別番号が格納されます。
 
 -	 spver,verinf_spver
カーネルが準拠しているITRON仕様のバージョン番号が格納されます。
 
 0x5403:	μITRON4.0仕様Ver.4.03.03
 
 -	 prver,verinf_prver
カーネルのバージョン番号が格納されます。
 
 -	 prno[0],verinf_prno
カーネルの版数が格納されています。
 
 -	 prno[1],verinf_prno + 0x2
カーネルのメモリ・モデルが格納されています。
 
 -	 prno[2],verinf_prno + 0x4
システム予約領域です。
 
 -	 prno[3],verinf_prno + 0x6
システム予約領域です。