source: atk2-sc3-1.4.0-ntisr/kernel/kernel_common.tf

Last change on this file was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

  • Property svn:executable set to *
File size: 12.1 KB
Line 
1$
2$ TOPPERS ATK2
3$ Toyohashi Open Platform for Embedded Real-Time Systems
4$ Automotive Kernel Version 2
5$
6$ Copyright (C) 2011-2015 by Center for Embedded Computing Systems
7$ Graduate School of Information Science, Nagoya Univ., JAPAN
8$ Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
9$ Copyright (C) 2011-2013 by Spansion LLC, USA
10$ Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
11$ Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12$ Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
13$ Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
14$ Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
15$ Copyright (C) 2011-2015 by Witz Corporation
16$ Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
17$ Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
18$ Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
19$ Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
20$
21$ 上記著作権者
22は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24$ 変・再é…
25å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
26$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
27$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
28$ スコード中に含まれていること.
29$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
30$ 用できる形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
33$ 者
34マニュアルなど)に,上記の著作権表示,この利用条件および下記
35$ の無保証規定を掲載すること.
36$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
37$ 用できない形で再é…
38å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
39$ と.
40$ (a) 再é…
41å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
42マニュアルなど)に,上記の著
43$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
44$ (b) 再é…
45å¸ƒã®å½¢æ…
46‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
47$ 報告すること.
48$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
49$ 害からも,上記著作権者
50およびTOPPERSプロジェクトをå…
51è²¬ã™ã‚‹ã“と.
52$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
53$ 由に基づく請求からも,上記著作権者
54およびTOPPERSプロジェクトを
55$ å…
56è²¬ã™ã‚‹ã“と.
57$
58$ 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
59$ 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
60$ はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
61$ 用する者
62に対して,AUTOSARパートナーになることを求めている.
63$
64$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者
65お
66$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
67$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
68$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
69$ の責任を負わない.
70$
71$ $Id: kernel_common.tf 427 2015-12-07 12:26:47Z witz-itoyo $
72$
73
74$ =====================================================================
75$ TSK.STKとTSK.SSTKを整形
76$ =====================================================================
77
78$FOREACH tskid TSK.ID_LIST$
79$ // 省略された場合はNULLにする
80 $IF !LENGTH(TSK.STK[tskid])$
81 $TSK.STK[tskid] = "NULL"$
82 $END$
83
84$ // 省略された場合はNULLにする
85 $IF !LENGTH(TSK.SSTK[tskid])$
86 $TSK.SSTK[tskid] = "NULL"$
87 $END$
88$END$
89
90$ =====================================================================
91$ メモリオブジェクトのå…
92ˆé ­ã¨æœ«å°¾ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å–り出し
93$ =====================================================================
94
95$IF !ISFUNCTION("START_SYMBOL")$
96$FUNCTION START_SYMBOL$
97 $RESULT = SYMBOL(CONCAT("__start_", ARGV[1]))$
98$END$
99$END$
100
101$IF !ISFUNCTION("LIMIT_SYMBOL")$
102$FUNCTION LIMIT_SYMBOL$
103 $RESULT = SYMBOL(CONCAT("__limit_", ARGV[1]))$
104$END$
105$END$
106
107$ =====================================================================
108$ データセクションのLMAからVMAへのコピー
109$ =====================================================================
110
111$FUNCTION COPY_LMA$
112 $FOREACH lma LMA.ORDER_LIST$
113 $start_data = SYMBOL(LMA.START_DATA[lma])$
114 $end_data = SYMBOL(LMA.END_DATA[lma])$
115 $start_idata = SYMBOL(LMA.START_IDATA[lma])$
116 $IF !LENGTH(start_data)$
117 $ERROR$
118 $FORMAT(_("symbol '%1%' not found"), LMA.START_DATA[lma])$
119 $END$
120 $ELIF !LENGTH(end_data)$
121 $ERROR$
122 $FORMAT(_("symbol '%1%' not found"), LMA.END_DATA[lma])$
123 $END$
124 $ELIF !LENGTH(start_idata)$
125 $ERROR$
126 $FORMAT(_("symbol '%1%' not found"), LMA.START_IDATA[lma])$
127 $END$
128 $ELSE$
129 $BCOPY(start_idata, start_data, end_data - start_data)$
130 $END$
131 $END$
132$END$
133
134$
135$ タスクのスタックをextern宣言する
136$
137$FUNCTION GENERATE_EXPORT_TSK_STK$
138 $FOREACH tskid TSK.ID_LIST$
139 $IF OSAP.TRUSTED[TSK.OSAPID[tskid]] || tmin_os_restarttask <= tskid$
140 $extern_sstk = EQ(TSK.STK[tskid], "NULL") && !LENGTH(TSK.SHARED_SSTK_ID[tskid])$
141 $extern_ustk = 0$
142 $ELSE$
143 $extern_sstk = EQ(TSK.SSTK[tskid], "NULL") && !LENGTH(TSK.SHARED_SSTK_ID[tskid])$
144 $extern_ustk = EQ(TSK.STK[tskid], "NULL") && !LENGTH(TSK.SHARED_USTK_ID[tskid])$
145 $END$
146
147 $IF extern_sstk$
148 $IF !EQ(TSK.RESTARTTASK[tskid],"")$
149 extern StackType _kernel_sstack_restart_$TSK.RESTARTTASK[tskid]$[COUNT_STK_T($TSK.TINIB_SSTKSZ[tskid]$)];$NL$
150 $ELSE$
151 extern StackType _kernel_sstack_$tskid$[COUNT_STK_T($TSK.TINIB_SSTKSZ[tskid]$)];$NL$
152 $END$
153 $END$
154 $IF extern_ustk$
155 extern StackType _kernel_ustack_$tskid$[COUNT_STK_T($TSK.TINIB_USTKSZ[tskid]$)];$NL$
156 $END$
157 $END$
158 $FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$
159 $IF LENGTH(shared_ustack_size[tskpri])$
160 extern StackType _kernel_shared_ustack_$tskpri$[COUNT_STK_T(ROUND_STK_T($shared_ustack_size[tskpri]$))];$NL$
161 $END$
162 $IF LENGTH(shared_sstack_size[tskpri])$
163 extern StackType _kernel_shared_sstack_$tskpri$[COUNT_STK_T(ROUND_STK_T($shared_sstack_size[tskpri]$))];$NL$
164 $END$
165 $END$
166 $NL$
167$END$
168
169$
170$ タスクのextern宣言
171$
172$FUNCTION EXTERN_TSK$
173$ //タスクのextern宣言
174 $FOREACH tskid TSK.ID_LIST$
175 $IF tskid < tmin_os_restarttask$
176 extern TASK($tskid$);$NL$
177 $END$
178 $END$
179 $NL$
180$END$
181
182$
183$ タスク初期化ブロックの出力
184$
185$FUNCTION GENERATE_TINIB_TABLE$
186 /* Task Initialization Block */$NL$
187 $IF LENGTH(TSK.ID_LIST)$
188 const TINIB tinib_table[TNUM_TASK_INC_RT] = {$NL$
189 $JOINEACH tskid TSK.ID_LIST ",\n"$
190 $TAB${$NL$
191$ //OSが生成したリスタートタスクの場合は,この初期化ブロックがOSによって生成されたものであることを示すコメントを出力する
192 $IF tmin_os_restarttask <= tskid$
193 $TAB$$TAB$/* this TINIB is genereted by OS */$NL$
194 $END$
195$ //OSが生成したリスタートタスクの場合は,タスクのå…
196ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’NULLにする
197 $IF tmin_os_restarttask <= tskid$
198 $TAB$$TAB$NULL,$NL$
199 $ELSE$
200 $TAB$$TAB$&TASKNAME($tskid$),$NL$
201 $END$
202$ // タスク初期化コンテキストブロック,スタック領域
203 $IF USE_TSKINICTXB$
204 $GENERATE_TSKINICTXB(tskid)$
205 $ELSE$
206 $TAB$$TAB$$TSK.TINIB_SSTKSZ[tskid]$,$NL$
207 $TAB$$TAB$(void *) $TSK.TINIB_SSTK[tskid]$,$NL$
208 $TAB$$TAB$$TSK.TINIB_USTKSZ[tskid]$,$NL$
209 $TAB$$TAB$(void *) $TSK.TINIB_USTK[tskid]$,$NL$
210 $END$
211
212 $TAB$$TAB$&(osapcb_table[$TSK.OSAPID[tskid]$]),$NL$
213 $TAB$$TAB$$FORMAT("0x%08xU", +TSK.ACSBTMP[tskid])$,$NL$
214 $TAB$$TAB$$TMAX_TPRI - TSK.PRIORITY[tskid]$,$NL$
215 $IF EQ(TSK.SCHEDULE[tskid], "NON") $
216 $TAB$$TAB$$+TPRI_MAXTASK$,$NL$
217 $ELSE$
218 $IF LENGTH(TSK.INRESPRI[tskid])$
219 $TAB$$TAB$$TMAX_TPRI - TSK.INRESPRI[tskid]$,$NL$
220 $ELSE$
221 $TAB$$TAB$$TMAX_TPRI - TSK.PRIORITY[tskid]$,$NL$
222 $END$
223 $END$
224
225 $TAB$$TAB$($+TSK.ACTIVATION[tskid]$U) - 1U,$NL$
226 $IF !OMIT_STKMPUINFOB$
227 $TAB$$TAB$$FORMAT("0x%08xU", +TSK.ASTPTN[tskid])$,$NL$
228 $GENERATE_STKMPUINFOB(tskid)$
229 $ELSE$
230 $TAB$$TAB$$FORMAT("0x%08xU", +TSK.ASTPTN[tskid])$$NL$
231 $END$
232 $TAB$}
233 $END$
234 $NL$
235 };$NL$
236 $ELSE$
237 TOPPERS_EMPTY_LABEL(const TINIB, tinib_table);$NL$
238 $END$
239 $NL$
240$END$
241
242$
243$ OSアプリケーション初期化ブロックの出力
244$
245$FUNCTION GENERATE_OSAPINIB_TABLE$
246 $IF LENGTH(OSAP.ID_LIST)$
247 const OSAPINIB osapinib_table[TNUM_OSAP] = {$NL$
248 $JOINEACH osapid OSAP.ID_LIST ",\n"$
249 $TAB${$NL$
250 $IF EQ(OSAP.RESTARTTASK[osapid], "NO_RESTART_TASK")$
251 $TAB$$TAB$NULL,$NL$
252 $ELSE$
253 $IF EQ(OSAP.RESTARTTASK[osapid], "OS_GEN_RESTARTTASK")$
254$ //OSが生成したリスタートタスクの場合
255 $TAB$$TAB$&tcb_table[$(+OSAP.RESTARTTASK[osapid]-1)$],$NL$
256 $ELSE$
257$ //ユーザがが生成したリスタートタスクの場合
258 $TAB$$TAB$&tcb_table[$(OSAP.RESTARTTASK[osapid])$],$NL$
259 $END$
260 $END$
261 $IF OSAP.TRUSTED[osapid]$
262 $TAB$$TAB$TA_TRUSTED,$NL$
263 $ELSE$
264 $TAB$$TAB$TA_NONTRUSTED,$NL$
265 $END$
266
267 $IF !OMIT_OSAPMPUINFOB$
268 $TAB$$TAB$$FORMAT("0x%08xU", +OSAP.BTMP[osapid])$,$NL$
269 $GENERATE_OSAPINIB_MPUINFOB(osapid)$
270 $ELSE$
271 $TAB$$TAB$$FORMAT("0x%08xU", +OSAP.BTMP[osapid])$$NL$
272 $END$
273
274 $TAB$}
275 $END$
276 $NL$
277 };$NL$
278 $NL$
279 $ELSE$
280 TOPPERS_EMPTY_LABEL(const OSAPINIB, osapinib_table);$NL$
281 $END$
282$END$
283
284$
285$ メモリオブジェクトのベースアドレス順のリストから
286$ 非信頼OSAPからアクセスできない領域を除いたリスト
287$ をMO_MEMTOP_ORDER_MEMINIBにå…
288¥ã‚Œã‚‹
289$
290$FUNCTION SET_MEMTOP_ORDER$
291 $prev = 0$
292 $FOREACH moid SORT(MO_SECTION_LIST, "MO.BASEADDR")$
293
294 $IF (MO.ACPTN_R[moid] != TACP_KERNEL || MO.ACPTN_W[moid] != TACP_KERNEL || MO.ACPTN_X[moid] != TACP_KERNEL)$
295 $IF !prev || (MO.LIMITADDR[prev] <= MO.BASEADDR[moid] && MO.LIMITADDR[prev] != 0)$
296 $MO_MEMTOP_ORDER_MEMINIB = APPEND(MO_MEMTOP_ORDER_MEMINIB, moid)$
297 $prev = moid$
298 $ELSE$
299$ // 同じOSAPに所属するユーザスタックの領域合併
300 $IF MO.TYPE[moid] == TOPPERS_USTACK &&
301 MO.TYPE[prev] == TOPPERS_USTACK &&
302 MO.OSAPID[prev] == MO.OSAPID[moid]$
303$ // ユーザスタック領域の併合処理
304 $MO.TSKID[prev] = 0$
305 $MO.TSKID[moid] = 0$
306 $MO.BASE[moid] = MO.BASE[prev]$
307 $MO.BASEADDR[moid] = MO.BASEADDR[prev]$
308 $IF MO.LIMITADDR[prev] < MO.LIMITADDR[moid]
309 && MO.LIMITADDR[prev] != 0$
310 $MO.SIZE[prev] = MO.LIMITADDR[moid] - MO.BASEADDR[prev]$
311 $MO.LIMITADDR[prev] = MO.LIMITADDR[moid]$
312 $ELSE$
313 $MO.SIZE[moid] = MO.SIZE[prev]$
314 $MO.LIMITADDR[moid] = MO.LIMITADDR[prev]$
315 $END$
316 $END$
317 $END$
318 $END$
319 $END$
320$END$
321
322$
323$ 隣接するメモリオブジェクトのメモリ保護属性が等しい場合は統合する
324$
325$FUNCTION MERGE_MEMINIB$
326 $merged_moid = 0$
327 $FOREACH moid MO_MEMTOP_ORDER_MEMINIB$
328 $IF merged_moid &&
329 (CFG_PASS4 ||
330 MO.LINKER[merged_moid] && MO.LINKER[moid] &&
331 MO.MEMREG[merged_moid] == MO.MEMREG[moid]) &&
332 ((MO.MERGED_LIMITADDR[merged_moid] == MO.BASEADDR[moid] &&
333 MO.ACPTN_R[merged_moid] == MO.ACPTN_R[moid] &&
334 MO.ACPTN_W[merged_moid] == MO.ACPTN_W[moid] &&
335 MO.ACPTN_X[merged_moid] == MO.ACPTN_X[moid]) ||
336 MO.LIMITADDR[moid] == MO.BASEADDR[moid])$
337
338 $MO.MERGED_LIMITADDR[merged_moid] = MO.LIMITADDR[moid]$
339 $MO.MERGED_LIMIT[merged_moid] = MO.LIMIT[moid]$
340 $ELSE$
341 $merged_moid = moid$
342 $new_list = APPEND(new_list, merged_moid)$
343 $MO.MERGED_LIMITADDR[moid] = MO.LIMITADDR[moid]$
344 $MO.MERGED_LIMIT[moid] = MO.LIMIT[moid]$
345 $END$
346 $END$
347 $MO_MEMTOP_ORDER_MEMINIB = new_list$
348$END$
349
350$
351$ OSAPCB外部参ç…
352§å®£è¨€ç”Ÿæˆ
353$
354$FUNCTION EXTERN_OSAPCB$
355$ //OSAPCBのextern宣言
356 extern OSAPCB osapcb_table[];$NL$
357 $NL$
358$END$
359
360$
361$ TCB外部参ç…
362§å®£è¨€ç”Ÿæˆ
363$
364$FUNCTION EXTERN_TCB$
365$ //TCBのextern宣言
366 extern TCB tcb_table[];$NL$
367 $NL$
368$END$
Note: See TracBrowser for help on using the repository browser.