$ $ TOPPERS Automotive Kernel $ Toyohashi Open Platform for Embedded Real-Time Systems $ Automotive Kernel $ $ Copyright (C) 2010 by asuka $ $ 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation $ によって公表されている GNU General Public License の Version 2 に記 $ 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア $ を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, $ 利用と呼ぶ)することを無償で許諾する. $ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 $ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー $ スコード中に含まれていること. $ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 $ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 $ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 $ の無保証規定を掲載すること. $ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 $ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ $ と. $ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 $ 作権表示,この利用条件および下記の無保証規定を掲載すること. $ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに $ 報告すること. $ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 $ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. $ $ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お $ よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も $ 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 $ 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. $ $ $ SH2-GNU環境依存部テンプレートファイル $ $FILE "kernel_cfg.c"$ $ $ ISRの外部参照宣言出力 $ $ その後の処理に必要な変数も作っておく. $ $ISR1_EXTERNAL_STRING = ""$ $ISR2_EXTERNAL_STRING = ""$ $ISR1_ENTRY_STRING = ""$ $ISR2_ENTRY_STRING = ""$ $USED_INTNO = {}$ $INTNO_TO_HDRSYMBOL = {}$ $COUNT = 0$ $FOREACH isrid ISR.ID_LIST$ $IF EQ(ISR.CATEGORY[isrid] , "1")$ $ISR1_EXTERNAL_STRING = CONCAT(ISR1_EXTERNAL_STRING , FORMAT("ISR1_EXTERNAL(%1%);\n" , isrid))$ $ISR1_ENTRY_STRING = CONCAT(ISR1_ENTRY_STRING , FORMAT("ISR1_ENTRY(%1%);\n" , isrid))$ $INTNO_TO_HDRSYMBOL[+ISR.ENTRY[isrid]] = FORMAT("ISR1_SYMBOL(%1%)" , isrid)$ $ELSE$ $ISR2_EXTERNAL_STRING = CONCAT(ISR2_EXTERNAL_STRING , FORMAT("ISR2_EXTERNAL(%1%);\n" , isrid))$ $ISR2_ENTRY_STRING = CONCAT(ISR2_ENTRY_STRING , FORMAT("ISR2_ENTRY(%1% , (%2%));\n" , isrid , COUNT))$ $INTNO_TO_HDRSYMBOL[+ISR.ENTRY[isrid]] = FORMAT("ISR2_SYMBOL(%1%)" , isrid)$ $COUNT = COUNT + 1$ $END$ $ 使用している割込み番号と対応するシンボルをリスト化 $USED_INTNO = APPEND(USED_INTNO , +ISR.ENTRY[isrid])$ $END$ /* 割込み入り口処理関数の外部参照定義 */$NL$ $ISR1_EXTERNAL_STRING$ $ISR2_EXTERNAL_STRING$ $NL$ /* 割込み入り口処理関数 */$NL$ $ISR1_ENTRY_STRING$ $ISR2_ENTRY_STRING$ $NL$ $ 割込みベクタに登録されるその他の割込みハンドラの外部参照 /* スタートアップ関数の外部参照定義 */$NL$ extern void start(void);$NL$ $NL$ /* 未使用割込みの外部参照定義 */$NL$ UNUSED_INT_EXTERNAL();$NL$ $NL$ /* 割込みベクタテーブル */$NL$ typedef void (*inthandler)(void);$NL$ $NL$ $NL$ const inthandler inthandler_table[256] __attribute((section (".vector"))) =$NL$ {$NL$ $ 固定部分の出力 $TAB$start /* $INT_VECTOR_INFO[0]$ */ ,$NL$ $TAB$(inthandler)STACK_TOP /* $INT_VECTOR_INFO[1]$ */ ,$NL$ $TAB$start /* $INT_VECTOR_INFO[2]$ */ ,$NL$ $TAB$(inthandler)STACK_TOP /* $INT_VECTOR_INFO[3]$ */ ,$NL$ $JOINEACH intno ISR_ENTRY_LIST " , \n"$ $TAB$ $IF LENGTH(FIND(USED_INTNO , intno))$ $INTNO_TO_HDRSYMBOL[+intno]$ /* $INT_VECTOR_INFO[intno]$ */ $ELSE$ $IF intno == 8$ (inthandler)(0xC91F0606) $ELSE$ UNUSED_INT_SYMBOL() /* $INT_VECTOR_INFO[intno]$ */ $END$ $END$ $END$ $NL$ };$NL$ $NL$ $ フックルーチンが未定義の場合のNULL定義 /* フックルーチンが未定義の場合のNULL定義 */$NL$ $IF EQ(OS.STARTUPHOOK[0] , "FALSE")$ NULL_STARTUPHOOK$NL$ $END$ $IF EQ(OS.SHUTDOWNHOOK[0] , "FALSE")$ NULL_SHUTDOWNHOOK$NL$ $END$ $IF EQ(OS.ERRORHOOK[0] , "FALSE")$ NULL_ERRORHOOK$NL$ $END$ $IF EQ(OS.PRETASKHOOK[0] , "FALSE")$ NULL_PRETASKHOOK$NL$ $END$ $IF EQ(OS.POSTTASKHOOK[0] , "FALSE")$ NULL_POSTTASKHOOK$NL$ $END$ $NL$