Everything

第12章  サービス・コール


本章では,RI78V4が提供しているサービス・コールについて解説しています。
12.1 概  要
RI78V4が提供しているサービス・コールは,ユーザが記述した処理プログラムからRI78V4が管理している資源(タスク,セマフォなど)を間接的に操作するために用意されたサービス・ルーチンです。
以下に,RI78V4が提供しているサービス・コールを管理モジュール別に示します。
12.2 サービス・コールの呼び出し
サービス・コールをC言語,またはアセンブリ言語で記述された処理プログラムから呼び出す方法を以下に示します。
12.2.1 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言語用)
12.2.2 アセンブリ言語形式の呼び出し
アセンブラの関数呼び出し規約にしたがってパラメータの設定を行ったのち,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: システム情報ヘッダ・ファイル(アセンブリ言語用)
12.3 サービス・コールのスタック使用量
RI78V4では,サービス・コールの前処理/後処理でPC,PSW,HLといったレジスタ群の値を“該当サービス・コールを発行した処理プログラムのスタック(タスク・スタック,またはシステム・スタック)”に退避/復帰する処理を行っています。
また,サービス・コールの引き数を格納するための領域として“該当サービス・コールを発行した処理プログラムのスタック”が,サービス・コールの内部処理を実行する際に必要となるスタック領域として“システム・スタック”が使用されます。
したがって,タスク・スタック,システム・スタックの各領域を確保する際には,“サービス・コールの発行に伴うスタックの消費”を考慮する必要があります。
以下に,サービス・コールの発行に伴い必要となる各スタックのサイズを示します。
表12-1  サービス・コールのスタック使用量(単位:バイト)
サービス・コール名
発行元スタック
引き数用
発行元スタック
内部処理用
システム・スタック
内部処理用
0
10
6
0
10
6
0
10
6
0
10
12
0
10
12
0
10
16
0
10
6
0
10
12
0
10
14
0
10
6
0
10
6
0
10
8
0
10
12
0
10
6
0
10
6
0
10
14
0
10
6
0
10
12
0
10
12
0
10
12
0
10
6
0
10
6
0
10
6
8
10
16
0
10
16
4
10
16
0
10
6
0
10
16
0
10
16
4
10
16
0
10
6
0
10
14
0
10
14
4
10
14
0
10
6
0
10
8
0
10
12
0
10
12
4
10
12
0
10
6
0
10
14
0
10
14
4
10
14
0
10
6
0
10
6
0
10
12
0
10
6
0
10
6
0
10
8
0
10
6
0
10
6
0
10
8
0
10
6
0
10
6
0
10
6
0
10
6
0
10
6
0
10
6
0
10
6

12.4 データ・マクロ
RI78V4が提供するサービス・コールを発行する際に使用するデータ・マクロ(データ・タイプ,現在状態など)について以下に示します。
12.4.1 データ・タイプ
以下に,サービス・コールを発行する際に指定する各種パラメータのデータ・タイプを示します。
なお,データ・タイプのマクロ定義は,標準ヘッダ・ファイル<ri_root>\include\kernel.hから呼び出されるヘッダ・ファイル<ri_root>\os\types.hで行われています。
表12-2  データ・タイプ
マクロ

意味
UH
unsigned short int
符号なし16ビット整数
VP
void __near
データ・タイプが一定しない値(ポインタ)
UINT
unsigned int
符号なし16ビット整数
VP_INT
signed long int
データ・タイプが一定しない値(ポインタ),または符号付き32ビット整数
ID
unsigned char
ID
BOOL
signed int
真偽値
STAT
unsigned short int
現在状態,または待ち要因
ER
signed short int
戻り値
ER_UINT
unsigned short int
符号なし16ビット整数
PRI
signed char
優先度
FLGPTN
unsigned short int
ビット・パターン
MODE
unsigned char
要求条件
TMO
signed long int
待ち時間(単位:ティック)
RELTIM
unsigned long int
相対時間(単位:ティック)

注 RI78V4のID型の定義は,μITRON4.0仕様の定義と異なります。
12.4.2 現在状態
以下に,サービス・コール(ref_tskref_cyc)の発行により獲得される現在状態を示します。
なお,現在状態のマクロ定義は,標準ヘッダ・ファイル<ri_root>\include\kernel.hで行われています。
表12-3  現在状態
マクロ

意味
TTS_RUN
0x01
RUNNING状態
TTS_RDY
0x02
READY状態
TTS_WAI
0x04
WAITING状態
TTS_SUS
0x08
SUSPENDED状態
TTS_WAS
0x0c
WAITING-SUSPENDED状態
TTS_DMT
0x10
DORMANT状態
TCYC_STP
0x00
動作停止状態(STP状態)
TCYC_STA
0x01
動作開始状態(STA状態)

12.4.3 WAITING種別
以下に,サービス・コール(ref_tsk)の発行により獲得されるWAITING種別を示します。
なお,WAITING種別のマクロ定義は,標準ヘッダ・ファイル<ri_root>\include\kernel.hで行われています。
表12-4  WAITING種別
マクロ

意味
TTW_SLP
0x0001
slp_tsk,またはtslp_tskによる起床待ち状態
TTW_DLY
0x0002
dly_tskによる時間経過待ち状態
TTW_SEM
0x0004
wai_sem,またはtwai_semによる資源待ち状態
TTW_FLG
0x0008
wai_flg,またはtwai_flgによるイベントフラグ待ち状態
TTW_SDTQ
0x0010
snd_dtq,またはtsnd_dtqによるデータ送信待ち状態
TTW_RDTQ
0x0020
rcv_dtq,またはtrcv_dtqによるデータ受信待ち状態
TTW_MBX
0x0040
rcv_mbx,またはtrcv_mbxによるメッセージ待ち状態
TTW_MPF
0x2000
get_mpf,またはtget_mpfによるメモリ・ブロック待ち状態

12.4.4 戻 り 値
以下に,サービス・コールからの戻り値を示します。
なお,戻り値のマクロ定義は,標準ヘッダ・ファイル<ri_root>\include\kernel.hで行われています。
表12-5  戻り値
マクロ
数値
意味
E_OK
0
正常終了
E_ILUSE
-28
サービス・コールの使用方法が不正である
E_OBJ
-41
処理プログラムの現在状態が不正である
E_QOVR
-43
カウンタがオーバーフローした
E_RLWAI
-49
rel_wai,またはirel_waiの発行により,WAITING状態を強制的に解除された
E_TMOUT
-50
待ち時間が経過した
FALSE
0

TRUE
1


12.4.5 条件コンパイル・マクロ
RI78V4のヘッダ・ファイルは,以下のマクロにより条件コンパイルされます。
表12-6  条件コンパイル・マクロ
分類
マクロ
内容
Cコンパイラ・パッケージ
__REL__
CC-RLを使用

12.4.6 その他のマクロ
以下に,サービス・コールを発行する際に使用するその他のマクロを示します。
なお,その他のマクロのマクロ定義は,標準ヘッダ・ファイル<ri_root>\include\kernel.hで行われています。
表12-7  その他のマクロ
マクロ

意味
TSK_SELF
0
自タスク
TPRI_INI
0
初期優先度
TMO_FEVR
-1
永久待ち
TMO_POL
0
ポーリング
TWF_ANDW
0x00
AND待ち
TWF_ORW
0x01
OR待ち
TPRI_SELF
0
自タスクの現在優先度
TSK_NONE
0
タスクはキューイングされていない
NULL
0
メッセージはキューイングされていない

12.5 データ構造体
RI78V4が提供するサービス・コールを発行する際に使用するデータ構造体(タスク状態情報,セマフォ状態情報など)について以下に示します。
12.5.1 タスク状態情報
以下に,ref_tskを発行する際に使用するタスク状態情報T_RTSKを示します。
なお,タスク状態情報T_RTSKの定義は,標準ヘッダ・ファイル<ri_root>\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>\include\os\{packet.h,packet.inc}で行われています。
【 packet.h 】
 
 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;

【 packet.inc 】
 
 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_RUN: RUNNING状態
TTS_RDY: READY状態
TTS_WAI: WAITING状態
TTS_SUS: SUSPENDED状態
TTS_WAS: WAITING-SUSPENDED状態
TTS_DMT: DORMANT状態
- tskpri,rtsk_tskpri
タスクの現在優先度が格納されます。
- tskbpri,rtsk_tskbpri
システム予約領域です。
- tskwait,rtsk_tskwait
WAITING種別(WAITING状態の種類)が格納されます。
TTW_NONE: WAITING状態に遷移していない
TTW_SLP: slp_tsk,またはtslp_tskによる起床待ち状態
TTW_DLY: dly_tskによる時間経過待ち状態
TTW_SEM: wai_sem,またはtwai_semによる資源待ち状態
TTW_FLG: wai_flg,またはtwai_flgによるイベントフラグ待ち状態
TTW_SDTQ: snd_dtq,またはtsnd_dtqによるイベントフラグ待ち状態
TTW_RDTQ: rcv_dtq,またはtrcv_dtqによるイベントフラグ待ち状態
TTW_MBX: rcv_mbx,またはtrcv_mbxによるメッセージ待ち状態
TTW_MPF: get_mpf,またはtget_mpfによるメモリ・ブロック待ち状態
- wobjid,rtsk_wobjid
タスクがWAITING状態へと遷移するきっかけとなった管理オブジェクト(セマフォ,イベントフラグなど)のIDが格納されます。
- lefttmo,rtsk_lefttmo
システム予約領域です。
- actcnt,rtsk_actcnt
タスクの起動要求数が格納されます。
- wupcnt,rtsk_wupcnt
タスクの起床要求数が格納されます。
- suscnt,rtsk_suscnt
タスクのサスペンド要求数が格納されます。
12.5.2 セマフォ状態情報
以下に,ref_semを発行する際に使用するセマフォ状態情報T_RSEMを示します。
なお,セマフォ状態情報T_RSEMの定義は,標準ヘッダ・ファイル<ri_root>\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>\include\os\{packet.h,packet.inc}で行われています。
【 packet.h 】
 
 typedef struct  t_rsem {
         ID      wtskid;         /*待ちタスクの有無*/
         UINT    semcnt;         /*現在資源数*/
 } T_RSEM;

【 packet.inc 】
 
 rsem_wtskid     .EQU     0x00     ;待ちタスクの有無
 rsem_semcnt     .EQU     0x02     ;現在資源数

以下に,セマフォ状態情報T_RSEMの詳細を示します。
- wtskid,rsem_wtskid
セマフォの待ちキューにタスクがキューイングされているか否かが格納されます。
TSK_NONE: 待ちキューにタスクはキューイングされていない
その他: 待ちキューの先頭にキューイングされているタスクのID
- semcnt,rsem_semcnt
セマフォの現在資源数が格納されます。
12.5.3 イベントフラグ状態情報
以下に,ref_flgを発行する際に使用するイベントフラグ状態情報T_RFLGを示します。
なお,イベントフラグ状態情報T_RFLGの定義は,標準ヘッダ・ファイル<ri_root>\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>\include\os\{packet.h,packet.inc}で行われています。
【 packet.h 】
 
 typedef struct  t_rflg {
         ID      wtskid;         /*待ちタスクの有無*/
         FLGPTN  flgptn;         /*現在ビット・パターン*/
 } T_RFLG;

【 packet.inc 】
 
 rflg_wtskid     .EQU     0x00     ;待ちタスクの有無
 rflg_flgptn     .EQU     0x02     ;現在ビット・パターン

以下に,イベントフラグ状態情報T_RFLGの詳細を示します。
- wtskid,rflg_wtskid
イベントフラグの待ちキューにタスクがキューイングされているか否かが格納されます。
TSK_NONE: 待ちキューにタスクはキューイングされていない
その他: 待ちキューの先頭にキューイングされているタスクのID
- flgptn,rflg_flgptn
イベントフラグの現在ビット・パターンが格納されます。
12.5.4 データ・キュー詳細情報
以下に,ref_dtqを発行する際に使用するデータ・キュー詳細情報T_RDTQを示します。
なお,データ・キュー詳細情報T_RDTQの定義は,標準ヘッダ・ファイル<ri_root>\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>\include\os\{packet.h,packet.inc}で行われています。
【 packet.h 】
 
 typedef struct  t_rdtq {
         ID      stskid;         /*データ送信待ちタスクの有無*/
         ID      rtskid;         /*データ受信待ちタスクの有無*/
         UINT    sdtqcnt;        /*未受信データの総数*/
 } T_RDTQ;

【 packet.inc 】
 
 rdtq_stskid     .EQU     0x00     ;データ送信待ちタスクの有無
 rdtq_rtskid     .EQU     0x01     ;データ受信待ちタスクの有無
 rdtq_sdtqcnt    .EQU     0x02     ;未受信データの総数

以下に,データ・キュー詳細情報T_RDTQの詳細を示します。
- stskid
データ・キューの送信待ちキューにタスクがキューイングされているか否かが格納されます。
TSK_NONE: 送信待ちキューにタスクはキューイングされていない
その他: 送信待ちキューの先頭にキューイングされているタスクのID
- rtskid
データ・キューの受信待ちキューにタスクがキューイングされているか否かが格納されます。
TSK_NONE: 受信待ちキューにタスクはキューイングされていない
その他: 受信待ちキューの先頭にキューイングされているタスクのID
- sdtqcnt
データ・キューのデータ・キュー領域にキューイングされている未受信データの総数が格納されます。
12.5.5 メッセージ
以下に,snd_mbxrcv_mbxprcv_mbx,および,trcv_mbxを発行する際に使用するメッセージT_MSG,T_MSG_PRIを示します。
なお,メッセージ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の詳細を示します。
- msgque
システム予約領域です。
- msgpri
メッセージの優先度が格納されます。
備考1 RI78V4におけるメッセージの優先度は,その値が小さいほど,高い優先度であることを意味します。
備考2 メッセージの優先度として指定可能な値は,“1~31”に限られます。
12.5.6 メールボックス状態情報
以下に,ref_mbxを発行する際に使用するメールボックス状態情報T_RMBXを示します。
なお,メールボックス状態情報T_RMBXの定義は,標準ヘッダ・ファイル<ri_root>\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>\include\os\{packet.h,packet.inc}で行われています。
【 packet.h 】
 
 typedef struct  t_rmbx {
         ID      wtskid;                 /*待ちタスクの有無*/
         T_MSG   __near   *pk_msg;       /*待ちメッセージの有無*/
 } T_RMBX;

【 packet.inc 】
 
 rmbx_wtskid     .EQU     0x00             ;待ちタスクの有無
 rmbx_pk_msg     .EQU     0x02             ;待ちメッセージの有無

以下に,メールボックス状態情報T_RMBXの詳細を示します。
- wtskid,rmbx_wtskid
メールボックスの待ちキューにタスクがキューイングされているか否かが格納されます。
TSK_NONE: 待ちキューにタスクはキューイングされていない
その他: 待ちキューの先頭にキューイングされているタスクのID
- pk_msg,rmbx_pk_msg
メールボックスの待ちキューにメッセージがキューイングされているか否かが格納されます。
NULL: 待ちキューにメッセージはキューイングされていない
その他: 待ちキューの先頭にキューイングされているメッセージの先頭アドレス
12.5.7 固定長メモリ・プール状態情報
以下に,ref_mpfを発行する際に使用する固定長メモリ・プール状態情報T_RMPFを示します。
なお,固定長メモリ・プール状態情報T_RMPFの定義は,標準ヘッダ・ファイル<ri_root>\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>\include\os\{packet.h,packet.inc}で行われています。
【 packet.h 】
 
 typedef struct  t_rmpf {
         ID      wtskid;         /*待ちタスクの有無*/
         UINT    fblkcnt;        /*空きメモリ・ブロックの総数*/
 } T_RMPF;

【 packet.inc 】
 
 rmpf_wtskid     .EQU     0x00     ;待ちタスクの有無
 rmpf_fblkcnt    .EQU     0x02     ;空きメモリ・ブロックの総数

以下に,固定長メモリ・プール状態情報T_RMPFの詳細を示します。
- wtskid,rmpf_wtskid
固定長メモリ・プールの待ちキューにタスクがキューイングされているか否かが格納されます。
TSK_NONE: 待ちキューにタスクはキューイングされていない
その他: 待ちキューの先頭にキューイングされているタスクのID
- fblkcnt,rmpf_fblkcnt
固定長メモリ・プールから獲得可能な空きメモリ・ブロックの総数が格納されます。
12.5.8 周期ハンドラ状態情報
以下に,ref_cycを発行する際に使用する周期ハンドラ状態情報T_RCYCを示します。
なお,周期ハンドラ状態情報T_RCYCの定義は,標準ヘッダ・ファイル<ri_root>\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>\include\os\{packet.h,packet.inc}で行われています。
【 packet.h 】
 
 typedef struct  t_rcyc {
         STAT    cycstat;        /*現在状態*/
         RELTIM  lefttim;        /*残り時間*/
 } T_RCYC;

【 packet.inc 】
 
 rcyc_cycstat    .EQU     0x00     ;現在状態
 rcyc_lefttim    .EQU     0x02     ;残り時間

以下に,周期ハンドラ状態情報T_RCYCの詳細を示します。
- cycstat,rcyc_cycstat
周期ハンドラの現在状態が格納されます。
TCYC_STP: 動作停止状態(STP状態)
TCYC_STA: 動作開始状態(STA状態)
- lefttim,rcyc_lefttim
周期ハンドラが次に起動するまでの残り時間(単位:ティック)が格納されます。
なお,対象周期ハンドラが動作停止状態(STP状態)の場合には,本メンバの内容は不定値となります。
12.5.9 バージョン情報
以下に,ref_verを発行する際に使用するバージョン情報T_RVERを示します。
なお,バージョン情報T_RVERの定義は,標準ヘッダ・ファイル<ri_root>\include\{kernel.h,kernel.inc}から呼び出されるヘッダ・ファイル<ri_root>\include\os\{packet.h,packet.inc}で行われています。
【 packet.h 】
 
 typedef struct  t_rver {
         UH      maker;          /*メーカ・コード*/
         UH      prid;           /*識別番号*/
         UH      spver;          /*ITRON仕様のバージョン番号*/
         UH      prver;          /*カーネルのバージョン番号*/
         UH      prno[4];        /*管理情報*/
 } T_RVER;

【 packet.inc 】
 
 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
カーネルのメーカ・コードが格納されます。
0x011b: ルネサスエレクトロニクス製
- prid,verinf_prid
カーネルの識別番号が格納されます。
0x0006: 識別番号
- spver,verinf_spver
カーネルが準拠しているITRON仕様のバージョン番号が格納されます。
0x5403: μITRON4.0仕様Ver.4.03.03
- prver,verinf_prver
カーネルのバージョン番号が格納されます。
0x02xx: Ver.2.xx
- prno[0],verinf_prno
カーネルの版数が格納されています。
0x0: Vバージョン
- prno[1],verinf_prno + 0x2
カーネルのメモリ・モデルが格納されています。
0x2: ミディアム・モデル
- prno[2],verinf_prno + 0x4
システム予約領域です。
- prno[3],verinf_prno + 0x6
システム予約領域です。