$ $ TOPPERS ATK2 $ Toyohashi Open Platform for Embedded Real-Time Systems $ Automotive Kernel Version 2 $ $ Copyright (C) 2013-2015 by Center for Embedded Computing Systems $ Graduate School of Information Science, Nagoya Univ., JAPAN $ Copyright (C) 2013-2014 by FUJI SOFT INCORPORATED, JAPAN $ Copyright (C) 2013-2014 by Panasonic Advanced Technology Development Co., Ltd., JAPAN $ Copyright (C) 2013-2014 by Renesas Electronics Corporation, JAPAN $ Copyright (C) 2013-2014 by Sunny Giken Inc., JAPAN $ Copyright (C) 2013-2014 by TOSHIBA CORPORATION, JAPAN $ Copyright (C) 2013-2014 by Witz Corporation, JAPAN $ $ 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ $ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 $ 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. $ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 $ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー $ スコード中に含まれていること. $ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 $ 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 $ 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 $ の無保証規定を掲載すること. $ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 $ 用できない形で再配布する場合には,次のいずれかの条件を満たすこ $ と. $ (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 $ 作権表示,この利用条件および下記の無保証規定を掲載すること. $ (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに $ 報告すること. $ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 $ 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. $ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 $ 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを $ 免責すること. $ $ 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕 $ 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので $ はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利 $ 用する者に対して,AUTOSARパートナーになることを求めている. $ $ 本ソフトウェアは,無保証で提供されているものである.上記著作権者お $ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 $ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ $ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ $ の責任を負わない. $ $ $Id: prc.tf 189 2015-06-26 01:54:57Z t_ishikawa $ $ $ $ パス2のアーキテクチャ依存テンプレート(V850用) $ $FILE "kernel_mem2.c"$ #pragma section kernel $FILE "Os_Lcfg.c"$ #pragma section kernel $ $ kernel/kernel.tf のターゲット依存部 $ $ $ ユーザスタック領域を確保するコードを出力する $ ARGV[1]:タスクID $ ARGV[2]:スタックサイズ $ $FUNCTION ALLOC_USTACK$ #pragma section $FORMAT(".user_stack.%s", ARGV[1])$$NL$ StackType _kernel_ustack_$ARGV[1]$[COUNT_STK_T($ARGV[2]$)];$NL$ #pragma section kernel$NL$ $TSK.TINIB_USTKSZ[ARGV[1]] = VALUE(FORMAT("ROUND_STK_T(%s)", ARGV[2]), +ARGV[2])$ $TSK.TINIB_USTK[ARGV[1]] = FORMAT("_kernel_ustack_%s", ARGV[1])$ $END$ $ $ ユーザスタック領域のセクション名を返す $ ARGV[1]:タスクID $ $FUNCTION SECTION_USTACK$ $RESULT = FORMAT(".user_stack.%s.bss", ARGV[1])$ $END$ $ $ ユーザスタックのアライメント制約に合わせたサイズを返す $ ARGV[1]:スタックサイズ(アライン前) $ kernel.tfから呼ばれる $ $FUNCTION USTACK_ALIGN_SIZE$ $RESULT = (ARGV[1] + CHECK_USTKSZ_ALIGN - 1) & ~(CHECK_USTKSZ_ALIGN - 1)$ $END$ $ $ 基本タスクの共有スタックの確保 $ ARGV[1]:共有スタック名 $ ARGV[2]:共有スタックID(タスク優先度) $ ARGV[3]:スタックサイズ(アライメント調整済み) $ kernel.tfから呼ばれる $ $FUNCTION ALLOC_SHARED_USTACK$ #pragma section $FORMAT(".shared_user_stack.%s", ARGV[2])$$NL$ StackType $ARGV[1]$[COUNT_STK_T(ROUND_STK_T($ARGV[3]$))];$NL$ #pragma section kernel$NL$ $END$ $ $ 基本タスクの共有スタックのセクション名 $ ARGV[1]:共有スタックID(タスク優先度) $ kernel.tfから呼ばれる $ $FUNCTION SECTION_SHARED_USTACK$ $RESULT = FORMAT(".shared_user_stack.%s.bss", ARGV[1])$ $END$ $ $ 非信頼フックスタックの確保 $ ARGV[1]:スタック名 $ ARGV[2]:スタックサイズ $ kernel.tfから呼ばれる $ $FUNCTION ALLOC_HSTACK$ $name = ARGV[1]$ $size = ARGV[2]$ #pragma section $FORMAT("kernel.srpw")$$NL$ StackType $name$[COUNT_STK_T(ROUND_STK_T($HSTACK_SIZE_STR(size)$))];$NL$ #pragma section kernel$NL$ $END$ $ $ 非信頼フックスタックサイズのアライメント制約を満たすように拡張したサイズの文字列 $ ARGV[1]:スタックサイズ $ kernel.tfから呼ばれる $ $FUNCTION HSTACK_SIZE_STR$ TOPPERS_ROUND_SZ($ARGV[1]$, CHECK_USTKSZ_ALIGN) $END$ $ $ OsMemoryModule はサポートしない $ $TOPPERS_SUPPORT_ATT_MOD = 0$ $FUNCTION HOOK_ERRORCHECK_MOD$ $ERROR$ OsMemoryModule is not supported.$NL$ $END$ $END$ $ $ 共有リード専有ライトのみサポート $ $FUNCTION HOOK_ERRORCHECK_SEC$ $IF !EQ(SEC.OSAPID[ARGV[1]], "") && (SEC.OSAPID[ARGV[1]] != TDOM_KERNEL) && !OSAP.TRUSTED[SEC.OSAPID[ARGV[1]]] && !SEC.EXPORT[ARGV[1]]$ $ERROR$ OsMemorySectionExport of OsMemorySection $SEC.SECTION[ARGV[1]]$ must be true.$NL$ $END$ $END$ $END$ $ $ OsMemoryArea はサポートしない $ $FUNCTION HOOK_ERRORCHECK_MEM$ $ERROR$ OsMemoryArea is not supported.$NL$ $END$ $END$ $ $ 標準のセクションのメモリオブジェクト属性の定義 $ $MEMATR_TEXT = (TA_NOWRITE|TA_EXEC)$ $MEMATR_RODATA = (TA_NOWRITE|TA_EXEC)$ $MEMATR_DATA = TA_MEMINI$ $MEMATR_BSS = TA_NULL$ $MEMATR_PRSV = TA_MEMPRSV$ $MEMATR_ROSDATA = (TA_SDATA|TA_MEMINI|TA_NOWRITE|TA_EXEC)$ $MEMATR_SDATA = (TA_SDATA|TA_MEMINI)$ $MEMATR_SBSS = TA_SDATA$ $TARGET_MEMATR_USTACK = TA_NULL$ $FUNCTION GENERATE_TARGET_MPUINFOB$ $ $ 保護ドメイン初期化ブロックの変更部を生成 $ $FILE "Os_Lcfg.h"$ extern const uint32 tnum_shared_mem;$NL$ extern uint8 * const shared_meminib_table[];$NL$ $NL$ $FILE "kernel_mem2.c"$ $END$ $ $ TSKINICTXBの初期化情報を生成 $ $DOMINICTXB_KERNEL = "{ NULL }"$ $FUNCTION GENERATE_OSAPINIB_MPUINFOB$ $TAB$$TAB${ $IF !OSAP.TRUSTED[ARGV[1]]$ $ 共有リード専用ライト $TAB$$TAB$$TAB$/*dummy at pass2*/$NL$ $TAB$$TAB$$TAB$( (uint8 *)0 ),/* MPLA 1 */$NL$ $TAB$$TAB$$TAB$( (uint8 *)0 ),/* MPUA 1 */$NL$ $ 共有リード専用ライト(ショートデータ) $TAB$$TAB$$TAB$( (uint8 *)0 ),/* MPLA 2 */$NL$ $TAB$$TAB$$TAB$( (uint8 *)0 ),/* MPUA 2 */$NL$ $TAB$$TAB$$TAB$( (uint32)0 ),/* MPRC */$NL$ $ELSE$ $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* MPLA 1 */$NL$ $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* MPUA 1 */$NL$ $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* MPLA 2 */$NL$ $TAB$$TAB$$TAB$( (uint8 *)NULL ),/* MPUA 2 */$NL$ $TAB$$TAB$$TAB$( (uint32)0 ),/* MPRC */$NL$ $END$ $TAB$$TAB$}$NL$ $NL$ $END$ $FUNCTION GENERATE_TSKINICTXB$ $TAB$$TAB${$NL$ $TAB$$TAB$$TAB$$TSK.TINIB_SSTKSZ[ARGV[1]]$,$NL$ $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_SSTK[ARGV[1]]$) $SPC$+ ($TSK.TINIB_SSTKSZ[ARGV[1]]$))),$NL$ $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$ $TAB$$TAB$$TAB$0,$NL$ $TAB$$TAB$$TAB$0,$NL$ $ELSE$ $TAB$$TAB$$TAB$$TSK.TINIB_USTKSZ[ARGV[1]]$,$NL$ $TAB$$TAB$$TAB$((void *)((uint8 *)($TSK.TINIB_USTK[ARGV[1]]$) $SPC$+ ($TSK.TINIB_USTKSZ[ARGV[1]]$))),$NL$ $END$ $TAB$$TAB$},$NL$ $END$ $FUNCTION GENERATE_STKMPUINFOB$ $TAB$$TAB${$NL$ $IF OSAP.TRUSTED[TSK.OSAPID[ARGV[1]]]$ $TAB$$TAB$$TAB$0,$NL$ $TAB$$TAB$$TAB$0,$NL$ $ELSE$ $IF EQ(TSK.STK[ARGV[1]],"NULL")$ $ // stkがNULLの場合の処理 $IF LENGTH(TSK.SHARED_USTK_ID[ARGV[1]])$ $ // 共有スタック $TAB$$TAB$$TAB$/*dummy at pass2*/$NL$ $TAB$$TAB$$TAB$0,$NL$ $TAB$$TAB$$TAB$0,$NL$ $ELSE$ $ // 固有スタック $TAB$$TAB$$TAB$/*dummy at pass2*/$NL$ $TAB$$TAB$$TAB$0,$NL$ $TAB$$TAB$$TAB$0,$NL$ $END$ $ELSE$ $ // stkがNULLでない場合の処理 $TAB$$TAB$$TAB$$FORMAT("(uint8 *)%s", TSK.TINIB_USTK[ARGV[1]])$,$NL$ $TAB$$TAB$$TAB$$FORMAT("(uint8 *)((uint32)%s + %d)", TSK.TINIB_USTK[ARGV[1]], TSK.TINIB_USTKSZ[ARGV[1]])$,$NL$ $END$ $END$ $TAB$$TAB$},$NL$ $END$ $INCLUDE "arch/v850_gcc/prc_common.tf"$ $IF __v850e3v5__$ $ VECTOR_INTBP()$ $ ELSE$ $ $ テーブル参照方式用ベクタテーブル(v850e3v5) $ $FILE "Os_Lcfg_asm.asm"$ .extern _interrupt$NL$ $NL$$FOREACH intno INTNO_VALID$ $isrid = INT.ISRID[intno]$ $IF LENGTH(isrid)$ $IF EQ(ISR.CATEGORY[isrid], "CATEGORY_1")$ .extern _$ISR.INT_ENTRY[isrid]$$NL$ $END$ $END$ $END$ $NL$ .section "EIINTTBL", const$NL$ .extern _intbp_tbl$NL$ .align 512$NL$ _intbp_tbl:$NL$ $JOINEACH intno INTNO_VALID "\n"$ $isrid = INT.ISRID[intno]$ $IF LENGTH(isrid) && EQ(ISR.CATEGORY[isrid], "CATEGORY_1")$ $TAB$.dw #_$ISR.INT_ENTRY[isrid]$ $ELSE$ $TAB$.dw #_interrupt $END$ $TAB$$FORMAT(";/* %d */", intno)$ $END$ $NL$ ;/* in order to restrain warning */$NL$ $NL$ $FOREACH mo MO_ORDER$ $IF MO.LINKER[mo]$ $seg = ""$ $e = REGEX_REPLACE(MO.SECTION[mo], ".*\\.text$", "")$ $IF !EQ(e, MO.SECTION[mo])$ $seg = "text"$ $END$ $e = REGEX_REPLACE(MO.SECTION[mo], ".*\\.const$", "")$ $IF !EQ(e, MO.SECTION[mo])$ $seg = "const"$ $END$ $e = REGEX_REPLACE(MO.SECTION[mo], ".*\\.data$", "")$ $IF !EQ(e, MO.SECTION[mo])$ $seg = "data"$ $END$ $e = REGEX_REPLACE(MO.SECTION[mo], ".*\\.bss$", "")$ $IF !EQ(e, MO.SECTION[mo])$ $seg = "bss"$ $END$ $IF !EQ(seg, "")$ $TAB$.section "$MO.SECTION[mo]$", $seg$$NL$ _dummy$MO.SECTION[mo]$:$NL$ $NL$ $END$ $END$ $END$ $END$ $ //$IF __v850e3v5__$ $ $ arch/ccrh/ldscript.tfのターゲット依存部 $ $ $ CCRH依存部のテンプレートファイルのインクルード $ $INCLUDE "ccrh/ldscript.tf"$ $FILE "kernel_mem2.c"$ $TNUM_SHARED_REGION = 1$ const uint32 tnum_shared_mem = $TNUM_SHARED_REGION * 2$;$NL$ uint8 * const shared_meminib_table[$TNUM_SHARED_REGION * 2$] = {$NL$ $TAB$/*dummy at pass2*/$NL$ $TAB$((uint8 *)NULL),$TAB$/* MPLA 3 */$NL$ $TAB$((uint8 *)NULL),$TAB$/* MPUA 3 */$NL$ };$NL$ $NL$ $FILE "cfg2_out.tf"$ $ LNKSEC.*の出力 $$numls = $numls$$$$NL$ $NL$ $FOREACH lsid RANGE(1, numls)$ $$LNKSEC.MEMREG[$lsid$] = $LNKSEC.MEMREG[lsid]$$$$NL$ $$LNKSEC.SECTION[$lsid$] = $ESCSTR(LNKSEC.SECTION[lsid])$$$$NL$ $NL$ $END$ $JOINEACH tskid TSK.ID_LIST "\n"$ $$TSK.ID[$+tskid$] = $TSK.ID[tskid]$$$ $END$ $NL$