More Related Content
Similar to TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1) (20)
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
- 8. TOPPERSプロジェクト認定 82012/06/02
• TECSの特徴
– 実装向けのコンポーネントシステム
– C⾔語で実装
– コンポーネント間の結合を静的に⾏う
• 結合の最適化が可能
– システム内のすべての要素をコンポーネントとして扱う
例
• メモリアロケータ
• 通信チャネル
• 排他制御機構
UMLより抽象度が低い
汎⽤のコンポーネントは動的結合
既存のコンポーネントでは、
コンポーネントシステムの中に隠される
組込みシステム向けコンポーネントシステム
TECS:TOPPERS Embedded Component System
おおよそ
7割がC⾔語
2010年版組込みソフトウェア
産業実態調査報告書より
- 9. TOPPERSプロジェクト認定 92012/06/02
• TECSの特徴
– 実装向けのコンポーネントシステム
– C⾔語で実装
– コンポーネント間の結合を静的に⾏う
• 結合の最適化が可能
– システム内のすべての要素をコンポーネントとして扱う
例
• メモリアロケータ
• 通信チャネル
• 排他制御機構
汎⽤のコンポーネントは動的結合
UMLより抽象度が低い
既存のコンポーネントでは、
コンポーネントシステムの中に隠される
組込みシステム向けコンポーネントシステム
TECS:TOPPERS Embedded Component System
おおよそ
7割がC⾔語
2010年版組込みソフトウェア
産業実態調査報告書より
- 10. TOPPERSプロジェクト認定 102012/06/02
• TECSの特徴
– 実装向けのコンポーネントシステム
– C⾔語で実装
– コンポーネント間の結合を静的に⾏う
• 結合の最適化が可能
– システム内のすべての要素をコンポーネントとして扱う
例
• メモリアロケータ
• 通信チャネル
• 排他制御機構 既存のコンポーネントでは、
コンポーネントシステムの中に隠される
汎⽤のコンポーネントは動的結合
UMLより抽象度が低い
おおよそ
7割がC⾔語
組込みシステム向けコンポーネントシステム
TECS:TOPPERS Embedded Component System
2010年版組込みソフトウェア
産業実態調査報告書より
- 11. TOPPERSプロジェクト認定 112012/06/02
TECS開発の歴史
2004年 1⽉ コンポーネント仕様 WG 開始
2006年 3⽉ TECSと命名(⽅向性がほぼ固まる)
2006年10⽉ セキュリティコンポーネントIPA未踏に採択
2007年12⽉ 組込みZINE連載開始(現CodeZine)
2008年 6⽉ 会員向けリリース開始
2008年11⽉ キャッツとヴィッツがサポートを表明
2009年 5⽉ ⼀般向けリリース開始(asp+tecs)
組込みプレスに記事を掲載
2010年 6⽉ RPC (Transparent)を会員向けリリース開始
2011年 5⽉ Interfaceに記事を掲載
2011年 6⽉ RPC (Opaque)
atk1+tecsを会員向けリリース開始
- 13. TOPPERSプロジェクト認定 132012/06/02
TECS 仕様の設計⽅針(1)
• 静的なコンポーネント⽣成と結合
– 柔軟な組上げと最適化によるオーバヘッドの最⼩化
• すべてのものをコンポーネントとして扱う
– C⾔語のように、ビルトイン機能は極⼒なくし、コ
ンポーネントとして実装
• アロケータ、RPCチャネルなどを隠さない
• インタフェース定義の曖昧さをなくす
– 型、⼊出⼒⽅向、配列要素数
• オブジェクト指向技術を直接的には取り⼊れない
– C⾔語を基本とする(想定する利⽤者の知識)
- 19. TOPPERSプロジェクト認定 192012/06/02
TECS:インタフェース定義(シグニチャ)
テンプレート
コード
TECS CDL(コンポーネント記述言語)
シグニチャ記述
(インタフェースの定義) セルタイプ記述
(コンポーネントの定義) 組上げ記述
(コンポーネントの
構成の定義)
TECS
ジェネレータ
ヘッダ
インタフェース
コード
Cコンパイラ
セルタイプコード
(コンポーネントの
ソースコード)
リンカ
アプリケーション
開発者
コンポーネント
開発者
アプリケーションモジュ
ール
コンポーネント図
製品 エンドユーザー
コンポーネント
仕様開発者
仕 様 の
規定
設計
設計
利用
プラグイン
プラグイン
開発者
設計
RPC
アクセス制御
トレース
App File
シグニチャ
sFile
signature sFile {
ER open( [in,string]char_t * fileName, [in]int16_t mode);
ER close(void);
ER read( [out,size_is(length),count_is(*count)]int8_t * buffer,
[in]int32_t length, [out]int32_t *count);
ER write( [in,size_is(length)]int8_t *buffer,
[in]int32_t length, |[out]int32_t *wroteLength);
ER seek( [in]int32_t offset);
};
- 20. TOPPERSプロジェクト認定 202012/06/02
関数とデータ型(1)
• 引数の⼊出⼒⽅向の指定
– in …関数への⼊⼒
– out … 関数からの出⼒
– inout … 関数の⼊⼒/出⼒
例
ER changePriority([in] PRI priority);
ER getPriority([out] PRI *p_priority);
• 他の⼊出⼒⽅向の指定
– アロケータの使⽤を表す send, receiveがある
• ポインタ引き数に関する指定
– size_is, count_is, string により配列であることを明⽰する
- 21. TOPPERSプロジェクト認定 212012/06/02
関数とデータ型(2)
• TOPPERS/ASPの型との親和性を重視
• 推奨する基本型(サイズが明瞭)
char_t, bool_t … この2つの型は RPC でのみサイズ明瞭(8bit)
int8_t, int16_t, int32_t, int64_t, int128_t
uint8_t,uint16_t,uint32_t, uint64_t, uint128_t
float32_t, double64_t
• 推奨しない型(サイズが不明瞭)
char, int, long, short, int_t
float, double, long double
• Cヘッダで定義される型(typedef,struct)の取り込み
import_C( “mytypes.h” );
• 引数以外にも属性、内部変数、定数の型も同様
- 22. TOPPERSプロジェクト認定 222012/06/02
正確なインタフェース記述
• C⾔語のインタフェース記述(プロトタイプ宣⾔)は曖昧
– ER function( char *buffer, int size, int *result );
• TECSによるインタフェース定義 (TECS⽤語ではシグニチャ)
– ER function( [in,size_is(size)] const char_t *buffer,
[in] int32_t size,
[inout] int32_t *result );
(*result がinoutなのは、前回の結果が今回の実⾏に影響するため)
• 引数が⼊⼒か出⼒かが明確(特にポインタ型)
• データ構造が明確
– ポインタがのさしているものが配列か配列でないかが明確
– 配列であるならば、配列の⼤きさが明確
- 26. TOPPERSプロジェクト認定 262012/06/02
セルタイプ セルの型式のコンポーネント記述
• セルタイプの CDL 表現
– セルの持つ受け⼝、呼び⼝、属性、内部変数を指定する
– この他にリクワイア、ファクトリを指定できる
• ファクトリ:静的APIの記述⼿段
• リクワイア:セルタイプに共通な結合の指定
– セルタイプの名前には接頭⽂字 t を付加する
例
[active] celltype tTask {
[inline] entry sTask eTask; /* 受け⼝:タスク操作 */
call sTaskBody cBody; /* 呼び⼝:タスク本体 */
attr{
ID id = C_EXP("TSKID_$id$");
[omit] ATR taskAttribute = C_EXP("TA_NULL");
[omit] PRI priority;
[omit] SIZE stackSize;
… ⼀部省略
};
};
active … 後述
inline … インライン関数として実装することを指定
omit … CBに含めないことの指定 (factoryで利用)
- 28. TOPPERSプロジェクト認定 282012/06/02
組上げ記述 セルの定義と結合のコンポーネント記述
• セルの定義において他のセルとの結合を指定する
• セルを結合してアプリケーションを完成させることを組上げと⾔う
例
// AlertCounter セル
cell tAlertCounter AlertCounter {
cAlert = Buzzer.eAlert; /* 呼び⼝の結合 */
initialCount = 0; /* 初期値 */
alertCount = 5; /*警告を発するカウント */
};
// CountInput, Buzzer のセル定義は省略
tCountInput
CountInput
tAlertCounter
AlertCounter
tBuzzer
BuzzereCounter
sUpDownCounter
cAlert
sAlert
- 31. TOPPERSプロジェクト認定 312012/06/02
セルタイプコード
セルタイプコード…セルの振舞い
– セルタイプのすべての受け⼝関数の本体を記述する
--- celltype.c ---
ER func( CELLIDX idx, int32_t arg0)
ER ercd = E_OK;
CELLCB *p_cellcb; //p_clellcbの名前変更禁⽌
if (VALID_IDX(idx)) {
p_cellcb = GET_CELLCB(idx);
}
else {
return(E_ID);
}
/* ここに処理本体を記述します #_TEFB_# */
return(ercd);
}
•CELLCB … セルの情報を記憶する領域
•idx … セル のID or CELLCBへのポインタ
•p_cellcb … CELLCBへのポインタ
(singleton では、idx, p_cellcbは不要)
- 34. 2012/06/0234
結合の実装構造の標準形
cCallPort_close( )
ER eEntryPort_close( tB_IDX idx)
{
ER ercd_ = E_OK;
tB_CB *p_cellcb;
if( tB_VALID_IDX( idx ) ){
p_cellcb = GET_CELLCB(idx);
}else{
return E_ID;
}
/*処理*/
return ercd_;
}
呼び側
受け⼝関数
/* 呼び⼝関数マクロ(短縮形) */
#define cCallPort_close( ) ¥
tA_cCallPort_close( p_cellcb )
#define tA_cCallPort_close( p_that ) ¥
(p_that)->cCallPort->VMT->¥
close( (p_that)->cCallPort )
typedef struct tag_tA_CB {
/* call port */
struct tag_sSig1_VDES *cCallPort;
struct tag_sSig2_VDES *cCall2;
} tA_CB;
呼び側のセルCB
cCallPort_write( )
tA
A
tB
B
受け側
ER tB_eEntryPort_close_skel( struct
tag_sSig1_VDES *epd)
{
struct tag_tB_eEntryPort_DES *lepd
= (struct tag_tB_eEntryPort_DES *)epd;
return tB_eEntryPort_close( lepd->idx );
}
受け⼝
ディスクリプタ
受け⼝
関数テーブル 受け⼝スケルトン関数
受け⼝関数
tB_eEntryPort_read_skel
tB_eEntryPort_write_skel
tB_eEntryPort_close_skel
&tB_eEntryPort_MT
&tB_B_CB
受け⼝関数テーブルへの
ポインタ
受け側のセルCB
呼び側のセルCB
受け側
tB_eEntryPort_open_skel
TOPPERSプロジェクト認定
- 35. 2012/06/0235
結合の実装構造の標準形
cCallPort_close( )
ER tB_eEntryPort_close_skel( struct
tag_sSig1_VDES *epd)
{
struct tag_tB_eEntryPort_DES *lepd
= (struct tag_tB_eEntryPort_DES *)epd;
return tB_eEntryPort_close( lepd->idx );
}
ER eEntryPort_close( tB_IDX idx)
{
ER ercd_ = E_OK;
tB_CB *p_cellcb;
if( tB_VALID_IDX( idx ) ){
p_cellcb = GET_CELLCB(idx);
}else{
return E_ID;
}
/*処理*/
return ercd_;
}
受け⼝
ディスクリプタ
受け⼝
関数テーブル 受け⼝スケルトン関数
受け⼝関数
tB_eEntryPort_read_skel
tB_eEntryPort_write_skel
tB_eEntryPort_close_skel
&tB_eEntryPort_MT
&tB_B_CB
/* 呼び⼝関数マクロ(短縮形) */
#define cCallPort_close( ) ¥
tA_cCallPort_close( p_cellcb )
#define tA_cCallPort_close( p_that ) ¥
(p_that)->cCallPort->VMT->¥
close( (p_that)->cCallPort )
typedef struct tag_tA_CB {
/* call port */
struct tag_sSig1_VDES *cCallPort;
struct tag_sSig2_VDES *cCall2;
} tA_CB;
受け⼝関数テーブルへの
ポインタ
受け側のセルCB
呼び側のセルCB
tA
A
tB
B
cCallPort_write( )
呼び側 受け側
tB_eEntryPort_open_skel
TOPPERSプロジェクト認定
- 40. TOPPERSプロジェクト認定 402012/06/02
複合セルタイプ
composite tCompositeCelltype {
entry sExtSigName2 eExtEPName;
call sExtSigName cExtCPName;
cell tCellType2 Cell2 {
cCall => compoiste.cExtCPName;
};
cell tCellType1 Cell1 {
cCPName = Cell2.eEPName;
};
composite.eExtEPName => Cell1.eEPName;
};
tCompositCellType
CompositCell
tCellType1
Cell1
cCPName eEPName tCellType2
Cell2
sSigName2
sExtSigName
cExtCPName
sExtSigName2
eExtEPName
属性attr をインタフェース
表明に加えることができる
インタフェース表明
- 42. TOPPERSプロジェクト認定 422012/06/02
⼀対多(呼び⼝配列)の結合
• 呼び⼝配列により分流できる
– 添数により呼出し先を選択する
celltype tCelltype1 {
call sSigName cCPName[3];
};
cell tCelltype1 Cell1 {
cCPName[0] = Cell21.eEPName;
…
};
tCellType1
Cell1
cCPName[0] eEPName tCellType2
Cell21sSigName
tCellType2
Cell22
tCellType3
Cell3
cCPName[1]
cCPName[2]
eEPName
eEPName3