$ ====================================================================== $ $ TOPPERS/ASP Kernel $ Toyohashi Open Platform for Embedded Real-Time Systems/ $ Advanced Standard Profile Kernel $ $ Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory $ Toyohashi Univ. of Technology, JAPAN $ Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory $ Graduate School of Information Science, Nagoya Univ., JAPAN $ $ 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ $ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 $ 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. $ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 $ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー $ スコード中に含まれていること. $ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 $ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 $ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 $ の無保証規定を掲載すること. $ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 $ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ $ と. $ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 $ 作権表示,この利用条件および下記の無保証規定を掲載すること. $ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに $ 報告すること. $ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 $ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. $ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 $ 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを $ 免責すること. $ $ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お $ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 $ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ $ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ $ の責任を負わない. $ $ @(#) $Id: core.tf 322 2015-04-30 13:23:48Z ertl-ishikawa $ $ $ ===================================================================== $ $ パス2のアーキテクチャ依存テンプレート(ARM-M用) $ $ $ 有効な割込み番号,割込みハンドラ番号 $ $INTNO_VALID = RANGE(15, TMAX_INTNO)$ $INHNO_VALID = INTNO_VALID$ $ $ 有効なCPU例外番号 $ 7,8はエミュレートされた例外 $ $EXCNO_VALID = { 2,3,4,5,6,7,8,11,12,14 }$ $ $ CRE_ISRで使用できる割込み番号とそれに対応する割込みハンドラ番号 $ $INTNO_CREISR_VALID = INTNO_VALID$ $INHNO_CREISR_VALID = INHNO_VALID$ $ $ DEF_INT/DEF_EXCで使用できる割込みハンドラ番号/CPU例外ハンドラ番号 $ $INHNO_DEFINH_VALID = INHNO_VALID$ $EXCNO_DEFEXC_VALID = EXCNO_VALID$ $ $ CFG_INTで使用できる割込み番号と割込み優先度 $ 最大優先度はBASEPRIレジスタでマスクできない優先度(内部優先度'0') $ そのため,カーネル管理外の割込みでのみ指定可能. $INTNO_CFGINT_VALID = INTNO_VALID$ $INTPRI_CFGINT_VALID = RANGE(-(1 << TBITW_IPRI),-2)$ $ $ kernel/kernel.tf のターゲット依存部 $ $ $ TSKINICTXBの初期化情報を生成 $ $FUNCTION GENERATE_TSKINICTXB$ $SPC${ $SPC$$TSK.TINIB_STKSZ[ARGV[1]]$, $SPC$((void *)((char *)($TSK.TINIB_STK[ARGV[1]]$) $SPC$+ ($TSK.TINIB_STKSZ[ARGV[1]]$))), $SPC$}, $END$ $ $ 標準テンプレートファイルのインクルード $ $INCLUDE "kernel/kernel.tf"$ $FILE "kernel_cfg.c"$ /*$NL$ $SPC$* Target-dependent Definitions (ARM-M)$NL$ $SPC$*/$NL$ $NL$ $ $ ベクターテーブル $ $NL$ __attribute__ ((section(".vector"))) $NL$ const FP _kernel_vector_table[] = $NL$ { $NL$ $TAB$(FP)(TOPPERS_ISTKPT(TOPPERS_ISTK, TOPPERS_ISTKSZ)), // 0 The initial stack pointer $NL$ $TAB$(FP)_start, // 1 The reset handler $NL$ $FOREACH excno {2,3,...,14}$ $IF excno == 11$ $TAB$(FP)(_exit_and_dispatch), /* 11 SVCall handler */ $ELIF excno == 14$ $TAB$(FP)(_dispatch), /* 14 PendSV handler */ $ELSE$ $TAB$(FP)(_kernel_core_exc_entry), $END$ $SPC$$FORMAT("/* %d */", +excno)$$NL$ $END$ $FOREACH inhno INTNO_VALID$ $IF LENGTH(INH.INHNO[inhno]) && ((INH.INHATR[inhno] & TA_NONKERNEL) != 0)$ $TAB$(FP)($INH.INTHDR[inhno]$), $ELSE$ $TAB$(FP)(_kernel_core_int_entry), $END$ $SPC$$FORMAT("/* %d */", +inhno)$$NL$ $END$ $NL$};$NL$ $NL$ $NL$ const FP _kernel_exc_tbl[] = $NL$ {$NL$ $FOREACH excno {0,1,...,14}$ $IF LENGTH(EXC.EXCNO[excno])$ $TAB$(FP)($EXC.EXCHDR[excno]$), $ELSE$ $TAB$(FP)(_kernel_default_exc_handler), $END$ $SPC$$FORMAT("/* %d */", +excno)$$NL$ $END$ $FOREACH inhno INTNO_VALID$ $IF LENGTH(INH.INHNO[inhno])$ $TAB$(FP)($INH.INTHDR[inhno]$), $ELSE$ $TAB$(FP)(_kernel_default_int_handler), $END$ $SPC$$FORMAT("/* %d */", +inhno)$$NL$ $END$ $NL$};$NL$ $NL$ $ $ _kernel_bitpat_cfgintの生成 $ $bitpat_cfgint_num = 0$ $bitpat_cfgint = 0$ const uint32_t _kernel_bitpat_cfgint[ $IF (TMAX_INTNO & 0x0f) == 0x00 $ $bitpat_cfgint_num = (TMAX_INTNO >> 4)$ $ELSE$ $bitpat_cfgint_num = (TMAX_INTNO >> 4) + 1$ $END$ $bitpat_cfgint_num$ ] = {$NL$ $FOREACH num RANGE(0,(bitpat_cfgint_num-1))$ $ //boost のバージョンによって挙動が変わるための対策 $ //http://www.toppers.jp/TOPPERS-USERS/201004/msg00034.html $bitpat_cfgint = 1-1$ $FOREACH inhno RANGE(num*32, (num*32)+31)$ $IF LENGTH(INH.INHNO[inhno])$ $bitpat_cfgint = bitpat_cfgint | (1 << (inhno & 0x01f))$ $END$ $END$ $TAB$UINT32_C($FORMAT("0x%08x", bitpat_cfgint)$), $NL$ $END$ $NL$};$NL$ $NL$ $ $ 割込み優先度テーブル(内部表現) $ const uint32_t _kernel_int_iipm_tbl[] = {$NL$ $FOREACH excno {0,1,...,14}$ $TAB$$FORMAT("UINT32_C(0x%08x), /* 0x%03x */", 0, +excno)$$NL$ $END$ $FOREACH intno INTNO_VALID$ $IF LENGTH(INT.INTNO[intno])$ $intpri = (((1 << TBITW_IPRI) + INT.INTPRI[intno]) << (8 - TBITW_IPRI))$ $ELSE$ $ // LSBを1にしているのは,割込み属性が設定されていないことを判 $ // 別するためである. $intpri = 0 $ $END$ $TAB$$FORMAT("UINT32_C(0x%08x), /* 0x%03x */", intpri, +intno)$$NL$ $END$ $NL$};$NL$ $NL$