Changes between Initial Version and Version 1 of IMPref_ctc


Ignore:
Timestamp:
Jan 16, 2016, 9:09:20 PM (8 years ago)
Author:
okuma-top
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • IMPref_ctc

    v1 v1  
     1== セルタイプコード ==
     2
     3セルタイプコードは、コンポーネントの振る舞いを記述するもので、受け口関数の実装です。
     4
     5=== 使用言語 ===
     6
     7セルタイプコードは C 言語で記述します。
     8
     9【補足説明】C++ として記述することもできる。ただし、外部名を C 言語に合わせる。
     10
     11=== 記述単位 ===
     12
     13セルタイプコードは、セルタイプごとにファイルを分けて記述します。
     14一つのセルタイプのセルタイプコードを、複数のファイルに分けて記述することはできます。
     15
     16インラインの受け口関数と非インラインの受け口関数とでは、ファイルを分けて記述します。
     17
     18【補足説明】複数のセルタイプのセルタイプコードを一つにまとめることはできない。
     19
     20=== ファイル名 ===
     21
     22非インライン受け口関数を格納するファイルの名前は、セルタイプのグローバル名に C 言語の拡張子 .c を付加したものです。C++ で記述する場合には、適切な拡張子を付加します。
     23
     24セルタイプコードを複数のファイルに分けて記述する場合、他のファイル名を付与します(名前付け規則は定めない)。
     25
     26【ファイル名の例】
     27{{{
     28    tCelltype.c
     29}}}
     30
     31=== インラインのセルタイプコードのファイル名 ===
     32
     33インラインの受け口関数を格納するファイルのファイル名は、セルタイプのグローバル名に ’_inline.h' を付加したヘッダファイルとします。
     34インラインの受け口関数を実装するセルタイプコードを複数のファイルに分けて記述する場合、セルタイプのグローバル名に ’_inline.h' を付加した名前のヘッダファイルからインクルードします。
     35
     36以下に、セルタイプのネームスペース識別子が nNS::tCelltype である場合のファイル名の例を示します。
     37
     38【ファイル名の例】
     39{{{
     40   nNS_tCelltype_inline.c
     41}}}
     42
     43=== ファイルの記述内容 ===
     44
     45セルタイプコードを格納するファイルには、以下を記述します。
     46
     47 * セルタイプヘッダファイルのインクルード
     48 * 受け口関数
     49 * 受け口関数から呼び出される関数
     50
     51=== セルタイプヘッダのインクルード ===
     52
     53セルタイプヘッダは、セルタイプコードからインクルードすべき、TECS ジェネレータの生成したヘッダファイルです。
     54
     55非インライン受け口関数を実装するセルタイプコードを記述するファイルでは、セルタイプヘッダをインクルードします。
     56以下にセルタイプ tCelltype の場合の例を示します。
     57
     58【セルタイプコード記述例】
     59{{{
     60   #include "tCelltype_tecsgen.h"
     61}}}
     62
     63セルタイプコードを記述しようとするセルタイプ以外のセルタイプヘッダをインクルードすることはできません。
     64
     65【補足説明】複数のセルタイプのセルタイプコードを一つのファイルに含めることは想定されていない。C 言語のマクロを駆使して関数の結合先をコンパイル時に決定する TECS の実装では、やむを得ない制限である。
     66
     67=== 参照できるもの ===
     68
     69セルタイプコードの中では、以下のものを参照できます。
     70
     71これらは、いずれもセルタイプコードを記述しようとするセルタイプの持つものに限られます。
     72
     73 * 呼び口関数
     74 * 属性
     75 * 内部変数
     76
     77この他に、ライブラリとして提供されるものを参照することができますが、コンポーネントとして提供されるものの代わりにライブラリ参照するのは、望ましくない実装となります。
     78
     79これ以外のものを参照する場合、逸脱になります。
     80
     81=== 受け口関数の形式 ===
     82
     83受け口に対応付けられたシグニチャで定義されたすべての関数を受け口関数として記述します。
     84
     85受け口関数の名前は、以下のように受け口名と関数名を連結したものとなります。
     86
     87{{{
     88  (受け口関数名) = (受け口名) + '_' + (シグニチャで定義された関数名)
     89}}}
     90
     91【補足説明】受け口関数名は、マクロにより、受け口関数のグローバル名に置換される。
     92
     93セルタイプが非シングルトンの場合、シグニチャで定義された関数ヘッダに比べ、第一引数が挿入されます。
     94挿入される第一引数の型は、CELLIDX 型です。
     95
     96以下に受け口関数の形式(関数ヘッダ)の例を示す。
     97
     98==== 受け口関数 (非シングルトンの場合) ====
     99
     100【TECS CDL 記述例】
     101{{{
     102  signature sSignature{
     103    ER func1( [in]int32_t inval, [out]int32_t *outval );
     104    ER func2( [in,size_is(size)]const int8_t *buf, [in]int32_t size );
     105  };
     106  celltype tCelltype {
     107    entry sSignature eEntry;
     108  };
     109}}}
     110
     111tCelltype のセルタイプコードに記述する必要のある受け口関数
     112
     113【セルタイプコード記述例】
     114{{{
     115  ER eEntry_func1( CELLIDX idx, int32_t inval, int32_t *outval )
     116  ER eEntry_func2( CELLIDX idx, const int8_t *buf, int32_t size )
     117}}}
     118
     119なお CELLIDX 型が何であるかは、ここでは規定しません。
     120ポインタ値であったり整数値であったりします。
     121
     122==== 受け口関数 (シングルトンの場合) ====
     123
     124【TECS CDL 記述例】
     125{{{
     126  [singleton]
     127  celltype tCelltype {
     128    entry sSignature eEntry;
     129  };
     130}}}
     131
     132【セルタイプコード記述例】
     133{{{
     134  ER eEntry_func1( int32_t inval, int32_t *outval )
     135  ER eEntry_func2( const int8_t *buf, int32_t size )
     136}}}
     137
     138シングルトンの場合、セルを識別するための引数 idx が挿入されません。
     139
     140=== 受け口関数の形式(受け口配列の場合) ===
     141
     142受け口配列の場合、第二引数に配列添数を挿入します。
     143
     144次に受け口配列の例を示す。以下のような TECS CDL の記述があったとします。
     145
     146【TECS CDL 記述例】
     147{{{
     148  signature sSignature{
     149    ER func1( [in]int32_t inval, [out]int32_t *outval );
     150    ER func2( [in,size_is(size)]const int8_t *buf, [in]int32_t size );
     151  };
     152  celltype tCelltype {
     153    entry sSignature eEntry[2];
     154  };
     155}}}
     156
     157tCelltype のセルタイプコードに記述する必要のある受け口関数の関数ヘッダは、以下のようになります。
     158
     159【セルタイプコード記述例】
     160{{{
     161  ER eEntry_func1( CELLIDX idx, int_t subscript, int32_t inval, int32_t *outval )
     162  ER eEntry_func2( CELLIDX idx, int_t subscript, const int8_t *buf, int32_t size )
     163}}}
     164
     165=== CB ポインタ ===
     166
     167CB ポインタは、非シングルトンのセルタイプの場合に、セルを選択するために必要となります。
     168シングルトンのセルタイプでは、CB ポインタを得ることはできません。
     169
     170以下に、セルタイプが非シングルトンの場合の、受け口関数の中で CB ポインタを得る方法を説明します。
     171CB ポインタが何物であるかは、ここでは規定しません。
     172
     173CB ポインタを得るコードの例を以下に示します。
     174
     175【セルタイプコード記述例】
     176{{{
     177  CELLCB   *p_cellcb;    /* p_cellcb の名前を変えてはならない */
     178  if (VALID_IDX(idx)) {
     179    p_cellcb = GET_CELLCB(idx);
     180  }
     181  else {
     182    return(E_ID);
     183  }
     184}}}
     185
     186以下に必須の要件を記します。
     187
     188 * 非シングルトンセルタイプの場合、CB ポインタを得る
     189 * CB ポインタの変数名は p_cellcb とする
     190 * CB ポインタの型は CELLCB 型とする
     191 * 第一引き数 CELLIDX idx を検査する関数(マクロ)として VALID_IDX を使用する
     192 * 第一引き数 CELLIDX idx を CB ポインタに変換する関数(マクロ)として GET_CELLCB を使用する
     193 
     194先ほどの CB ポインタを得るコードの例にあって、この要件にないのは、VALID_IDX で idx が不正と判断された場合に E_ID を返すことです。
     195TOPPERS/ASP 系の OS では E_ID を返すのが妥当ですが、戻り値の型が ER や ER_INT でない場合、あるいは TOPPERS/ASP 系以外の OS で動作させることを目的に記述している場合には、E_ID を返す必要はありません。
     196
     197【補足説明】実際の実装において idx_is_id が指定されいてない場合、 VALID_IDX が false を返すことはない。
     198
     199【補足説明】呼び口関数、属性、内部変数のいずれも参照しない場合、p_cellcb は非参照となる。
     200
     201=== 呼び口関数 ===
     202
     203セルタイプコードにおいて、呼び口のシグニチャで定義された関数を呼び出し可能です。
     204呼び口関数は、シグニチャで定義された関数と以下の点で異なります。
     205
     206{{{
     207 (呼び口関数名) = (呼びけ口名) + '_' + (シグニチャで定義された関数名)
     208}}}
     209
     210以下に例を示す。以下のような TECS CDL の記述があったとします。
     211
     212【TECS CDL 記述例】
     213{{{
     214  signature sSignature{
     215    ER func1( [in]int32_t inval, [out]int32_t *outval );
     216    ER func2( [in,size_is(size)]const int8_t *buf, [in]int32_t size );
     217  };
     218  celltype tCelltype {
     219    call sSignature cCall;
     220  };
     221}}}
     222
     223tCelltype のセルタイプコードでの呼び口関数の形式は以下のようになります。
     224
     225【セルタイプコードでの形式の例】
     226{{{
     227  ER cCall_func1( int32_t inval, int32_t *outval )
     228  ER cCall_func2( const int8_t *buf, int32_t size )
     229}}}
     230
     231【補足説明】受け口関数の場合は、第一引き数 idx が挿入されたが、呼び口関数では挿入されない。
     232
     233=== 呼び口関数(呼び口配列の場合) ===
     234
     235次に呼び口配列の例を示します。以下のような TECS CDL の記述があるとします。
     236
     237【TECS CDL 記述例】
     238{{{
     239  signature sSignature{
     240    ER func1( [in]int32_t inval, [out]int32_t *outval );
     241    ER func2( [in,size_is(size)]const int8_t *buf, [in]int32_t size );
     242  };
     243  celltype tCelltype {
     244    call sSignature cCall[];
     245  };
     246}}}
     247
     248tCelltype のセルタイプコードでの呼び口関数は以下のようになります。
     249
     250【セルタイプコード記述例】
     251{{{
     252  ER cCall_func1( int_t subscript, int32_t inval, int32_t *outval )
     253  ER cCall_func2( int_t subscript, const int8_t *buf, int32_t size )
     254}}}
     255
     256非配列の場合に比べ、第一引き数に配列添数が加えられます。
     257配列添数の最小値は 0 です。
     258配列サイズは、マクロ N_CP_cCall (cCall は呼び口名に置き換える) により知ることができます。
     259
     260=== 属性 ===
     261
     262セルタイプコードにおいて、属性を参照可能です。
     263属性参照名は、以下のように属性名に 'ATTR_' を前置きしたものです。
     264
     265{{{
     266 (属性参照名) = 'ATTR_' + (属性名)
     267}}}
     268
     269以下に例を示します。以下のような TECS CDL の記述があったとします。
     270
     271【TECS CDL 記述例】
     272{{{
     273  celltype tCelltype {
     274    attr {
     275      int32_t  attribute;
     276    }
     277  };
     278}}}
     279
     280tCelltype のセルタイプコードでの属性参照は以下のようになります。
     281
     282【セルタイプコード記述例】
     283{{{
     284  ATTR_attribute
     285}}}
     286
     287ATTR_attribute は左辺値として扱うことができます。
     288
     289=== 内部変数 ===
     290
     291セルタイプコードにおいて、内部変数を参照可能です。
     292
     293内部変数参照名は、以下のように内部変数名に 'VAR_' を前置きしたものです。
     294
     295{{{
     296 (内部変数参照名) = 'VAR_' + (内部変数名)
     297}}}
     298
     299以下に例を示します。以下のような TECS CDL の記述があったとします。
     300
     301【TECS CDL 記述例】
     302{{{
     303  celltype tCelltype {
     304    var {
     305      int32_t  variable;
     306    }
     307  };
     308}}}
     309
     310tCelltype のセルタイプコードでの内部変数参照は以下のようになります。
     311
     312【セルタイプコード記述例】
     313{{{
     314  VAR_variable
     315}}}
     316
     317VAR_variable は左辺値として扱うことができます。
     318
     319=== 非シングルトンセルタイプの場合のセルタイプコードの例 ===
     320
     321これまでの、セルタイプコードの規則に従ったコードの例を示します。
     322ここでは、非シングルトンセルタイプの場合を示します。
     323
     324【TECS CDL 記述例】
     325{{{
     326  signature sSignature{
     327    ER func1( [in]int32_t inval, [out]int32_t *outval );
     328    ER_INT func2( [in,size_is(size)]const uint8_t *buf, [in]int32_t size );
     329  };
     330  celltype tCelltype {
     331    entry sSignature eEntry;
     332    attr {
     333      int32_t  attribute;
     334    };
     335    var {
     336      int32_t  variable;
     337    };
     338  };
     339}}}
     340
     341tCelltype のセルタイプコードは以下のようになります。
     342
     343【セルタイプコード記述例】
     344{{{
     345  ER eEntry_func1( CELLIDX idx, int32_t inval, int32_t *outval )
     346  {
     347    /* CB ポインタを得るコード */
     348    CELLCB   *p_cellcb;          /* p_cellcb の名前を変えてはならない */
     349    if (VALID_IDX(idx)) {
     350      p_cellcb = GET_CELLCB(idx);
     351    }
     352    else {
     353      return(E_ID);
     354    }
     355
     356    *out_val = inval - ATTR_attribute;  /* 属性 attribute を参照
     357
     358    return E_OK;
     359  };
     360  ER_INT eEntry_func2( CELLIDX idx, const uint8_t *buf, int32_t size )
     361  {
     362    /* CB ポインタを得るコード */
     363    CELLCB   *p_cellcb;          /* p_cellcb の名前を変えてはならない */
     364    int32_t  i, sum = 0;
     365    if (VALID_IDX(idx)) {
     366      p_cellcb = GET_CELLCB(idx);
     367    }
     368    else {
     369      return(E_ID);
     370    }
     371
     372    for( i = 0; i < size; i++ )
     373         sum += buf[i];
     374
     375    return sum;
     376  };
     377}}}
     378
     379【補足説明】ATTR_attribute は CB ポインタ p_cellcb を含むマクロであることを想定するが、限定するものではない。実例として、ATTR_attribute ではさらに以下のものを含む。属性は ROM に置かれるが、これを INIB と呼ぶ。CB から INIB へのポインタ参照も ATTR_attribute マクロに含まれる。これは、最適化状態において変わりうる。
     380
     381【補足説明】VAR_variable は CB ポインタ p_cellcb を含むマクロであることを想定するが、規定するものではない。
     382
     383=== シングルトンセルタイプの場合のセルタイプコード ===
     384
     385これまでの、セルタイプコードの規定に従ったコードの実例を示します。
     386ここでは、シングルトンセルタイプの場合を示します。
     387
     388【TECS CDL 記述例】
     389{{{
     390  signature sSignature{
     391    ER func1( [in]int32_t inval, [out]int32_t *outval );
     392    ER_INT func2( [in,size_is(size)]const uint8_t *buf, [in]int32_t size );
     393  };
     394  [singleton]
     395  celltype tCelltype {
     396    entry sSignature eEntry;
     397    attr {
     398      int32_t  attribute;
     399    };
     400    var {
     401      int32_t  variable;
     402    };
     403  };
     404}}}
     405
     406tCelltype のセルタイプコードは以下のようになります。
     407
     408【セルタイプコード記述例】
     409{{{
     410  ER eEntry_func1( int32_t inval, int32_t *outval )
     411  {
     412    *out_val = inval - ATTR_attribute;  /* 属性 attribute を参照
     413
     414    return E_OK;
     415  };
     416  ER_INT eEntry_func2( const uint8_t *buf, int32_t size )
     417  {
     418    int32_t i, sum = 0;
     419
     420    for( i = 0; i < size; i++ )
     421         sum += buf[i];
     422
     423    return sum;
     424  };
     425}}}
     426
     427【補足説明】シングルトンセルタイプのコードでは、idx 引き数がない、CB ポインタを得るコードがない点で、非シングルトンセルタイプのコードと異なる。
     428
     429【補足説明】ATTR_attribute は INIB 構造体名を含むマクロであることを想定するが、規定するものではない。
     430
     431【補足説明】VAR_variable は CB 構造体名を含むマクロであることを想定するが、規定するものではない。
     432
     433------------
     434[TECS リファレンスマニュアル [wiki: トップ]]
     435[TECS コンポーネント実装リファレンスマニュアル [wiki:IMPref トップ]・[wiki:IMPref_index 目次]]]