Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

カーネルオブジェクト(ETロボコン向けTOPPERS活用セミナー2-2)

カーネルオブジェクト(ETロボコン向けTOPPERS活用セミナー2-2)

  • Login to see the comments

カーネルオブジェクト(ETロボコン向けTOPPERS活用セミナー2-2)

  1. 1. TOPPERSプロジェクト認定 12012/06/02 2.2 カーネルオブジェクト 安積卓也(⽴命館⼤学) 最終更新⽇ : 2012/ 5/18
  2. 2. TOPPERSプロジェクト認定 22012/06/02 概要 • カーネルオブジェクトのコンポーネント化 – 例:タスクの利⽤ • 複合コンポーネント – 周期タスク • 例:周期タスクを利⽤したカウントアッププログラム – 初期化ルーチン • require カーネルセルタイプ
  3. 3. TOPPERSプロジェクト認定 32012/06/02 カーネルオブジェクトのコンポーネント化 • カーネルオブジェクト • 例:タスクの利⽤
  4. 4. TOPPERSプロジェクト認定 42012/06/02 カーネルオブジェクトのコンポーネント化 • カーネルオブジェクト⼀覧 アクティブなセルタイプ – タスク – 初期化処理ルーチン – 終了処理ルーチン – 割込みサービスルーチン – 周期ハンドラ – アラームハンドラ その他のセルタイプ – セマフォ – イベントフラグ – データキュー – 優先度データキュー – 固定⻑メモリプール – 割込み要求ライン – カーネル
  5. 5. TOPPERSプロジェクト認定 52012/06/02 カーネルオブジェクトのコンポーネント化 • カーネルオブジェクト – タスク – セマフォ – データキュー • 利点 – 静的APIを⾃動⽣成 – ソフトウェアの部品化を 促進 テンプレート コード TECS CDL(コンポーネント記述言語) シグニチャ記述 (インタフェースの定義) セルタイプ記述 (コンポーネントの定義) 組上げ記述 (コンポーネントの 構成の定義) TECS ジェネレータ ヘッダ インタフェース コード Cコンパイラ セルタイプコード (コンポーネントの ソースコード) リンカ アプリケーション 開発者 コンポーネント 開発者 アプリケーションモジュ ール コンポーネント図 製品 エンドユーザー コンポーネント 仕様開発者 仕 様 の 規定 設計 設計 利用 カーネル設定 ファイル コンフィギュレータ カーネル設定 コード
  6. 6. TOPPERSプロジェクト認定 62012/06/02 カーネルオブジェクトのコンポーネント化 • カーネルオブジェクト – タスク – セマフォ – データキュー • 利点 – 静的APIを⾃動⽣成 – ソフトウェアの部品化を 促進 テンプレート コード TECS CDL(コンポーネント記述言語) シグニチャ記述 (インタフェースの定義) セルタイプ記述 (コンポーネントの定義) 組上げ記述 (コンポーネントの 構成の定義) TECS ジェネレータ ヘッダ インタフェース コード Cコンパイラ セルタイプコード (コンポーネントの ソースコード) リンカ アプリケーション 開発者 コンポーネント 開発者 アプリケーションモジュ ール コンポーネント図 製品 エンドユーザー コンポーネント 仕様開発者 仕 様 の 規定 設計 設計 利用 カーネル設定 ファイル コンフィギュレータ カーネル設定 コードタスク CRE_TSK(TSKID_tTask_LogTask_Task, { TA_ACT, &tTask_CB_tab[0], tTask_start_task, 3, 131072, NULL }); 周期ハンドラ CRE_CYC( CYCHDLRID_tCyclicHandler_CyclicHandler, { TA_NULL, &tCyclicHandler_CB_tab[0], tCyclicHandler_start, 2000, 0 } ); セマフォ CRE_SEM(SEMID_tSemaphore_SerialPort1_ReceiveSemaphore, { TA_NULL, 0, 1 });
  7. 7. TOPPERSプロジェクト認定 72012/06/02 タスクのシグニチャ記述(⼀部抜粋) /* タスク本体を呼び出すためのシグニチャ*/ signature sTaskBody { void main(void); }; /* タスク例外処理ルーチン本体を呼び出すシグニチャ*/ signature sTaskExceptionBody { void main([in] TEXPTN pattern); }; /* タスクを操作するためのシグニチャ(タスクコンテキスト⽤)*/ signature sTask { ER activate(void); ER_UINT cancelActivate(void); ER terminate(void); ... }; /* タスクを操作するためのシグニチャ(⾮タスクコンテキスト⽤) */ signature siTask { ER activate(void); ER wakeup(void); ... }; asp+tecs/include/kernel.cdl
  8. 8. TOPPERSプロジェクト認定 82012/06/02 タスクのセルタイプ定義(前半) [active] celltype tTask { [inline] entry sTask eTask; /* タスク操作(タスクコンテキスト⽤)*/ [inline] entry siTask eiTask; /* タスク操作(⾮タスクコンテキスト⽤)*/ call sTaskBody cBody; /* タスク本体 */ [optional] call sTaskExceptionBody cExceptionBody; /* タスク例外処理ルーチン本体 */ attr{ }; factory { }; FACTORY { }; }; [inline]で指定された受け⼝はinline関数として実装する ⽣成されるテンプレートコードもinline関数が⽣成される [optional]で指定された呼び⼝は未結合を許す セルタイプコード(C⾔語の実装コード)では、 呼び出す前に結合されているかの確認をする必要がある asp+tecs/include/kernel.cdl
  9. 9. TOPPERSプロジェクト認定 92012/06/02 [optional]の例 void tTask_start_exception(TEXPTN texptn, intptr_t exinf) { CELLCB *p_cellcb = (CELLCB *) exinf; if(is_cExceptionBody_joined()){ cExceptionBody_main(texptn); } } asp+tecs/tecs_kernel/tTask.c [active] celltype tTask { ... [optional] call sTaskExceptionBody cExceptionBody; /* タスク例外処理ルーチン本体 */ ... }; asp+tecs/include/kernel.cdl 結合されているかどうか?
  10. 10. TOPPERSプロジェクト認定 102012/06/02 タスクのセルタイプ定義(後半) celltype tTask { ... attr{ ID id = C_EXP("TSKID_$id$"); [omit] ATR taskAttribute = C_EXP("TA_NULL"); [omit] ATR exceptionAttribute = C_EXP("TA_NULL"); [omit] PRI priority; [omit] SIZE stackSize; }; factory { write("tecsgen.cfg", "CRE_TSK(%s, { %s, $cbp$, tTask_start_task, %s, %s, NULL });", id, taskAttribute, priority, stackSize); }; FACTORY { write("tecsgen.cfg", "#include ¥"$ct$_tecsgen.h¥""); }; }; 各セルごとに出力 セルタイプで一度だけ出力 C_EXP(“”);はC⾔語での表現 コンポーネント記述で意味解釈をしないことを⽰す asp+tecs/include/kernel.cdl
  11. 11. TOPPERSプロジェクト認定 112012/06/02 celltype tTask { ... factory { write("tecsgen.cfg", "CRE_TSK(%s, { %s, $cbp$, tTask_start_task, %s, %s, NULL });", id, taskAttribute, priority, stackSize); }; FACTORY { write("tecsgen.cfg", "#include ¥"$ct$_tecsgen.h¥""); }; }; ファクトリ • セル(コンポーネント)⽣成時に静的APIなどを 開発者が意図的に出⼒するために使⽤する 出力したいファイル名 出力内容 printf形式で出力 asp+tecs/include/kernel.cdl
  12. 12. TOPPERSプロジェクト認定 122012/06/02 ファクトリでの名前置換 ID id = C_EXP(“TSKID_$id$”); write("tecsgen.cfg","CRE_TSK(%s, { %s, $cbp$, tTask_start_task, %s, %s, NULL });", id, taskAttribute, priority, stackSize); $id$ … セルタイプ名とセル名を '_' で連結したものに置換 $cell$ … セル名に置換 $cb$ … セルの CB の C ⾔語名に置換 $cbp$ … セルのCB へのポインタ(CB が⽣成されない場合はNULL に置換) $cb_proto$ … セルの CB の C ⾔語名(プロトタイプ宣⾔⽤)に置換 $ct$ … セルタイプ名に置換 $idx$ … セルの CB の IDX (idx_is_id の場合は整数、そうでない場合は CB へのポインタ)に置換 $ID$ … セルの ID(idx_is_id の場合 IDX に⼀致)に置換 $$ … $ に置換 CRE_TSK(TSKID_tTask_MainTask, { TA_ACT, &tTask_CB_tab[1], tTask_start_task, MAIN_PRIORITY, STACK_SIZE, NULL }); 例えば、セルタイプ名tTask、セル名MainTaskの場合 セル名セルタイプ名 tecsgen.cfg
  13. 13. TOPPERSプロジェクト認定 132012/06/02 tecsgen.cfg i INCLUDE("target_timer.cfg"); INCLUDE("syssvc/banner.cfg"); #include "tSample1.h" #ifdef CPUEXC1 DEF_EXC(CPUEXC1, { TA_NULL, cpuexc_handler }); #endif /* CPUEXC1 */ tSample1.cfg INCLUDE("tecsgen.cfg"); #include "cb_type_only.h" #include "tTask_tecsgen.h" CRE_TSK(TSKID_tTask_LogTask_Task, { TA_ACT, &tTask_CB_tab[0], tTask_start_task, 3, 131072, NULL }); DEF_TEX(TSKID_tTask_LogTask_Task, { TA_NULL, tTask_start_exception }); ... #include "tInitializeRoutine_tecsgen.h" ATT_INI({ TA_NULL, NULL, tInitializeRoutine_start }); #include "tTerminateRoutine_tecsgen.h" ATT_TER({ TA_NULL, NULL, tTerminateRoutine_start }); #include "tISR_tecsgen.h" ATT_ISR({ TA_NULL, NULL, 2, tISR_start, 1 }); CFG_INT( 2,{ TA_NULL, -2}); #include "tCyclicHandler_tecsgen.h" CRE_CYC( CYCHDLRID_tCyclicHandler_CyclicHandler, { TA_NULL, &tCyclicHandler_CB_tab[0], tCyclicHandler_start, 2000, 0 } ); #include "tAlarmHandler_tecsgen.h" CRE_ALM(ALMHDLRID_tAlarmHandler_AlarmHandler, { TA_NULL, &tAlarmHandler_CB_tab[0], tAlarmHandler_start}); CRE_SEM(SEMID_tSemaphore_SerialPort1_ReceiveSemaphore, {TA_NULL, 0, 1}); CRE_SEM(SEMID_tSemaphore_SerialPort1_SendSemaphore, { TA_NULL, 1, 1 }); #include "syssvc/tLogTask.h" ATT_TER({ TA_NULL, 0, tLogTask_terminate });
  14. 14. TOPPERSプロジェクト認定 142012/06/02 タスクセルの使い⽅ • タスクのインスタンスの記述 ①タスク処理本体と結合 ②タスクの属性の設定:カーネル起動時のタスクの状態 • TA_ACT:実⾏可能状態 • TA_NULL(デフォルト):休⽌状態 ③タスクの優先度:1が最⾼優先度 ④スタックサイズ:バイト cell tTask MainTask { /* 呼び⼝の結合 */ cBody = Sample1.eMainTask; //① /* 属性の設定 */ taskAttribute = C_EXP(“TA_ACT”); //② priority = MAIN_PRIORITY;//③ stackSize = STACK_SIZE; //④ }; 記述の順番は 結合と属性の設定 どちらが先でもよい
  15. 15. TOPPERSプロジェクト認定 152012/06/02 カーネルオブジェクトのコンポーネント化 • カーネルオブジェクト • 例:タスクの利⽤
  16. 16. TOPPERSプロジェクト認定 162012/06/02 例:タスクセルの利⽤ • タスクセルの利⽤⽅法を理解する – 組上げ記述 • Displayセルを利⽤する • tSample.cdlにタスクを⽣成するコンポーネント記述 する tHelloTaskBody HelloTaskBody tTask StartTask tDisplay Display
  17. 17. TOPPERSプロジェクト認定 172012/06/02 タスクコンポーネントの使い⽅(組み上げ) /* * タスク */ cell tHelloTaskBody HelloTaskBody{ cDisplay = Display.eDisplay; // ディスプレイの呼び⼝ }; cell tTask StarterTask{ taskAttribute = C_EXP("TA_ACT"); priority = 5; stackSize = 1024; cBody = HelloTaskBody.eBody; }; tHelloTaskBody HelloTaskBody tTask StartTask tDisplay Display /* * ディスプレイ */ cell tDisplay Display{ width = 100; depth = 8; cellWidth = 6; charWidth = (100 / 6); charDepth = (8); }; asp+tecs/tecs_lib/mindstorms_nxt/ tNXTMiddle_inst.cdl asp+tecs/nxt_sample/sample_hello/tSample.cdl
  18. 18. TOPPERSプロジェクト認定 182012/06/02 TECSジェネレータの設定 • tecsgen(TECSジェネレータ)へのシンボリックリ ンクを張る – tecs_package/asp+tecs/に移動 し、../bin/tecsgen.exeへのシンボリックリンク tecsgen.exeを作成 $ cd tecs_package/asp+tecs/ $ ln -s ../bin/tecsgen.exe tecsgen.exe
  19. 19. TOPPERSプロジェクト認定 192012/06/02 コンパイラの設定 • 環境に依存する定義は、 target/mindstorms_nxt_gcc/Makefile.targetに記 述されおり、各⾃の環境に応じて変更する必要があ る 1. クロスツールチェーンのパス • 使⽤するクロスツールチェーン(GNU ARM)のパスを, GCC_TARGETに定義する. • デフォルト: GCC_TARGET = /usr/local/GNUARM/bin/arm-elf 2. ダウンロードツールのパス • NexTTool.exeのパスを,NEXTTOOLに定義する. • デフォルト: NEXTTOOL = /usr/local/nexttool/NexTTool.exe
  20. 20. TOPPERSプロジェクト認定 202012/06/02 ビルド⼿順 1. プロジェクトディレクトリに移動 2. TECSジェネレータの実⾏ – コンポーネントの⽣成と結合に関するファイル、 およびコンポーネントに関する定義ファイルが gen/以下に⽣成される。 3. 依存関係 4. コンパイル&リンク • asp.rxeとrxe.shが⽣成される $ cd /nxt_sample/sample_hello/ $ make tecs TECSジェネレータの実⾏ $ make depend 依存関係の更新 $ make コンパイル&リンク
  21. 21. TOPPERSプロジェクト認定 212012/06/02 ジェネレータが⾃動⽣成するファイル • Makefile.depend • Makefile.tecsgen • Makefile.templ • global_tecsgen.h • sDisplay_tecsgen.h • tDisplayBody_factory.h • tDisplayBody_templ.c • tDisplayBody_tecsgen.c • tDisplayBody_tecsgen.h • tHelloTaskBody_factory.h • tHelloTaskBody_templ.c • tHelloTaskBody_tecsgen.c • tHelloTaskBody_tecsgen.h • tmp_C_src.c 依存関係 ⾃動⽣成した ファイル⽤の Makefile セルタイプ毎に ⾃動⽣成されるファイル テンプレート セルの結合コード ファクトリ⽤ヘッダ Makefileの テンプレート 型の定義など 各シグニチャ の定義 中間ファイル TECSジェネレータが使⽤
  22. 22. TOPPERSプロジェクト認定 222012/06/02 Makefile.tecsgen • TECSジェネレータがコンパ イルに必要な情報を⾃動的 に⽣成する ・・・ CELLTYPE_COBJS = ¥ tTask.o ¥ tISR.o ¥ tLCD.o ¥ tDisplayBody.o ¥ tBluetoothBody.o ¥ tCheckNXTButtonBody.o ¥ tInitializeTaskNXTBody.o ¥ .... ・・・ # # TECSが⽣成する定義のインクルード # -include gen/Makefile.tecsgen .... asp+tecs/nxt_sample/sample_hello/Makefile
  23. 23. TOPPERSプロジェクト認定 232012/06/02 複合コンポーネント • 周期タスク • 例:周期タスクセルの利⽤ • 初期化ルーチン
  24. 24. TOPPERSプロジェクト認定 242012/06/02 周期タスク void handler(void) { iact_tsk(タスクID); } void task(intptr_t exinf) { タスク処理 } CRE_CYC(CALCID_CYCHDR, { TA_NULL, 0, vCalcIdHandler, 10, 0 }); CRE_TSK(TASK1, { TA_NULL, 0, task, MID_PRIORITY, STACK_SIZE, NULL }); • ITRONでは、周期タスクを提供していない • 周期タスクは、周期ハンドラがタスクを周期的に起 動することで実現している
  25. 25. TOPPERSプロジェクト認定 252012/06/02 周期タスク:複合セルタイプ(複合コンポーネント) • 複数のセルを⼀つのセルと して扱う技術 • 利⽤者は周期タスクセルを ⽣成するだけでよい 周期ハンドラの 処理本体 (タスク起動) 周期ハンドラ タスク 周期タスク(tCyclicTask)
  26. 26. TOPPERSプロジェクト認定 262012/06/02 複合コンポーネント • 周期タスク • 例:周期タスクセルの利⽤ • 初期化ルーチン
  27. 27. TOPPERSプロジェクト認定 272012/06/02 例:周期タスクセルの利⽤ • 周期タスクセルの利⽤⽅法を理解する – 組上げ記述 • Displayセルを利⽤する • Displayに数字をカウントアップする tCounterTaskBody CounterTaskBody tCyclicTask CounterTask tDisplay Display
  28. 28. TOPPERSプロジェクト認定 282012/06/02 周期タスクセルの使い⽅(組み上げ) /* cell tCounterTaskBody CounterTaskBody{ cDisplay = Display.eDisplay; // ディスプレイの呼び⼝ }; cell tCyclicTask CounterTask{ cyclicAttribute = C_EXP("TA_STA"); cyclicTime = 1000; cyclicPhase = 1; priority = 5; stackSize = 1024; cBody = CounterTaskBody.eBody; }; /* * ディスプレイ */ cell tDisplay Display{ width = 100; depth = 8; cellWidth = 6; charWidth = (100 / 6); charDepth = (8); }; asp+tecs/tecs_lib/mindstorms_nxt/ tNXTMiddle_inst.cdl asp+tecs/nxt_sample/sample_counter/tSample.cdl tCounterTaskBody CounterTaskBody tCyclicTask CounterTask tDisplay Display
  29. 29. TOPPERSプロジェクト認定 292012/06/02 周期タスクセルの使い⽅ • 周期タスクのインスタンス化の記述 ①周期タスクの属性の設定:カーネル起動時の周期タスクの状態 • TA_STA:起動 • TA_NULL(デフォルト):休⽌状態 ②起動周期(ミリ秒) ③起動位相 ④タスクの優先度 ⑤スタックサイズ ⑥タスク処理本体と結合 cell tCyclicTask CounterTask{ cyclicAttribute = C_EXP(“TA_STA”);① cyclicTime = 1000;② cyclicPhase = 1;③ priority = 5;④ stackSize = 1024;⑤ cBody = CounterTaskBody.eBody;⑥ };
  30. 30. TOPPERSプロジェクト認定 302012/06/02 複合コンポーネント • 周期タスク • 例:周期タスクセルの利⽤ • 初期化ルーチン
  31. 31. TOPPERSプロジェクト認定 312012/06/02 TECSにおける初期化 1. 初期化ルーチンとセルを1対1に対応させる • カーネルオブジェクトの初期化ルーチンを利⽤ • 例:ディスプレイ
  32. 32. TOPPERSプロジェクト認定 322012/06/02 TOPPERS/ASP+TECSの初期化順序 1. メモリ領域などの初期化 – BSS領域の初期化 – DATA領域の初期化 2. セル管理ブロックの初期化 3. ターゲット依存部の初期化 4. 各モジュールの初期 • タスクなどのカーネルオブジェクト の初期化 5. 初期化ルーチンの実⾏ 6. カーネル動作の開始 /* * カーネルの起動 */ void sta_ker(void) { /* ターゲット依存の初期化 */ target_initialize(); /* * 各モジュールの初期化 */ initialize_tmevt(); initialize_object(); /* 初期化ルーチンの実⾏ */ call_inirtn(); /* カーネル動作の開始*/ kerflg = true; LOG_KER_ENTER(); start_dispatch(); assert(0); } asp+tecs/kernel/startup.c
  33. 33. TOPPERSプロジェクト認定 332012/06/02 初期化処理ルーチン:カーネルオブジェクト /* 初期化処理ルーチン本体を呼び出すためのシグニチャ */ signature sInitializeRoutineBody { void main(void); }; /* 初期化処理ルーチン */ [active] celltype tInitializeRoutine { call sInitializeRoutineBody cInitializeRoutine; attr { [omit] ATR attribute = C_EXP("TA_NULL"); }; factory { write("tecsgen.cfg", "ATT_INI({ %s, $cbp$, tInitializeRoutine_start });", attribute); }; }; asp+tecs/include/kernel.cdl
  34. 34. TOPPERSプロジェクト認定 342012/06/02 ⽣成される初期化ルーチンの静的API ATT_INI({ TA_NULL, &tInitializeRoutine_CB_tab[0], tInitializeRoutine_start }); write("tecsgen.cfg", "ATT_INI({ %s, $cbp$, tInitializeRoutine_start });", attribute); asp+tecs/include/kernel.cdl
  35. 35. TOPPERSプロジェクト認定 352012/06/02 初期化の例 • ディスプレイの例 – Displayをインスタンス 化すれば、初期化ルーチ ンも⾃動的に⽣成される 2010/06/20 TOPPERSプロジェクト認定 35 tDisplay Display DisplayBody tInitializeRoutine InitializeDisplay SPI LCD
  36. 36. TOPPERSプロジェクト認定 362012/06/02 require カーネルセルタイプ
  37. 37. TOPPERSプロジェクト認定 372012/06/02 require • require – RTOSのAPIなど共通して使われる機能について、 結合を明⽰することなく使⽤できる仕組み – require の指定先は、シングルトンのセルタイプ の受け⼝
  38. 38. TOPPERSプロジェクト認定 382012/06/02 例:require [singleton] celltype tKernel{ [inline] entry sKernel eKernel; [inline] entry siKernel eiKernel; }; celltype tStarterTaskBody{ require tKernel.eKernel; /*以下省略*/ }; } void eBody_main() { /*処理省略*/ delay(100); /*処理省略*/ exitTask(); } signature sKernel{ ER sleep(void); ER sleepTimeout([in] TMO timeout); ER delay([in] RELTIM delayTime); ER exitTask(void); ER getTaskId([out]ID *p_taskId); /*以下省略*/ }; asp+tecs/include/kernel.cdl asp+tecs/include/kernel.cdl asp+tecs/nxt_sample/sample_seminar/ tStartTaskBody.c asp+tecs/nxt_sample/sample_seminar/tSample.cdl
  39. 39. TOPPERSプロジェクト認定 392012/06/02 著者リスト • カーネルオブジェクトのコンポーネント化編 • 安積 卓也(⽴命館⼤学) • 例:タスクセルの利⽤ • 安積 卓也 (⽴命館⼤学) • ⽯川 拓也 (名古屋⼤学) • ⼭⼝ 英之 (名古屋⼤学) • 複合コンポーネント, 初期化ルーチン, require • 安積 卓也(⽴命館⼤学) • 例:周期タスクセルの利⽤ • 安積 卓也(⽴命館⼤学) • ⽯川 拓也 (名古屋⼤学)

×