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

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

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

File size: 154.2 KB
Line 
1$
2$ TOPPERS ATK2
3$ Toyohashi Open Platform for Embedded Real-Time Systems
4$ Automotive Kernel Version 2
5$
6$ Copyright (C) 2007 by TAKAGI Nobuhisa
7$ Copyright (C) 2007-2015 by Center for Embedded Computing Systems
8$ Graduate School of Information Science, Nagoya Univ., JAPAN
9$ Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
10$ Copyright (C) 2011-2013 by Spansion LLC, USA
11$ Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
12$ Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
13$ Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
14$ Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
15$ Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
16$ Copyright (C) 2011-2015 by Witz Corporation
17$ Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
18$ Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
19$ Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
20$ Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
21$
22$ 上記著作権者
23は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
24$ ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
25$ 変・再é…
26å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
27$ (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
28$ 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
29$ スコード中に含まれていること.
30$ (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
31$ 用できる形で再é…
32å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
34$ 者
35マニュアルなど)に,上記の著作権表示,この利用条件および下記
36$ の無保証規定を掲載すること.
37$ (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
38$ 用できない形で再é…
39å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
40$ と.
41$ (a) 再é…
42å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
43マニュアルなど)に,上記の著
44$ 作権表示,この利用条件および下記の無保証規定を掲載すること.
45$ (b) 再é…
46å¸ƒã®å½¢æ…
47‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
48$ 報告すること.
49$ (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
50$ 害からも,上記著作権者
51およびTOPPERSプロジェクトをå…
52è²¬ã™ã‚‹ã“と.
53$ また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
54$ 由に基づく請求からも,上記著作権者
55およびTOPPERSプロジェクトを
56$ å…
57è²¬ã™ã‚‹ã“と.
58$
59$ 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
60$ 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
61$ はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
62$ 用する者
63に対して,AUTOSARパートナーになることを求めている.
64$
65$ 本ソフトウェアは,無保証で提供されているものである.上記著作権者
66お
67$ よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
68$ に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
69$ アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
70$ の責任を負わない.
71$
72$ $Id: kernel.tf 491 2015-12-17 10:50:31Z nces-okajima $
73$
74
75$TRACE("EXEC kernel.tf")$
76
77$ XMLのデータ構造に問題があるか
78$FATAL = 0$
79
80$ =====================================================================
81$ boolean判定関数
82$ =====================================================================
83
84$FUNCTION IS_TRUE$
85 $true_list = {1, "1", "true", "TRUE", "ON", "ENABLE"}$
86 $false_list = {0, "0", "false", "FALSE", "OFF", "DISABLE"}$
87 $error_flag = 1$
88
89 $FOREACH false false_list$
90 $IF EQ(false, ARGV[1])$
91 $check_result = VALUE("FALSE", 0)$
92 $error_flag = 0$
93 $END$
94 $END$
95 $FOREACH true true_list$
96 $IF EQ(true, ARGV[1])$
97 $check_result = VALUE("TRUE", 1)$
98 $error_flag = 0$
99 $END$
100 $END$
101
102 $IF error_flag > 0$
103 $ERROR ARGV[2]$$FORMAT(_("%1% must be boolean type"), ARGV[1])$$END$
104 $END$
105
106 $RESULT = check_result$
107$END$
108
109$ =====================================================================
110$ boolean変換
111$ =====================================================================
112
113$OS.STACKMONITORING[1] = IS_TRUE(OS.STACKMONITORING[1], OS.TEXT_LINE[1])$
114$OS.GETSERVICEID[1] = IS_TRUE(OS.GETSERVICEID[1], OS.TEXT_LINE[1])$
115$OS.PARAMETERACCESS[1] = IS_TRUE(OS.PARAMETERACCESS[1], OS.TEXT_LINE[1])$
116$HOOK.STARTUPHOOK[1] = IS_TRUE(HOOK.STARTUPHOOK[1], HOOK.TEXT_LINE[1])$
117$HOOK.SHUTDOWNHOOK[1] = IS_TRUE(HOOK.SHUTDOWNHOOK[1], HOOK.TEXT_LINE[1])$
118$HOOK.PRETASKHOOK[1] = IS_TRUE(HOOK.PRETASKHOOK[1], HOOK.TEXT_LINE[1])$
119$HOOK.POSTTASKHOOK[1] = IS_TRUE(HOOK.POSTTASKHOOK[1], HOOK.TEXT_LINE[1])$
120$HOOK.ERRORHOOK[1] = IS_TRUE(HOOK.ERRORHOOK[1], HOOK.TEXT_LINE[1])$
121$HOOK.PROTECTIONHOOK[1] = IS_TRUE(HOOK.PROTECTIONHOOK[1], HOOK.TEXT_LINE[1])$
122$FOREACH schtblid SCHTBL.ID_LIST$
123 $SCHTBL.REPEAT[schtblid] = IS_TRUE(SCHTBL.REPEAT[schtblid],SCHTBL.TEXT_LINE[schtblid])$
124$END$
125$FOREACH osapid OSAP.ID_LIST$
126 $OSAP.TRUSTED[osapid] = IS_TRUE(OSAP.TRUSTED[osapid], OSAP.TEXT_LINE[osapid])$
127$END$
128$FOREACH regid REG.ID_LIST$
129 $REG.WRITE[regid] = IS_TRUE(REG.WRITE[regid])$
130$END$
131$FOREACH memid MEM.ID_LIST$
132 $MEM.WRITE[memid] = IS_TRUE(MEM.WRITE[memid], MEM.TEXT_LINE[memid])$
133 $MEM.READ[memid] = IS_TRUE(MEM.READ[memid], MEM.TEXT_LINE[memid])$
134 $MEM.EXEC[memid] = IS_TRUE(MEM.EXEC[memid], MEM.TEXT_LINE[memid])$
135 $MEM.CACHE[memid] = IS_TRUE(MEM.CACHE[memid], MEM.TEXT_LINE[memid])$
136 $MEM.DEVICE[memid] = IS_TRUE(MEM.DEVICE[memid], MEM.TEXT_LINE[memid])$
137$END$
138$FOREACH secid SEC.ID_LIST$
139 $SEC.WRITE[secid] = IS_TRUE(SEC.WRITE[secid], SEC.TEXT_LINE[secid])$
140 $SEC.READ[secid] = IS_TRUE(SEC.READ[secid], SEC.TEXT_LINE[secid])$
141 $SEC.EXEC[secid] = IS_TRUE(SEC.EXEC[secid], SEC.TEXT_LINE[secid])$
142 $SEC.SDATA[secid] = IS_TRUE(SEC.SDATA[secid], SEC.TEXT_LINE[secid])$
143 $SEC.CACHE[secid] = IS_TRUE(SEC.CACHE[secid], SEC.TEXT_LINE[secid])$
144 $SEC.DEVICE[secid] = IS_TRUE(SEC.DEVICE[secid], SEC.TEXT_LINE[secid])$
145$END$
146$FOREACH modid MOD.ID_LIST$
147 $MOD.EXPORT[modid] = IS_TRUE(MOD.EXPORT[modid], MOD.TEXT_LINE[modid])$
148$END$
149
150
151$ =====================================================================
152$ OSAPのエラーチェックと関連づけ
153$ =====================================================================
154
155$tnum_os_restarttask = 0$
156$FOREACH osapid OSAP.ID_LIST$
157 $FOREACH tskid OSAP.TSK_LIST[osapid]$
158 $IF LENGTH(TSK.OSAPID[tskid])$
159 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsTask(%1%) belongs to another OsApplication(%2%)"), tskid, TSK.OSAPID[tskid])$$END$
160 $ELSE$
161 $TSK.OSAPID[tskid] = osapid$
162 $END$
163 $END$
164
165 $FOREACH cntid OSAP.CNT_LIST[osapid]$
166 $IF LENGTH(CNT.OSAPID[cntid])$
167 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsCounter(%1%) belongs to another OsApplication(%2%)"), cntid, CNT.OSAPID[cntid])$$END$
168 $ELSE$
169 $CNT.OSAPID[cntid] = osapid$
170 $END$
171 $END$
172
173 $FOREACH almid OSAP.ALM_LIST[osapid]$
174 $IF LENGTH(ALM.OSAPID[almid])$
175 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsAlarm(%1%) belongs to another OsApplication(%2%)"), almid, ALM.OSAPID[almid])$$END$
176 $ELSE$
177 $ALM.OSAPID[almid] = osapid$
178 $END$
179 $END$
180
181 $FOREACH isrid OSAP.ISR_LIST[osapid]$
182 $IF LENGTH(ISR.OSAPID[isrid])$
183 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsIsr(%1%) belongs to another OsApplication(%2%)"), isrid, ISR.OSAPID[isrid])$$END$
184 $ELSE$
185 $ISR.OSAPID[isrid] = osapid$
186 $END$
187 $END$
188
189 $FOREACH schtblid OSAP.SCHTBL_LIST[osapid]$
190 $IF LENGTH(SCHTBL.OSAPID[schtblid])$
191 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsScheduleTable(%1%) belongs to another OsApplication(%2%)"), schtblid, SCHTBL.OSAPID[schtblid])$$END$
192 $ELSE$
193 $SCHTBL.OSAPID[schtblid] = osapid$
194 $END$
195 $END$
196
197 $FOREACH secid OSAP.SEC_LIST[osapid]$
198 $IF LENGTH(SEC.OSAPID[secid])$
199 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsMemorySection(%1%) belongs to another OsApplication(%2%)"),secid, SEC.OSAPID[secid])$$END$
200 $ELSE$
201 $SEC.OSAPID[secid] = osapid$
202 $END$
203 $END$
204
205 $FOREACH modid OSAP.MOD_LIST[osapid]$
206 $IF LENGTH(MOD.OSAPID[modid])$
207 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsMemoryModule(%1%) belongs to another OsApplication(%2%)"), modid, MOD.OSAPID[modid])$$END$
208 $ELSE$
209 $MOD.OSAPID[modid] = osapid$
210 $END$
211 $END$
212
213 $FOREACH memid OSAP.MEM_LIST[osapid]$
214 $IF LENGTH(MEM.OSAPID[memid])$
215 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsMemoryArea(%1%) belongs to another OsApplication(%2%)"), memid, MEM.OSAPID[memid])$$END$
216 $ELSE$
217 $MEM.OSAPID[memid] = osapid$
218 $END$
219 $END$
220
221 $IF LENGTH(OSAP.RESTARTTASK[osapid])$
222 $FOREACH tskid TSK.ID_LIST$
223 $IF EQ(OSAP.RESTARTTASK[osapid], tskid)$
224 $IF LENGTH(TSK.OSAPID[tskid]) && !EQ(TSK.OSAPID[tskid], osapid)$
225 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsRestartTask(%1%) belongs to another OsApplication(%2%)"), tskid, TSK.OSAPID[tskid])$$END$
226 $ELIF LENGTH(TSK.AUTOSTART.APP_LIST[tskid])$
227 $WARNING OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsRestartTask(%1%) is set to an auto start task"), tskid)$$END$
228 $OSAP.RESTARTTASK[osapid] = tskid$
229 $TSK.OSAPID[tskid] = osapid$
230 $TSK.RESTARTTASK[tskid] = osapid$
231 $ELSE$
232 $OSAP.RESTARTTASK[osapid] = tskid$
233 $TSK.OSAPID[tskid] = osapid$
234 $TSK.RESTARTTASK[tskid] = osapid$
235 $END$
236 $END$
237 $END$
238 $IF !LENGTH(OSAP.RESTARTTASK[osapid])$
239$ // OsRestartTaskが見つからなかった
240 $ERROR OSAP.TEXT_LINE[osapid]$$FORMAT(_("OsRestartTask(%1%) of OSAP(%2%) no exist"), OSAP.RESTARTTASK[osapid], osapid)$$END$
241 $END$
242 $ELSE$
243$ //信頼OSAPの場合は,強制終了することがないため,リスタートタスクは不要
244 $IF OSAP.TRUSTED[osapid]$
245 $OSAP.RESTARTTASK[osapid] = VALUE("NO_RESTART_TASK", 0)$
246 $ELSE$
247 $OSAP.RESTARTTASK[osapid] = VALUE("OS_GEN_RESTARTTASK", LENGTH(TSK.ID_LIST)+1)$
248 $TSK.ID_LIST = APPEND(TSK.ID_LIST, VALUE("OS_GEN_RESTARTTASK", +OSAP.RESTARTTASK[osapid]))$
249$ //OS指定リスタートタスクのパラメータを設定する.
250 $TSK.OSAPID[OSAP.RESTARTTASK[osapid]] = osapid$
251 $TSK.PRIORITY[OSAP.RESTARTTASK[osapid]] = TMAX_TPRI$
252 $TSK.EXTENDED[OSAP.RESTARTTASK[osapid]] = 0$
253 $TSK.ACTIVATION[OSAP.RESTARTTASK[osapid]] = VALUE("1",1)$
254 $TSK.SCHEDULE[OSAP.RESTARTTASK[osapid]] = "FULL"$
255 $TSK.RESTARTTASK[OSAP.RESTARTTASK[osapid]] = osapid$
256 $tnum_os_restarttask = tnum_os_restarttask + 1$
257 $END$
258 $END$
259$END$
260
261$ OSで生成したリスタートタスクの値属性のうち最小のもの
262$tmin_os_restarttask = LENGTH(TSK.ID_LIST) - tnum_os_restarttask + 1$
263$ OSAP.TFN.*をTFN.*にコピー
264$TFN.ID_LIST = {}$
265$FOREACH tfnid OSAP.TFN.ID_LIST$
266 $osapid = OSAP.TFN.PARENT[tfnid]$
267 $FOREACH tfnid2 TFN.ID_LIST$
268 $IF EQ(tfnid, tfnid2)$
269 $ERROR OSAP.TEXT_LINE[tfnid]$$FORMAT(_("duplicate OsApplicationTrustedFunction name(%1%) in OSAP (%2%) and (%3%)"), tfnid, osapid, TFN.OSAPID[tfnid2])$$END$
270 $DIE()$
271 $END$
272 $END$
273 $TFN.ID_LIST = APPEND(TFN.ID_LIST, tfnid)$
274 $TFN.FUNC[tfnid] = OSAP.TFN.FUNC[tfnid]$
275 $TFN.STKSZ[tfnid] = OSAP.TFN.STKSZ[tfnid]$
276 $TFN.OSAPID[tfnid] = osapid$
277$END$
278
279
280$ =====================================================================
281$ OSTK.STKがない場合にNULLをå…
282¥ã‚Œã‚‹
283$ =====================================================================
284
285$FOREACH ostkid OSTK.ID_LIST$
286 $IF !LENGTH(OSTK.STK[ostkid])$
287 $OSTK.STK[ostkid] = "NULL"$
288 $END$
289$END$
290
291
292$ =====================================================================
293$ NTHSTK.STKがない場合にNULLをå…
294¥ã‚Œã‚‹
295$ =====================================================================
296
297$FOREACH nthstkid NTHSTK.ID_LIST$
298 $IF !LENGTH(NTHSTK.STK[nthstkid])$
299 $NTHSTK.STK[nthstkid] = "NULL"$
300 $END$
301$END$
302
303
304$ =====================================================================
305$ REG.REGATRとREG.REGNAMEの作成
306$ REG.REGIONとREG.ID_LISTの整形
307$ =====================================================================
308
309$new_id_list = {}$
310$FOREACH regid REG.ID_LIST$
311 $IF !LENGTH(REG.REGATR[regid])$
312 $REG.REGATR[regid] = TA_NULL$
313 $END$
314 $IF !REG.WRITE[regid]$
315 $REG.REGATR[regid] = REG.REGATR[regid] | TA_NOWRITE$
316 $END$
317 $REG.REGION[regid] = ESCSTR(REG.REGION[regid])$
318 $new_id_list = APPEND(new_id_list, +regid)$
319$END$
320$REG.ID_LIST = new_id_list$
321$REG.ORDER_LIST = new_id_list$
322
323
324$ =====================================================================
325$ SRG.STDROMとSRG.STDRAMを整形
326$ =====================================================================
327
328$new_id_list = {}$
329$FOREACH srgid SRG.ID_LIST$
330 $SRG.STDROM[srgid] = VALUE(ESCSTR(SRG.STDROM[srgid]), +srgid)$
331 $SRG.STDRAM[srgid] = VALUE(ESCSTR(SRG.STDRAM[srgid]), +srgid)$
332 $new_id_list = APPEND(new_id_list, +srgid)$
333$END$
334$SRG.ORDER_LIST = new_id_list$
335
336$ =====================================================================
337$ SECのエラーチェックとSEC.MEMATRの作成
338$ =====================================================================
339
340$FOREACH secid SEC.ID_LIST$
341 $SEC.MEMATR[secid] = 0$
342
343 $IF LENGTH(SEC.INIT[secid])$
344 $IF EQ(SEC.INIT[secid], "DATA")$
345 $SEC.MEMATR[secid] = TA_MEMINI$
346 $ELIF EQ(SEC.INIT[secid], "BSS")$
347 $SEC.MEMATR[secid] = TA_NULL$
348 $ELIF EQ(SEC.INIT[secid], "NO_INITIALIZE")$
349 $SEC.MEMATR[secid] = TA_MEMPRSV$
350 $ELSE$
351 $ERROR SEC.TEXT_LINE[secid]$$FORMAT(_("OsMemorySectionInitialize must be DATA or BSS or NO_INITIALIZE"))$$END$
352 $END$
353 $IF !REG.WRITE[SEC.MEMREG[secid]]$
354 $ERROR SEC.TEXT_LINE[secid]$$FORMAT(_("OsMemorySectionInitialize must not be defined on nonwritable memory region"))$$END$
355 $END$
356 $ELSE$
357 $IF REG.WRITE[SEC.MEMREG[secid]]$
358 $ERROR SEC.TEXT_LINE[secid]$$FORMAT(_("OsMemorySectionInitialize must be defined on writable memory region"))$$END$
359 $END$
360 $END$
361
362 $IF !SEC.WRITE[secid]$
363 $SEC.MEMATR[secid] = SEC.MEMATR[secid] | TA_NOWRITE$
364 $END$
365 $IF !SEC.READ[secid]$
366 $SEC.MEMATR[secid] = SEC.MEMATR[secid] | TA_NOREAD$
367 $END$
368 $IF SEC.EXEC[secid]$
369 $SEC.MEMATR[secid] = SEC.MEMATR[secid] | TA_EXEC$
370 $END$
371 $IF SEC.SDATA[secid]$
372 $SEC.MEMATR[secid] = SEC.MEMATR[secid] | TA_SDATA$
373 $END$
374 $IF !SEC.CACHE[secid]$
375 $SEC.MEMATR[secid] = SEC.MEMATR[secid] | TA_UNCACHE$
376 $END$
377 $IF SEC.DEVICE[secid]$
378 $SEC.MEMATR[secid] = SEC.MEMATR[secid] | TA_IODEV$
379 $END$
380$END$
381
382
383$ =====================================================================
384$ MEM.MEMATRの作成
385$ =====================================================================
386
387$FOREACH memid MEM.ID_LIST$
388 $MEM.MEMATR[memid] = TA_MEMPRSV$
389 $IF !MEM.WRITE[memid]$
390 $MEM.MEMATR[memid] = MEM.MEMATR[memid] | TA_NOWRITE$
391 $END$
392 $IF !MEM.READ[memid]$
393 $MEM.MEMATR[memid] = MEM.MEMATR[memid] | TA_NOREAD$
394 $END$
395 $IF MEM.EXEC[memid]$
396 $MEM.MEMATR[memid] = MEM.MEMATR[memid] | TA_EXEC$
397 $END$
398 $IF !MEM.CACHE[memid]$
399 $MEM.MEMATR[memid] = MEM.MEMATR[memid] | TA_UNCACHE$
400 $END$
401 $IF MEM.DEVICE[memid]$
402 $MEM.MEMATR[memid] = MEM.MEMATR[memid] | TA_IODEV$
403 $END$
404$END$
405
406
407$ =====================================================================
408$ LNKをSECに統合する
409$ =====================================================================
410
411$IF LENGTH(SEC.ID_LIST)$
412 $i = AT(SEC.ID_LIST, LENGTH(SEC.ID_LIST) - 1) + 1$
413$ELSE$
414 $i = 1$
415$END$
416$FOREACH lnkid LNK.ID_LIST$
417 $SEC.SECTION[i] = LNK.SECTION[lnkid]$
418 $SEC.MEMREG[i] = LNK.MEMREG[lnkid]$
419 $SEC.ID_LIST = APPEND(SEC.ID_LIST, VALUE(lnkid, i))$
420 $SEC.ORDER_LIST = APPEND(SEC.ORDER_LIST, VALUE(lnkid, i))$
421 $i = i + 1$
422$END$
423
424$ MEMREGはREFになっているがkernel.tfでは文字列として扱う
425$FOREACH secid SEC.ID_LIST$
426 $SEC.MEMREG[secid] = REG.REGION[SEC.MEMREG[secid]]$
427 $SEC.SECTION[secid] = ESCSTR(SEC.SECTION[secid])$
428$END$
429
430
431$ =====================================================================
432$ MOD.MODULEの作成
433$ =====================================================================
434
435$nummod = LENGTH(MOD.ORDER_LIST)$
436$FOREACH modid MOD.ID_LIST$
437 $FOREACH name MOD.MODULE[modid]$
438 $IF EQ(name, AT(MOD.MODULE[modid], 0))$
439 $MOD.MODULE[modid] = ESCSTR(name)$
440 $ELSE$
441 $nummod = nummod + 1$
442 $MOD.ORDER_LIST = APPEND(nummod, MOD.ORDER_LIST)$
443 $MOD.MODULE[nummod] = ESCSTR(name)$
444 $MOD.OSAPID[nummod] = MOD.OSAPID[modid]$
445 $MOD.TEXT_LINE[nummod] = MOD.TEXT_LINE[modid]$
446 $MOD.EXPORT[nummod] = MOD.EXPORT[modid]$
447 $END$
448 $END$
449$END$
450
451$ =====================================================================
452$ TSKのエラーチェックと関連づけ
453$ =====================================================================
454
455$TRACE("ASSOCIATE TASK")$
456
457$ TSK.AUTOSTARTをTSKにコピー
458$FOREACH aid TSK.AUTOSTART.ID_LIST$
459 $tskid = TSK.AUTOSTART.PARENT[aid]$
460 $TSK.APP_LIST[tskid] = TSK.AUTOSTART.APP_LIST[aid]$
461$END$
462
463
464$FOREACH tskid TSK.ID_LIST$
465 $IF LENGTH(TSK.OSAPID[tskid])$
466 $IF OSAP.TRUSTED[TSK.OSAPID[tskid]]$
467$ // 信頼タスクはOsTaskSystemStackStartAddressの使用不可
468 $IF LENGTH(TSK.SSTK[tskid])$
469 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("Trusted OsTask(%1%) can't use OsTaskSystemStackStartAddress"), tskid)$$END$
470 $END$
471 $ELSE$
472$ // 非信頼タスクでシステムスタックのå…
473ˆé ­ç•ªåœ°ãŒæŒ‡å®šã•ã‚Œã¦ã‚µã‚¤ã‚ºãŒæŒ‡å®šã•ã‚Œãªã„
474 $IF LENGTH(TSK.SSTK[tskid]) && !LENGTH(TSK.SSTKSZ[tskid])$
475 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskSystemStackSize of Non-Trusted OsTask(%1%) is necessary when OsTaskSystemStackStartAddress is used"), tskid)$$END$
476 $END$
477 $END$
478 $ELSE$
479 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTask(%1%) does not belong OsApplication"), tskid)$$END$
480 $DIE()$
481 $END$
482$END$
483
484
485$ =====================================================================
486$ ISRのエラーチェックと関連づけ
487$ =====================================================================
488
489$TRACE("ASSOCIATE ISR")$
490
491$FOREACH isrid ISR.ID_LIST$
492 $IF !(EQ(ISR.SOURCE[isrid], "ENABLE") || EQ(ISR.SOURCE[isrid], "DISABLE"))$
493 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsIsrInterruptSource must be ENABLE or DISABLE"))$$END$
494 $END$
495
496$ // C1ISRはENABLEにする必
497要がある
498 $IF EQ(ISR.SOURCE[isrid], "DISABLE") && EQ(ISR.CATEGORY[isrid], "CATEGORY_1")$
499 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsIsrInterruptSource of C1ISR OsIsr(%1%) must include ENABLE"), isrid)$$END$
500 $END$
501
502 $IF EQ(ISR.SOURCE[isrid], "ENABLE")$
503 $IF LENGTH(ISR.INTATR[isrid])$
504 $ISR.INTATR[isrid] = VALUE(CONCAT(ISR.INTATR[isrid], " | ENABLE"), ISR.INTATR[isrid] | ENABLE)$
505 $ELSE$
506 $ISR.INTATR[isrid] = ENABLE$
507 $END$
508 $ELSE$
509
510$ // 割込み要求ラインの有効/無効を制御出来ないにも関わらず,OsIsrInterruptSourceがDISABLEになっている場合はエラーとする
511 $IF !LENGTH(FIND(INTNO_CONTROLLABLE, ISR.INTNO[isrid]))$
512 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("Although the irq-line of ISR OsIsr(%1%) is not controllable, OsIsrInterruptSource of OsIsr(%1%) is DISABLE, "), isrid)$$END$
513 $END$
514
515 $IF LENGTH(ISR.INTATR[isrid])$
516 $ISR.INTATR[isrid] = VALUE(CONCAT(ISR.INTATR[isrid], " | DISABLE"), ISR.INTATR[isrid] | DISABLE)$
517 $ELSE$
518 $ISR.INTATR[isrid] = DISABLE$
519 $END$
520 $END$
521
522 $IF EQ(ISR.CATEGORY[isrid], "CATEGORY_1")$
523 $IF LENGTH(ISR.STKSZ[isrid])$
524 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsIsrStackSize of C1ISR OsIsr(%1%) must not define"), isrid)$$END$
525 $ELSE$
526 $ISR.STKSZ[isrid] = 0$
527 $END$
528 $ELIF EQ(ISR.CATEGORY[isrid], "CATEGORY_2")$
529 $IF LENGTH(ISR.STKSZ[isrid]) && (ISR.STKSZ[isrid] == 0)$
530 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsIsrStackSize of C2ISR OsIsr(%1%) should not defined zero"), isrid)$$END$
531 $END$
532$ // C2ISRスタックサイズのデフォルト設定
533 $IF !LENGTH(ISR.STKSZ[isrid])$
534 $ISR.STKSZ[isrid] = DEFAULT_ISRSTKSZ$
535 $END$
536 $END$
537$END$
538
539
540$ =====================================================================
541$ EVTに関する処理
542$ =====================================================================
543
544$FOREACH evtid EVT.ID_LIST$
545$ // マスクが省略された場合はAUTOにする
546 $IF !LENGTH(EVT.MASK[evtid])$
547 $EVT.MASK[evtid] = AUTO$
548 $END$
549$END$
550
551
552$ =====================================================================
553$ CNTに関する処理
554$ =====================================================================
555
556$
557$ 文字列が数値かどうかチェック
558$
559$FUNCTION VALIDATE_NUMBER$
560
561$ // 指数部のチェック
562 $e = REGEX_REPLACE(ARGV[1], "^[0-9]+\\.[0-9]+[eE][-]?[0-9]+$|^[0-9]+[eE][-]?[0-9]+$", "")$
563 $IF EQ(e, ARGV[1])$
564$ // 指数部がない場合
565$ // 仮数部のチェック
566 $e = REGEX_REPLACE(ARGV[1], "^[0-9]+\\.[0-9]+$", "")$
567 $IF EQ(e, ARGV[1])$
568$ // 少数部がない場合
569$ // 整数部のチェック
570 $e = REGEX_REPLACE(ARGV[1], "^[0-9]+$", "")$
571 $IF EQ(e, ARGV[1])$
572 $ERROR$
573 $FORMAT("%1% is invalid number\n", ARGV[1])$
574 $END$
575 $END$
576 $END$
577 $END$
578
579$END$
580
581$
582$ 浮動小数点型の文字列を整数に変換
583$
584$FUNCTION FLOAT_TO_FIXINT$
585 $num_org = ARGV[1]$
586 $VALIDATE_NUMBER(num_org)$
587
588$ // 指数部の変換
589 $exp = REGEX_REPLACE(num_org, "^[0-9]+\\.[0-9]+[eE]([-]?[0-9]+)$", "$1")$
590 $IF EQ(exp, num_org)$
591 $exp = REGEX_REPLACE(num_org, "^[0-9]+[eE]([-]?[0-9]+)$", "$1")$
592 $IF EQ(exp, num_org)$
593$ // 指数表現でない
594 $exp = 0$
595 $ELSE$
596$ // 指数表現
597 $exp = ATOI(exp)$
598 $num_org = REGEX_REPLACE(num_org, "^([0-9]+)[eE][-]?[0-9]+$", "$1")$
599 $END$
600 $ELSE$
601$ // 指数表現
602 $exp = ATOI(exp)$
603 $num_org = REGEX_REPLACE(num_org, "^([0-9]+\\.[0-9]+)[eE][-]?[0-9]+$", "$1")$
604 $END$
605
606 $multiple = 1$
607 $e = REGEX_REPLACE(num_org, "^[0-9]+\\.[0-9]+$", "")$
608 $IF !EQ(e, num_org)$
609$ // 小数点
610$ // 仮数部の変換
611$ // 小数点以上
612 $num_l = REGEX_REPLACE(num_org, "^([0-9]+)\\.[0-9]+$", "$1")$
613$ // 小数点以下
614 $num_r_tmp = REGEX_REPLACE(num_org, "^[0-9]+\\.([0-9]+)$", "$1")$
615 $num_r = "0"$
616$ // 小数点以下の桁数を計算
617 $WHILE !EQ(num_r_tmp, "")$
618 $num_r = CONCAT(num_r, REGEX_REPLACE(num_r_tmp, "^(.).*$", "$1"))$
619 $num_r_tmp = REGEX_REPLACE(num_r_tmp, "^.(.*)$", "$1")$
620 $multiple = multiple * 10$
621 $END$
622
623$ // 仮数部を整数に変換
624 $num_result = ATOI(CONCAT("0", num_l), 10) * multiple + ATOI(num_r, 10)$
625$ // 指数部が正数の場合は,その分の基数を仮数部に乗ずる
626 $ELSE$
627$ // 整数
628 $num_result = ATOI(num_org)$
629 $END$
630
631$ // 指数部が整数の場合
632 $WHILE exp > 0$
633 $IF multiple >= 10$
634 $multiple = multiple / 10$
635 $ELSE$
636 $num_result = num_result * 10$
637 $END$
638 $exp = exp - 1$
639 $END$
640
641$ // 指数部が負数の場合は,返り値とする指数分に加える
642 $WHILE exp < 0$
643 $multiple = multiple * 10$
644 $exp = exp + 1$
645 $END$
646
647$ // VALUE("整数化した数値がå…
648ƒã®æ•°å€¤ã®ä½•å€ã‹", å…
649ƒã®æ•°å€¤ã‚’整数化した数値)を返す
650 $RESULT = VALUE(FORMAT("%d", multiple), num_result)$
651$END$
652
653$FOREACH cntid CNT.ID_LIST$
654 $IF EQ(CNT.CNTATR[cntid], "HARDWARE")$
655 $IF !LENGTH(CNT.ISRID[cntid])$
656 $FATAL = 1$
657 $ERROR CNT.TEXT_LINE[cntid]$$FORMAT(_("OsCounterIsrRef of HARDWARE OsCounter(%1%) is not defined"), cntid)$$END$
658 $END$
659
660$ // NSPERTICKをSECONDSPERTICKから計算する
661 $IF LENGTH(CNT.SECONDSPERTICK[cntid])$
662 $secondspertick = FLOAT_TO_FIXINT(CNT.SECONDSPERTICK[cntid])$
663 $nspertick = (+secondspertick * 1000000000) / ATOI(secondspertick)$
664 $CNT.NSPERTICK[cntid] = CONCAT(nspertick,"U")$
665 $END$
666 $END$
667
668$END$
669
670
671$ =====================================================================
672$ ALMに関する処理
673$ =====================================================================
674
675$TRACE("ASSOCIATE ALARM")$
676
677$ ALM.AUTOSTART.*からALM.*にコピー
678$FOREACH aid ALM.AUTOSTART.ID_LIST$
679 $almid = ALM.AUTOSTART.PARENT[aid]$
680 $ALM.APP_LIST[almid] = ALM.AUTOSTART.APP_LIST[aid]$
681 $ALM.ALARMTIME[almid] = ALM.AUTOSTART.ALARMTIME[aid]$
682 $ALM.CYCLETIME[almid] = ALM.AUTOSTART.CYCLETIME[aid]$
683 $ALM.AUTOSTARTTYPE[almid] = ALM.AUTOSTART.TYPE[aid]$
684$END$
685
686$FOREACH almid ALM.ID_LIST$
687 $ALM.ALMATR_COUNT[almid] = 0$
688$END$
689
690$ ALM.ACTION.ACTIVATETASK.*からALM.*にコピー
691$FOREACH almactid ALM.ACTION.ACTIVATETASK.ID_LIST$
692 $almid = ALM.ACTION.PARENT[ALM.ACTION.ACTIVATETASK.PARENT[almactid]]$
693 $ALM.ALMATR[almid] = "ACTIVATETASK"$
694 $ALM.TSKID[almid] = ALM.ACTION.ACTIVATETASK.TSKID[almactid]$
695 $ALM.ALMATR_COUNT[almid] = ALM.ALMATR_COUNT[almid] + 1$
696$END$
697
698$ ALM.ACTION.SETEVENT.*からALM.*にコピー
699$FOREACH almactid ALM.ACTION.SETEVENT.ID_LIST$
700 $almid = ALM.ACTION.PARENT[ALM.ACTION.SETEVENT.PARENT[almactid]]$
701 $ALM.ALMATR[almid] = "SETEVENT"$
702 $ALM.TSKID[almid] = ALM.ACTION.SETEVENT.TSKID[almactid]$
703 $ALM.EVTID[almid] = ALM.ACTION.SETEVENT.EVTID[almactid]$
704 $ALM.ALMATR_COUNT[almid] = ALM.ALMATR_COUNT[almid] + 1$
705$END$
706
707$ ALM.ACTION.INCREMENTCOUNTER.*からALM.*にコピー
708$FOREACH almactid ALM.ACTION.INCREMENTCOUNTER.ID_LIST$
709 $almid = ALM.ACTION.PARENT[ALM.ACTION.INCREMENTCOUNTER.PARENT[almactid]]$
710 $ALM.ALMATR[almid] = "INCREMENTCOUNTER"$
711 $ALM.INCID[almid] = ALM.ACTION.INCREMENTCOUNTER.INCID[almactid]$
712 $ALM.ALMATR_COUNT[almid] = ALM.ALMATR_COUNT[almid] + 1$
713$END$
714
715$IF LENGTH(ALM.ACTION.CALLBACK.ID_LIST)$
716 $ERROR ALM.ACTION.CALLBACK.TEXT_LINE[1]$$FORMAT(_("OsAlarmCallback can't be used in SC3"))$$END$
717$END$
718
719$ ALM.ACTION.*を2つ以上定義していないか
720$FOREACH almid ALM.ID_LIST$
721 $IF ALM.ALMATR_COUNT[almid] != 1$
722 $FATAL = 1$
723 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmAction of OsAlarm(%1%) have too many sub container"), almid)$$END$
724 $END$
725$END$
726
727
728$ =====================================================================
729$ SCHTBLに関する処理
730$ =====================================================================
731
732$TRACE("ASSOCIATE SCHTBL")$
733
734$ 省略された場合はNONEにする
735$FOREACH schtblid SCHTBL.ID_LIST$
736 $SCHTBL.SYNCSTRATEGY[schtblid] = "NONE"$
737$END$
738
739$ SCHTBL.AUTOSTART.*からSCHTBL.*にコピー
740$FOREACH aid SCHTBL.AUTOSTART.ID_LIST$
741 $schtblid = SCHTBL.AUTOSTART.PARENT[aid]$
742 $SCHTBL.APP_LIST[schtblid] = SCHTBL.AUTOSTART.APP_LIST[aid]$
743 $IF LENGTH(SCHTBL.AUTOSTART.STARTTICK[aid])$
744 $SCHTBL.STARTTICK[schtblid] = SCHTBL.AUTOSTART.STARTTICK[aid]$
745 $ELSE$
746$ // 省略されたことを示す
747 $SCHTBL.STARTTICK[schtblid] = "NULL"$
748 $END$
749 $SCHTBL.AUTOSTARTTYPE[schtblid] = SCHTBL.AUTOSTART.TYPE[aid]$
750$END$
751
752$FOREACH syncid SCHTBL.SYNC.ID_LIST$
753 $schtblid = SCHTBL.SYNC.PARENT[syncid]$
754 $SCHTBL.SYNCSTRATEGY[schtblid] = SCHTBL.SYNC.STRATEGY[syncid]$
755$END$
756
757
758$ =====================================================================
759$ EXPPTACTに関する処理
760$ =====================================================================
761
762$ SCHTBL.EXPPT.ACTIVATETASK.*からEXPPTACTにコピー
763$i = 0$
764$FOREACH acttskid SCHTBL.EXPPT.ACTIVATETASK.ID_LIST$
765 $expid = SCHTBL.EXPPT.ACTIVATETASK.PARENT[acttskid]$
766 $schtblid = SCHTBL.EXPPT.PARENT[expid]$
767
768 $EXPPTACT.SCHTBLID[i] = schtblid$
769 $EXPPTACT.OFFSET[i] = SCHTBL.EXPPT.OFFSET[expid]$
770 $EXPPTACT.TSKID[i] = SCHTBL.EXPPT.ACTIVATETASK.TSKID[acttskid]$
771 $EXPPTACT.EXPIREATR[i] = "ACTIVATETASK"$
772
773 $EXPPTACT.ID_LIST = APPEND(EXPPTACT.ID_LIST, i)$
774 $i = i + 1$
775$END$
776
777$ SCHTBL.EXPPT.SETEVENT.*からEXPPTACTにコピー
778$FOREACH setevid SCHTBL.EXPPT.SETEVENT.ID_LIST$
779 $expid = SCHTBL.EXPPT.SETEVENT.PARENT[setevid]$
780 $schtblid = SCHTBL.EXPPT.PARENT[expid]$
781
782 $EXPPTACT.SCHTBLID[i] = schtblid$
783 $EXPPTACT.OFFSET[i] = SCHTBL.EXPPT.OFFSET[expid]$
784 $EXPPTACT.TSKID[i] = SCHTBL.EXPPT.SETEVENT.TSKID[setevid]$
785 $EXPPTACT.EVTID[i] = SCHTBL.EXPPT.SETEVENT.EVTID[setevid]$
786 $EXPPTACT.EXPIREATR[i] = "SETEVENT"$
787
788 $EXPPTACT.ID_LIST = APPEND(EXPPTACT.ID_LIST, i)$
789 $i = i + 1$
790$END$
791
792$IF FATAL$
793 $DIE()$
794$END$
795
796
797$ =====================================================================
798$ IOCに関する処理
799$ =====================================================================
800
801$ OsIocCommunication
802$FOREACH iocid IOC.ID_LIST$
803$ // 省略されたパラメータにNULLをå…
804¥ã‚Œã‚‹
805 $IF !LENGTH(IOC.BUFLEN[iocid])$
806 $IOC.BUFLEN[iocid] = VALUE("NULL", 0)$
807 $END$
808$END$
809
810$ OsIocDataProperties
811$FOREACH iocdataid IOCDATA.ID_LIST$
812$ // IOCDATA.PARENTをIOCDATA.IOCへコピー
813 $IOCDATA.IOC[iocdataid] = IOCDATA.PARENT[iocdataid]$
814
815$ // 省略されたパラメータにNULLをå…
816¥ã‚Œã‚‹
817 $IF !LENGTH(IOCDATA.INDEX[iocdataid])$
818 $IOCDATA.INDEX[iocdataid] = "NULL"$
819 $END$
820 $IF !LENGTH(IOCDATA.INITVAL[iocdataid])$
821 $IOCDATA.INITVAL[iocdataid] = "NULL"$
822 $END$
823$END$
824
825$ OsIocSenderProperties
826$FOREACH iocsndid IOCSND.ID_LIST$
827$ // IOCSND.PARENTをIOCSND.IOCへコピー
828 $IOCSND.IOC[iocsndid] = IOCSND.PARENT[iocsndid]$
829
830$ // 省略されたパラメータにNULLをå…
831¥ã‚Œã‚‹
832 $IF !LENGTH(IOCSND.SENDERID[iocsndid])$
833 $IOCSND.SENDERID[iocsndid] = "NULL"$
834 $END$
835 $IF !LENGTH(IOCSND.IMPLKIND[iocsndid])$
836 $IOCSND.IMPLKIND[iocsndid] = "NULL"$
837 $END$
838$END$
839
840$ OsIocReceiverProperties
841$FOREACH iocrcvid IOCRCV.ID_LIST$
842$ // IOCRCV.PARENTをIOCRCV.IOCへコピー
843 $IOCRCV.IOC[iocrcvid] = IOCRCV.PARENT[iocrcvid]$
844
845$ // 省略されたパラメータにNULLをå…
846¥ã‚Œã‚‹
847 $IF !LENGTH(IOCRCV.IMPLKIND[iocrcvid])$
848 $IOCRCV.IMPLKIND[iocrcvid] = "NULL"$
849 $END$
850$END$
851
852$INCLUDE "kernel/kernel_common.tf"$
853
854$ =====================================================================
855$ OSのエラーチェック
856$ =====================================================================
857
858$IF !EQ(OS.STATUS[1], "EXTENDED")$
859 $ERROR OS.TEXT_LINE[1]$$FORMAT(_("OsStatus must be EXTENDED"))$$END$
860$END$
861
862$IF LENGTH(OS.SC[1]) && !EQ(OS.SC[1], "SC3")$
863 $ERROR OS.TEXT_LINE[1]$$FORMAT(_("OsScalabilityClass must be SC3"))$$END$
864$END$
865
866$ =====================================================================
867$ OSAPのエラーチェックと内
868部データの生成
869$ =====================================================================
870
871$i = 0$
872$ntosap = 0$
873$FOREACH osapid OSAP.ID_LIST$
874 $OSAP.ID[osapid] = i$
875 $i = i + 1$
876 $IF OSAP.TRUSTED[osapid]$
877 $OSAP.BTMP[osapid] = 0$
878 $OSAP.ACPTN[osapid] = VALUE("TACP_KERNEL", TACP_KERNEL)$
879 $ELSE$
880 $OSAP.BTMP[osapid] = 1 << ntosap$
881 $OSAP.ACPTN[osapid] = 1 << ntosap$
882 $ntosap = ntosap + 1$
883 $END$
884$END$
885
886$ 非信頼OSAP数はTMAX_NTOSAPP以下か?
887$IF ntosap > TMAX_NTOSAPP$
888 $ERROR$$FORMAT(_("Too many Non-Trusted OsApplication %1% > %2%)"), ntosap, TMAX_NTOSAPP)$$END$
889$END$
890
891
892$ =====================================================================
893$ タスクの関連づけ
894$ =====================================================================
895
896$FOREACH tskid TSK.ID_LIST$
897$ // TSKとRESの関連づけ
898 $FOREACH resid TSK.RES_LIST[tskid]$
899 $RES.TSK_LIST[resid] = APPEND(RES.TSK_LIST[resid], tskid)$
900 $END$
901$ // TSKとEVTの関連づけ
902 $FOREACH evtid TSK.EVT_LIST[tskid]$
903 $EVT.TSK_LIST[evtid] = APPEND(EVT.TSK_LIST[evtid], tskid)$
904 $END$
905$END$
906
907
908$ =====================================================================
909$ ISR関連のエラーチェックと内
910部データの生成
911$ =====================================================================
912
913$TRACE("ISR CHECK")$
914
915$FOREACH isrid ISR.ID_LIST$
916$ // INTNOが他のISRと重複している場合
917 $FOREACH isrid2 ISR.ID_LIST$
918 $IF ISR.INTNO[isrid] == ISR.INTNO[isrid2] && isrid2 < isrid$
919 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsIsrInterruptNumber(%1%) of OsIsr(%2%) is duplicated"), ISR.INTNO[isrid], isrid)$$END$
920 $END$
921 $END$
922
923$ // intpriが割込み優å…
924ˆåº¦ã¨ã—て正しくない場合
925 $IF (ISR.INTPRI[isrid] > TNUM_INTPRI) || (ISR.INTPRI[isrid] < 1)$
926 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("illegal OsIsrInterruptPriority(%1%) of OsIsr(%2%)"), ISR.INTPRI[isrid], isrid)$$END$
927 $END$
928
929 $IF !(EQ(ISR.CATEGORY[isrid], "CATEGORY_1") || EQ(ISR.CATEGORY[isrid], "CATEGORY_2"))$
930 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsIsrCategory of OsIsr(%1%) must be CATEGORY_1 or CATEGORY_2"), isrid)$$END$
931 $END$
932
933$ // ISRとRESの関連づけ
934 $FOREACH resid ISR.RES_LIST[isrid]$
935 $RES.ISR_LIST[resid] = APPEND(RES.ISR_LIST[resid], isrid)$
936 $END$
937
938 $IF LENGTH(ISR.OSAPID[isrid])$
939$ // ISRを 定義した OSアプリケーションは信頼OSアプリケーションか?
940$ // 機能レベル2ではISRは非信頼に所属できない
941 $IF !OSAP.TRUSTED[ISR.OSAPID[isrid]] && EQ(ISR.CATEGORY[isrid], "CATEGORY_1")$
942 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsAppIsrRef(%1%) of OsApplication(%2%) can't be assign to Non-Trusted OS-Application"),
943 isrid, ISR.OSAPID[isrid])$$END$
944 $END$
945
946$ // ISRへのアクセス権の設定
947 $ISR.ACSBTMP[isrid] = OSAP.BTMP[ISR.OSAPID[isrid]]$
948 $FOREACH osapid ISR.ACS_OSAP_LIST[isrid]$
949 $ISR.ACSBTMP[isrid] = ISR.ACSBTMP[isrid] | OSAP.BTMP[osapid]$
950 $END$
951 $ELSE$
952 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsIsr(%1%) does not belong OsApplication"), isrid)$$END$
953 $DIE()$
954 $END$
955$END$
956
957
958$ C2ISRの最低優å…
959ˆåº¦
960$MAX_PRI_ISR2 = -1$
961$ C2ISRの最高優å…
962ˆåº¦
963$MIN_PRI_ISR2 = MAX_PRI_ISR2$
964
965$i = 0$
966$FOREACH isrid ISR.ID_LIST$
967 $IF EQ(ISR.CATEGORY[isrid], "CATEGORY_2")$
968 $ISR.ID[isrid] = i$
969 $i = i + 1$
970 $ISR2.ID_LIST = APPEND(ISR2.ID_LIST, isrid)$
971 $IF MIN_PRI_ISR2 > -ISR.INTPRI[isrid]$
972 $MIN_PRI_ISR2 = -ISR.INTPRI[isrid]$
973 $END$
974 $ISR.INT_ENTRY[isrid] = CONCAT("_kernel_inthdr_", +ISR.INTNO[isrid])$
975
976$ // INTNOが割込み番号として正しくない場合
977 $IF !LENGTH(FIND(INTNO_CREISR2_VALID, ISR.INTNO[isrid]))$
978 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("illegal OsIsrInterruptNumber(%1%) of OsIsr(%2%)"), ISR.INTNO[isrid], isrid)$$END$
979 $END$
980 $END$
981$END$
982
983$ C2ISRが定義されていない場合
984$IF !LENGTH(ISR2.ID_LIST)$
985 $MAX_PRI_ISR2 = 0$
986 $MIN_PRI_ISR2 = 0$
987$END$
988
989
990$ C1ISRの最低優å…
991ˆåº¦
992$MAX_PRI_ISR1 = MIN_PRI_ISR2 - 1$
993$ C1ISRの最高優å…
994ˆåº¦
995$MIN_PRI_ISR1 = -TNUM_INTPRI$
996
997$FOREACH isrid ISR.ID_LIST$
998 $IF EQ(ISR.CATEGORY[isrid], "CATEGORY_1")$
999 $ISR1.ID_LIST = APPEND(ISR1.ID_LIST, isrid)$
1000 $ISR.ID[isrid] = i$
1001 $i = i + 1$
1002
1003$ // C1ISRの割込み優å…
1004ˆåº¦ãŒMIN_PRI_ISR2以上である場合
1005 $IF -ISR.INTPRI[isrid] >= MIN_PRI_ISR2$
1006 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsIsrInterruptPriority(%1%) of OsIsr(%2%) is lower than or equal to C2ISR min priority(%3%)"), ISR.INTPRI[isrid], isrid, -MIN_PRI_ISR2)$$END$
1007 $END$
1008 $ISR.INT_ENTRY[isrid] = CONCAT("C1ISRMain", isrid)$
1009
1010$ // INTNOが割込み番号として正しくない場合
1011 $IF !LENGTH(FIND(INTNO_VALID, ISR.INTNO[isrid]))$
1012 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("illegal OsIsrInterruptNumber(%1%) of OsIsr(%2%)"), ISR.INTNO[isrid], isrid)$$END$
1013 $END$
1014 $END$
1015$END$
1016
1017
1018$ ISR.ID_LISTをC2ISR, C1ISRの順序にする
1019$ISR.ID_LIST = APPEND(ISR2.ID_LIST, ISR1.ID_LIST)$
1020
1021
1022$FOREACH isrid ISR1.ID_LIST$
1023$ // C1ISRはリソースを取得できない
1024 $IF LENGTH(ISR.RES_LIST[isrid])$
1025 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("C1ISR(%1%) can't use RESOURCE"), isrid)$$END$
1026 $END$
1027$END$
1028
1029
1030$FOREACH isrid ISR2.ID_LIST$
1031$ // ISRは内
1032部リソースを取得できない
1033$ // リンクリソースは標準リソースにリンクするものであるためリンクリソースであればエラーとする.
1034
1035 $FOREACH resid ISR.RES_LIST[isrid]$
1036 $IF EQ(RES.RESATR[resid], "INTERNAL") || EQ(RES.RESATR[resid], "LINKED")$
1037 $ERROR ISR.TEXT_LINE[isrid]$$FORMAT(_("OsIsrResourceRef(%1%) of OsIsr(%2%) must be standard resource"), resid, isrid)$$END$
1038 $END$
1039 $END$
1040$END$
1041
1042
1043$ =====================================================================
1044$ リソース関連のエラーチェックと内
1045部データの生成
1046$ =====================================================================
1047
1048$TRACE("RESOURCE CHECK")$
1049
1050$FOREACH resid RES.ID_LIST$
1051$ // 関連付けフラグの初期化(リソースがどのタスク/C2ISRにも関連付けされていない場合,warning出力し,オブジェクトを生成しない)
1052 $RES.RELATION_FLAG[resid] = (LENGTH(RES.TSK_LIST[resid]) || LENGTH(RES.ISR_LIST[resid]))$
1053$END$
1054
1055
1056$FOREACH resid RES.ID_LIST$
1057 $resatr = RES.RESATR[resid]$
1058$ // resatrの内
1059容チェック("STANDARD","INTERNAL","LINKED"以外ならエラー)
1060 $IF !(EQ(resatr, "STANDARD") || EQ(resatr, "INTERNAL") || EQ(resatr, "LINKED"))$
1061 $ERROR RES.TEXT_LINE[resid]$$FORMAT(_("OsResourceProperty of OsResource(%1%) must be STANDARD or INTERNAL or LINKED"), resid)$$END$
1062 $END$
1063
1064 $IF EQ(RES.RESATR[resid], "LINKED")$
1065 $lnkresid = RES.LINKEDRESID[resid]$
1066
1067 $IF !LENGTH(lnkresid)$
1068 $ERROR RES.TEXT_LINE[resid]$$FORMAT(_("OsResourceLinkedResourceRef of OsResource(%1%) is not defined"), resid)$$END$
1069 $DIE()$
1070 $END$
1071
1072 $RES.RELATION_FLAG[resid] = RES.RELATION_FLAG[lnkresid]$
1073
1074$ // 被リンク側の属性が標準リソースか.
1075 $IF !EQ(RES.RESATR[lnkresid], "STANDARD")$
1076 $ERROR RES.TEXT_LINE[resid]$$FORMAT(_("OsResourceLinkedResourceRef(%1%) of OsResource(%2%) must be standard resource"), lnkresid, resid)$$END$
1077 $END$
1078
1079$ // LINKEDRESOURCE以外のパラメータ(ACS_OSAP_LIST)指定しているか.
1080 $IF LENGTH(RES.ACS_OSAP_LIST[resid])$
1081 $ERROR RES.TEXT_LINE[resid]$$FORMAT(_("OsResourceAccessingApplication of LINKED OsResource(%1%) must not define"), resid)$$END$
1082 $END$
1083 $END$
1084
1085 $IF !RES.RELATION_FLAG[resid]$
1086 $WARNING RES.TEXT_LINE[resid]$$FORMAT(_("OsResource(%1%) is not related to any TASK or ISR"), resid)$$END$
1087 $END$
1088
1089$ // リソースへのアクセス権の設定
1090 $RES.ACSBTMP[resid] = 0$
1091 $FOREACH osapid RES.ACS_OSAP_LIST[resid]$
1092 $RES.ACSBTMP[resid] = RES.ACSBTMP[resid] | OSAP.BTMP[osapid]$
1093 $END$
1094$END$
1095
1096
1097$
1098$ リソースのOS内
1099部で用いるIDを割り当てる
1100$ 内
1101部リソース以外(標準,リンク)からIDを割り当てる
1102$
1103$i = 0$
1104$tnum_intres = 0$
1105$new_id_list = {}$
1106$FOREACH resid RES.ID_LIST$
1107 $IF !EQ(RES.RESATR[resid], "INTERNAL") && RES.RELATION_FLAG[resid]$
1108 $RES.ID[resid] = i$
1109 $i = i + 1$
1110 $new_id_list = APPEND(new_id_list, resid)$
1111 $END$
1112$END$
1113$STDRES.ID_LIST = new_id_list$
1114$FOREACH resid RES.ID_LIST$
1115 $IF EQ(RES.RESATR[resid], "INTERNAL") && RES.RELATION_FLAG[resid]$
1116 $RES.ID[resid] = i$
1117 $i = i + 1$
1118 $tnum_intres = tnum_intres + 1$
1119 $new_id_list = APPEND(new_id_list, resid)$
1120 $END$
1121$END$
1122$RES.ID_LIST = new_id_list$
1123
1124
1125$FOREACH resid RES.ID_LIST$
1126 $IF !EQ(RES.RESATR[resid], "LINKED")$
1127
1128$ // リソースの上限優å…
1129ˆåº¦ã®è¨ˆç®—(タスク)
1130 $ceilpri = 0$
1131 $FOREACH tskid RES.TSK_LIST[resid]$
1132 $tskpri = TSK.PRIORITY[tskid]$
1133 $IF ceilpri < tskpri$
1134 $ceilpri = tskpri$
1135 $END$
1136 $END$
1137 $RES.CEILPRI[resid] = ceilpri$
1138
1139$ // リソースの上限優å…
1140ˆåº¦ã®è¨ˆç®—(ISR)
1141$ // ISRの優å…
1142ˆåº¦ã¯-1〜としている
1143 $ceilpri = 0$
1144 $FOREACH isrid RES.ISR_LIST[resid]$
1145 $intpri = -ISR.INTPRI[isrid]$
1146 $IF ceilpri > intpri$
1147 $ceilpri = intpri$
1148 $END$
1149 $END$
1150
1151$ // ISRを用いるリソースの場合のみ更新
1152 $IF ceilpri < 0$
1153 $RES.CEILPRI[resid] = ceilpri$
1154 $END$
1155 $END$
1156$END$
1157
1158
1159$FOREACH resid RES.ID_LIST$
1160$ // リンクリソースの上限優å…
1161ˆåº¦ã¨ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã®è¨­å®š
1162 $IF EQ(RES.RESATR[resid], "LINKED")$
1163 $RES.CEILPRI[resid] = RES.CEILPRI[RES.LINKEDRESID[resid]]$
1164 $RES.ACSBTMP[resid] = RES.ACSBTMP[RES.LINKEDRESID[resid]]$
1165 $END$
1166$END$
1167
1168
1169
1170$ =====================================================================
1171$ アプリケーションモードのエラーチェック
1172$ =====================================================================
1173
1174$ APP
1175$ アプリケーションモードは32個以下か.
1176$IF LENGTH(APP.ID_LIST) > 32$
1177 $ERROR$$FORMAT(_("too many OsAppMode %1% > 32"), LENGTH(APP.ID_LIST))$$END$
1178$END$
1179
1180$i = 0$
1181$FOREACH appid APP.ID_LIST$
1182 $APP.ID[appid] = i$
1183 $i = i + 1$
1184$END$
1185
1186
1187$ =====================================================================
1188$ タスク関連のエラーチェックと内
1189部データの生成
1190$ =====================================================================
1191
1192$TRACE("TASK CHECK")$
1193
1194$FOREACH tskid TSK.ID_LIST$
1195 $TSK.EXTENDED[tskid] = LENGTH(TSK.EVT_LIST[tskid]) > 0$
1196
1197$ // 内
1198部リソースを取得する場合,取得時の優å…
1199ˆåº¦ã‚’設定
1200 $FOREACH resid TSK.RES_LIST[tskid]$
1201 $IF EQ(RES.RESATR[resid], "INTERNAL")$
1202 $TSK.INRESPRI[tskid] = RES.CEILPRI[resid]$
1203
1204 $osapid = TSK.OSAPID[tskid]$
1205 $IF !OSAP.TRUSTED[osapid]$
1206 $IF !(RES.ACSBTMP[resid] & OSAP.BTMP[osapid])$
1207 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskResourceRef of OsTask(%1%) can't access INTERNAL OsResource(%2%)"), tskid, resid)$$END$
1208 $END$
1209 $END$
1210 $END$
1211 $END$
1212
1213$ // タスクのAUTOSTARTの起動パターン
1214 $astptn = 0$
1215 $FOREACH appid TSK.APP_LIST[tskid]$
1216 $astptn = astptn | (1 << APP.ID[appid])$
1217 $END$
1218 $TSK.ASTPTN[tskid] = astptn$
1219
1220$ // タスクに関連付けされたイベントマスクのORをとる(AUTOは0で計算)
1221 $TSK.EVTMSK[tskid] = 0$
1222
1223 $FOREACH evtid TSK.EVT_LIST[tskid]$
1224 $TSK.EVTMSK[tskid] = TSK.EVTMSK[tskid] | EVT.MASK[evtid]$
1225 $END$
1226
1227
1228 $tskpri = TSK.PRIORITY[tskid]$
1229 $tskext = TSK.EXTENDED[tskid]$
1230 $tskact = TSK.ACTIVATION[tskid]$
1231 $tsksch = TSK.SCHEDULE[tskid]$
1232
1233$ // priorityの範囲チェック
1234 $IF (tskpri < TMIN_TPRI) || (TMAX_TPRI < tskpri)$
1235 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskPriority(%1%) of OsTask(%2%) is a range error"), tskpri, tskid)$$END$
1236 $END$
1237
1238$ // activationの範囲チェック
1239 $IF !tskext$
1240 $IF (tskact == 0) || (256 < tskact)$
1241 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskActivation(%1%) of OsTask(%2%) is a range error"), tskact, tskid)$$END$
1242 $END$
1243 $ELSE$
1244 $IF (tskact != 1)$
1245 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskActivation(%1%) of OsTask(%2%) must be 1"), tskact, tskid)$$END$
1246 $END$
1247 $END$
1248
1249$ // scheduleの内
1250容チェック("NON","FULL"以外ならエラー)
1251 $IF !(EQ(tsksch, "NON") || EQ(tsksch, "FULL"))$
1252 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskSchedule of OsTask(%1%) must be NON or FULL"), tskid)$$END$
1253 $END$
1254
1255 $intres_flag = 0$
1256
1257 $FOREACH resid TSK.RES_LIST[tskid]$
1258 $IF EQ(RES.RESATR[resid], "INTERNAL")$
1259
1260$ // タスクには最大1つの内
1261部リソースしか割り当てられないため,
1262$ // 内
1263部リソースを2つ以上割り当てた場合はエラーとする.
1264
1265$ // 割り当てたリソースが内
1266部リソースなら確認用フラグをセットする.
1267$ // 内
1268部リソース確認用フラグがすでにセットされていたらエラーとする.
1269 $IF intres_flag == 0$
1270 $intres_flag = 1$
1271 $ELSE$
1272 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("too many assigned internal resource OsTaskResourceRef(%1%) of OsTask(%2%)"), resid, tskid)$$END$
1273 $END$
1274
1275$ // 内
1276部リソースがノンプリエンプティブのタスクと関連付けられていたらエラーとする.
1277 $IF EQ(TSK.SCHEDULE[tskid], "NON")$
1278 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("internal resource OsTaskResourceRef(%1%) of OsTask(%2%) can't be assign to a nonpreemptable task"), resid, tskid)$$END$
1279 $END$
1280 $END$
1281
1282$ // リンクリソースは標準リソースにリンクするものであるため
1283$ // リンクリソースであればエラーとする.
1284 $IF EQ(RES.RESATR[resid], "LINKED")$
1285 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskResourceRef(%1%) of OsTask(%2%) is linked resource"), resid, tskid)$$END$
1286 $END$
1287 $END$
1288
1289$ // タスクへのアクセス権の設定
1290 $TSK.ACSBTMP[tskid] = OSAP.BTMP[TSK.OSAPID[tskid]]$
1291 $FOREACH osapid TSK.ACS_OSAP_LIST[tskid]$
1292 $TSK.ACSBTMP[tskid] = TSK.ACSBTMP[tskid] | OSAP.BTMP[osapid]$
1293 $END$
1294$END$
1295
1296
1297$
1298$ タスクのOS内
1299部で用いるIDを割り当てる
1300$ 拡張タスクからIDを割り当てる
1301$
1302$i = 0$
1303$tnum_exttask = 0$
1304$new_id_list = {}$
1305$FOREACH tskid TSK.ID_LIST$
1306 $IF TSK.EXTENDED[tskid]$
1307 $TSK.ID[tskid] = i$
1308 $i = i + 1$
1309 $tnum_exttask = tnum_exttask + 1$
1310 $new_id_list = APPEND(new_id_list, tskid)$
1311 $END$
1312$END$
1313$FOREACH tskid TSK.ID_LIST$
1314 $IF !TSK.EXTENDED[tskid]$
1315 $TSK.ID[tskid] = i$
1316 $i = i + 1$
1317 $new_id_list = APPEND(new_id_list, tskid)$
1318 $END$
1319$END$
1320$TSK.ID_LIST = new_id_list$
1321
1322
1323
1324$ =====================================================================
1325$ イベントマスク値決定
1326$ =====================================================================
1327
1328$TRACE("EVENT CHECK")$
1329
1330$auto_evt_msk = 1$
1331$auto_evt_num = 0$
1332$FOREACH evtid EVT.ID_LIST$
1333$ //マスク値指定有
1334 $IF !EQ(EVT.MASK[evtid], AUTO)$
1335 $IF (EVT.MASK[evtid] == 0)$
1336 $ERROR EVT.TEXT_LINE[evtid]$$FORMAT(_("OsEventMask of OsEvent(%1%) must not be zero"), evtid)$$END$
1337 $DIE()$
1338 $END$
1339 $EVT.CALC_MASK[evtid] = EVT.MASK[evtid]$
1340$ //マスク値指定無
1341 $ELSE$
1342 $EVT.CALC_MASK[evtid] = 0$
1343$ //タスクに関連付け有
1344 $IF LENGTH(EVT.TSK_LIST[evtid])$
1345 $hit_flg = 0$
1346 $auto_tskevt_msk = 1$
1347 $FOREACH i RANGE(1, 32)$
1348 $IF !hit_flg$
1349 $ok_flg = 1$
1350 $FOREACH tskid EVT.TSK_LIST[evtid]$
1351 $IF (TSK.EVTMSK[tskid] & auto_tskevt_msk) != 0$
1352 $ok_flg = 0$
1353 $END$
1354 $END$
1355
1356$ //å…
1357¨ã‚¿ã‚¹ã‚¯ã§ç©ºããƒ“ット発見
1358 $IF ok_flg$
1359 $hit_flg = 1$
1360 $FOREACH tskid EVT.TSK_LIST[evtid]$
1361 $TSK.EVTMSK[tskid] = TSK.EVTMSK[tskid] | auto_tskevt_msk$
1362 $END$
1363 $EVT.CALC_MASK[evtid] = auto_tskevt_msk$
1364 $ELSE$
1365 $auto_tskevt_msk = auto_tskevt_msk << 1$
1366 $END$
1367 $END$
1368 $END$
1369$ //空きビットなし
1370 $IF !hit_flg$
1371 $ERROR EVT.TEXT_LINE[evtid]$$FORMAT(_("Auto OsEventMask of OsEvent(%1%) is no free"), evtid)$$END$
1372 $DIE()$
1373 $END$
1374$ //タスクに関連付け無
1375 $ELSE$
1376 $IF auto_evt_num > 31$
1377 $ERROR EVT.TEXT_LINE[evtid]$$FORMAT(_("Auto OsEventMask of OsEvent(%1%) is over(32)"))$$END$
1378 $DIE()$
1379 $END$
1380 $EVT.CALC_MASK[evtid] = auto_evt_msk$
1381 $auto_evt_msk = auto_evt_msk << 1$
1382 $auto_evt_num = auto_evt_num + 1$
1383 $END$
1384 $END$
1385$END$
1386$NL$
1387
1388
1389
1390$ =====================================================================
1391$ カウンタ関連のエラーチェックと内
1392部データの生成
1393$ =====================================================================
1394
1395$TRACE("COUNTER CHECK")$
1396
1397
1398$FOREACH cntid CNT.ID_LIST$
1399$ // カウンタの属性はSOFTWARE / HARDWAREかチェック
1400 $IF !(EQ(CNT.CNTATR[cntid], "SOFTWARE") || EQ(CNT.CNTATR[cntid], "HARDWARE"))$
1401 $ERROR CNT.TEXT_LINE[cntid]$$FORMAT(_("OsCounterType of OsCounter(%1%) must be SOFTWARE or HARDWARE"), cntid)$$END$
1402 $END$
1403$END$
1404
1405
1406$
1407$ カウンタのOS内
1408部で用いるIDを割り当てる
1409$ ハードウェアカウンタからIDを割り当てる
1410$
1411$i = 0$
1412$new_id_list = {}$
1413$FOREACH cntid CNT.ID_LIST$
1414 $IF EQ(CNT.CNTATR[cntid], "HARDWARE")$
1415 $CNT.ID[cntid] = i$
1416 $i = i + 1$
1417 $new_id_list = APPEND(new_id_list, cntid)$
1418 $END$
1419$END$
1420$FOREACH cntid CNT.ID_LIST$
1421 $IF EQ(CNT.CNTATR[cntid], "SOFTWARE")$
1422 $CNT.ID[cntid] = i$
1423 $i = i + 1$
1424 $new_id_list = APPEND(new_id_list, cntid)$
1425 $END$
1426$END$
1427$CNT.ID_LIST = new_id_list$
1428
1429
1430$HWCNT.ID_LIST = {}$
1431$FOREACH cntid CNT.ID_LIST$
1432 $cnttpb = CNT.TICKSPERBASE[cntid]$
1433 $cntmin = CNT.MINCYCLE[cntid]$
1434 $cntmax = CNT.MAXALLOWED[cntid]$
1435
1436$ // ticksperbaseの範囲確認
1437 $IF (cnttpb < 1) || (cnttpb > 0x7fffffff)$
1438 $ERROR CNT.TEXT_LINE[cntid]$$FORMAT(_("OsCounterTicksPerBase(%1%) of OsCounter(%2%) is a range error"), cnttpb, cntid)$$END$
1439 $END$
1440
1441$ // mincycleの範囲確認
1442 $IF (cntmin < 1) || (cntmin > 0x7fffffff)$
1443 $ERROR CNT.TEXT_LINE[cntid]$$FORMAT(_("OsCounterMinCycle(%1%) of OsCounter(%2%) is a range error"), cntmin, cntid)$$END$
1444 $END$
1445
1446$ // maxallowedvalueの範囲確認
1447 $IF (cntmax < 1) || (cntmax > 0x7fffffff)$
1448 $ERROR CNT.TEXT_LINE[cntid]$$FORMAT(_("OsCounterMaxAllowedValue(%1%) of OsCounter(%2%) is a range error"), cntmax, cntid)$$END$
1449 $END$
1450
1451$ // mincycleがmaxallowedvalueより大きいか.
1452 $IF cntmax < cntmin$
1453 $ERROR CNT.TEXT_LINE[cntid]$$FORMAT(_("OsCounterMinCycle(%1%) of OsCounter(%2%) is more than OsCounterMaxAllowedValue(%3%)"), cntmin, cntid, cntmax)$$END$
1454 $END$
1455
1456$ // カウンタへのアクセス権の設定
1457 $IF LENGTH(CNT.OSAPID[cntid])$
1458 $CNT.ACSBTMP[cntid] = OSAP.BTMP[CNT.OSAPID[cntid]]$
1459 $FOREACH osapid CNT.ACS_OSAP_LIST[cntid]$
1460 $CNT.ACSBTMP[cntid] = CNT.ACSBTMP[cntid] | OSAP.BTMP[osapid]$
1461 $END$
1462 $ELSE$
1463 $ERROR CNT.TEXT_LINE[cntid]$$FORMAT(_("OsCounter(%1%) does not belong OsApplication"), cntid)$$END$
1464 $DIE()$
1465 $END$
1466
1467$ // ハードウェアカウンタのISRがCATEGORY_2かチェック
1468 $IF EQ(CNT.CNTATR[cntid], "HARDWARE")$
1469 $IF EQ(ISR.CATEGORY[CNT.ISRID[cntid]], "CATEGORY_2")$
1470 $HWCNT.ID_LIST = APPEND(HWCNT.ID_LIST, cntid)$
1471 $ELSE$
1472 $ERROR CNT.TEXT_LINE[cntid]$$FORMAT(_("OsCounterIsrRef(%1%) of OsCounter(%2%) is C1ISR"), CNT.ISRID[cntid], cntid)$$END$
1473 $END$
1474
1475 $IF ISR.OSAPID[CNT.ISRID[cntid]] != CNT.OSAPID[cntid]$
1476 $ERROR CNT.TEXT_LINE[cntid]$$FORMAT(_("HARDWARE OsCounter(%1%) and OsCounterIsrRef(%2%) must belong to the same OsApplication"), cntid, isrid)$$END$
1477 $END$
1478 $END$
1479$END$
1480
1481
1482
1483$ =====================================================================
1484$ アラーム関連のエラーチェックと内
1485部データの生成
1486$ =====================================================================
1487
1488$TRACE("ALARM CHECK")$
1489
1490$i = 0$
1491$FOREACH almid ALM.ID_LIST$
1492
1493$ // アラームのAUTOSTARTの起動パターン
1494 $astptn = 0$
1495 $FOREACH appid ALM.APP_LIST[almid]$
1496 $astptn = astptn | (1 << APP.ID[appid])$
1497 $END$
1498 $ALM.ASTPTN[almid] = astptn$
1499
1500$ // IDの設定
1501 $ALM.ID[almid] = i$
1502 $i = i + 1$
1503
1504$ // アプリケーションモード設定した場合のみ,アラーム初回起動ティック値と周期の適切性をチェック
1505 $IF ALM.ASTPTN[almid]$
1506$ // アラーム初回起動ティック値は,カウンタ最大値を超
1507えるか或いは0より小さいか
1508 $IF CNT.MAXALLOWED[ALM.CNTID[almid]] < ALM.ALARMTIME[almid] || ALM.ALARMTIME[almid] < 0$
1509 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmAlarmTime(%1%) of OsAlarm(%2%) must be in the range 0 .. OsCounterMaxAllowedValue(%3%)"),
1510 ALM.ALARMTIME[almid], almid, CNT.MAXALLOWED[ALM.CNTID[almid]])$$END$
1511 $END$
1512
1513$ // アラーム周期は,カウンタ最大値を超
1514えるか,0より小さいか,カウンタの最小周期より小さい(0を除く)か
1515 $IF CNT.MAXALLOWED[ALM.CNTID[almid]] < ALM.CYCLETIME[almid] || ALM.CYCLETIME[almid] < 0 ||
1516 (ALM.CYCLETIME[almid] < CNT.MINCYCLE[ALM.CNTID[almid]] && ALM.CYCLETIME[almid] != 0)$
1517 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmCycleTime(%1%) of OsAlarm(%2%) must be zero OR in the range OsCounterMinCycle(%3%) .. OsCounterMaxAllowedValue(%4%)"),
1518 ALM.CYCLETIME[almid], almid, CNT.MINCYCLE[ALM.CNTID[almid]], CNT.MAXALLOWED[ALM.CNTID[almid]])$$END$
1519 $END$
1520
1521$ // autostarttypeにABSOLUTE/RELATIVE以外のものが登録されていないか
1522 $IF !(EQ(ALM.AUTOSTARTTYPE[almid], "ABSOLUTE") || EQ(ALM.AUTOSTARTTYPE[almid], "RELATIVE"))$
1523 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmAutostartType of OsAlarm(%1%) must be ABSOLUTE or RELATIVE"), almid)$$END$
1524 $END$
1525
1526$ // autostarttypeがRELATIVEの場合はSTARTTICK==0は禁止
1527 $IF EQ(ALM.AUTOSTARTTYPE[almid], "RELATIVE") && ALM.ALARMTIME[almid] == 0$
1528 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmAlarmTime of RELATIVE OsAlarm(%1%) must not be zero"), almid)$$END$
1529 $END$
1530 $END$
1531
1532$ // アラームへのアクセス権の設定
1533 $IF LENGTH(ALM.OSAPID[almid])$
1534 $ALM.ACSBTMP[almid] = OSAP.BTMP[ALM.OSAPID[almid]]$
1535 $FOREACH osapid ALM.ACS_OSAP_LIST[almid]$
1536 $ALM.ACSBTMP[almid] = ALM.ACSBTMP[almid] | OSAP.BTMP[osapid]$
1537 $END$
1538 $ELSE$
1539 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarm(%1%) does not belong OsApplication"), almid)$$END$
1540 $DIE()$
1541 $END$
1542
1543 $osapid = ALM.OSAPID[almid]$
1544
1545 $IF EQ(ALM.ALMATR[almid], "ACTIVATETASK") || EQ(ALM.ALMATR[almid], "SETEVENT")$
1546 $IF !OSAP.TRUSTED[osapid]$
1547 $IF !(TSK.ACSBTMP[ALM.TSKID[almid]] & OSAP.BTMP[osapid])$
1548 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmActivateTaskRef or OsAlarmSetEventTaskRef of OsAlarm(%1%) can't access OsTask(%2%)"),
1549 almid, ALM.TSKID[almid])$$END$
1550 $END$
1551 $END$
1552 $END$
1553
1554$ // taskが拡張タスクか(SETEVENTの場合)
1555 $IF EQ(ALM.ALMATR[almid], "SETEVENT")$
1556 $IF !TSK.EXTENDED[ALM.TSKID[almid]]$
1557 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmSetEventTaskRef(%1%) of OsAlarm(%2%) is not extended task"), ALM.TSKID[almid], almid)$$END$
1558 $END$
1559 $END$
1560
1561 $IF EQ(ALM.ALMATR[almid], "INCREMENTCOUNTER")$
1562 $IF !OSAP.TRUSTED[osapid]$
1563 $IF !(CNT.ACSBTMP[ALM.INCID[almid]] & OSAP.BTMP[osapid])$
1564 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmIncrementCounterRef of OsAlarm(%1%) can't access OsCounter(%2%)"),
1565 almid, ALM.INCID[almid])$$END$
1566 $END$
1567 $END$
1568
1569$ // アラームからハードウェアカウンタをインクリメントしているかチェック
1570 $IF EQ(CNT.CNTATR[ALM.INCID[almid]], "HARDWARE")$
1571 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmIncrementCounterRef(%1%) of OsAlarm(%2%) is hardware counter"), ALM.INCID[almid], almid)$$END$
1572 $END$
1573 $END$
1574$END$
1575
1576
1577$
1578$ IncrementCounterの循環チェックのための関数
1579$
1580
1581$ 行列の掛け算
1582$FUNCTION MATRIX_MUL$
1583 $FOREACH i RANGE(0, matrix_size - 1)$
1584 $FOREACH j RANGE(0, matrix_size - 1)$
1585 $result = {}$
1586 $FOREACH k RANGE(0, matrix_size - 1)$
1587 $IF LENGTH(result) == 0$
1588 $IF LENGTH(result_matrix[i * matrix_size + k]) && LENGTH(base_matrix[k * matrix_size + j])$
1589 $result = APPEND(result_matrix[i * matrix_size + k], base_matrix[k * matrix_size + j])$
1590 $END$
1591 $END$
1592 $END$
1593$ // 掛け算結果を一時行列に保持
1594 $tmp_matrix[i * matrix_size + j] = result$
1595 $END$
1596 $END$
1597$ // 掛け算結果を結果行列にセット
1598 $FOREACH i RANGE(0, matrix_size - 1)$
1599 $FOREACH j RANGE(0, matrix_size - 1)$
1600 $result_matrix[i * matrix_size + j] = tmp_matrix[i * matrix_size + j]$
1601 $END$
1602 $END$
1603$END$
1604
1605
1606$ 行列の0初期化
1607$ base_matrix 初期行列
1608$ result_matrix 掛け算の結果の行列
1609$FUNCTION INIT_MATRIX$
1610 $FOREACH almid ALM.ID_LIST$
1611 $IF EQ(ALM.ALMATR[almid], "INCREMENTCOUNTER")$
1612 $i = ALM.CNTID[almid] - 1$
1613 $j = ALM.INCID[almid] - 1$
1614 $IF !LENGTH(base_matrix[i * matrix_size + j])$
1615 $base_matrix[i * matrix_size + j] = {almid}$
1616 $result_matrix[i * matrix_size + j] = {almid}$
1617 $END$
1618 $END$
1619 $END$
1620$END$
1621
1622
1623$ アラームの循環リストを最小IDのアラームがå…
1624ˆé ­ã«ãªã‚‹ã‚ˆã†ã«ãƒ­ãƒ¼ãƒ†ãƒ¼ãƒˆã•ã›ã‚‹
1625$ また,循環リストに重複したアラームが含まれていたら重複したアラーム以降を
1626$ リストから取り除く
1627$FUNCTION ROTATE_LOOPED_ALARM$
1628$ // 関数内
1629でiを使うため退避
1630 $tmp_i = i$
1631 $alm_list = ARGV[1]$
1632 $size = LENGTH(alm_list)$
1633$ // リスト内
1634でのアラームIDの最小値
1635 $min_alm_id = AT(alm_list, 0)$
1636 $min_alm_id_index = 0$
1637 $FOREACH i RANGE(1, size - 1)$
1638 $IF min_alm_id > AT(alm_list, i)$
1639 $min_alm_id = AT(alm_list, i)$
1640 $min_alm_id_index = i$
1641 $END$
1642 $END$
1643 $RESULT = {}$
1644$ // 重複したアラームIDが存在するか
1645 $duplicate = 0$
1646 $FOREACH i RANGE(0, size - 1)$
1647 $append_alm = AT(alm_list, (min_alm_id_index + i) % size)$
1648 $IF LENGTH(FIND(RESULT, append_alm)) > 0$
1649$ // 重複したアラームがあればそれ以降は追加しない
1650 $duplicate = 1$
1651 $END$
1652 $IF duplicate == 0$
1653 $RESULT = APPEND(RESULT, append_alm)$
1654 $END$
1655 $END$
1656 $i = tmp_i$
1657$END$
1658
1659
1660$FUNCTION CHECK_COUNTER_LOOP$
1661 $matrix_size = LENGTH(CNT.ID_LIST)$
1662
1663 $INIT_MATRIX()$
1664
1665$ // 循環アラームリストのリスト
1666 $alm_loop_list_size = 0$
1667
1668$ // ループの検出とエラー出力
1669 $FOREACH n RANGE(0, matrix_size - 1)$
1670 $FOREACH i RANGE(0, matrix_size - 1)$
1671 $IF LENGTH(result_matrix[i * matrix_size + i]) > 0$
1672 $result_matrix[i * matrix_size + i] = ROTATE_LOOPED_ALARM(result_matrix[i * matrix_size + i])$
1673 $find = 0$
1674 $FOREACH ii RANGE(0, alm_loop_list_size - 1)$
1675$ // 過去に検出したリストに含まれるか調べる
1676 $IF EQ(alm_loop_list[ii], result_matrix[i * matrix_size + i])$
1677 $find = 1$
1678 $END$
1679 $END$
1680 $IF find == 0$
1681 $alm_loop_list[alm_loop_list_size] = result_matrix[i * matrix_size + i]$
1682 $alm_loop_list_size = alm_loop_list_size + 1$
1683 $ERROR ALM.TEXT_LINE[AT(result_matrix[i * matrix_size + i], 0)]$
1684 $FORMAT(_("OsAlarmIncrementCounterRef of OsAlarm(%1%) is a cyclic chain of alarm action"), result_matrix[i * matrix_size + i])$$END$
1685 $END$
1686 $END$
1687 $END$
1688 $MATRIX_MUL()$
1689 $END$
1690$END$
1691
1692
1693$ 直接/間接的にカウンタをインクリメントするか(INCREMENTCOUNTERの場合)
1694$ ユーザヘッダにOMIT_CHECK_CYCLIC_CHAINの定義があれば,アラーム循環チェックを行わない
1695$IF !OMIT_CHECK_CYCLIC_CHAIN$
1696 $CHECK_COUNTER_LOOP()$
1697$END$
1698
1699$ 他の非信頼OSAPに所属するカウンタを指定した場合
1700$FOREACH almid ALM.ID_LIST$
1701 $IF !EQ(ALM.OSAPID[almid], CNT.OSAPID[ALM.CNTID[almid]])$
1702 $IF !OSAP.TRUSTED[CNT.OSAPID[ALM.CNTID[almid]]]$
1703 $ERROR ALM.TEXT_LINE[almid]$$FORMAT(_("OsAlarmCounterRef(%1%) is on a other Non-Trusted OS-Application"), ALM.CNTID[almid])$$END$
1704 $END$
1705 $END$
1706$END$
1707
1708
1709$ =====================================================================
1710$ スケジュールテーブル関連のエラーチェックと内
1711部データの生成
1712$ =====================================================================
1713
1714$TRACE("SCHEDULETABLE CHECK")$
1715
1716$FOREACH schtblid SCHTBL.ID_LIST$
1717$ // スケジュールテーブルへのアクセス権の設定
1718 $IF LENGTH(SCHTBL.OSAPID[schtblid])$
1719 $SCHTBL.ACSBTMP[schtblid] = OSAP.BTMP[SCHTBL.OSAPID[schtblid]]$
1720 $FOREACH osapid SCHTBL.ACS_OSAP_LIST[schtblid]$
1721 $SCHTBL.ACSBTMP[schtblid] = SCHTBL.ACSBTMP[schtblid] | OSAP.BTMP[osapid]$
1722 $END$
1723 $ELSE$
1724 $ERROR SCHTBL.TEXT_LINE[schtblid]$$FORMAT(_("OsScheduleTable(%1%) does not belong OsApplication"), schtblid)$$END$
1725 $DIE()$
1726 $END$
1727$ // 同期方法設定値チェック
1728$ // syncstrategyにNONE/IMPLICITいずれか一つが指定されているか
1729 $IF !(EQ(SCHTBL.SYNCSTRATEGY[schtblid], "NONE") || EQ(SCHTBL.SYNCSTRATEGY[schtblid], "IMPLICIT"))$
1730 $ERROR SCHTBL.TEXT_LINE[schtblid]$
1731 $FORMAT(_("OsScheduleTblSyncStrategy of OsScheduleTable(%1%) must be NONE or IMPLICIT"), schtblid)$$END$
1732 $END$
1733$END$
1734
1735
1736$ 各スケジュールテーブルIDの定義(暗黙同期定義はå…
1737ˆï¼ŒéžåŒæœŸå®šç¾©ã¯å¾Œ)
1738$i = 0$
1739$ スケジュール初期化ブロック生成時に使用する順序付きリスト変数
1740$new_id_list = {}$
1741$FOREACH schtblid SCHTBL.ID_LIST$
1742 $IF EQ(SCHTBL.SYNCSTRATEGY[schtblid], "IMPLICIT")$
1743 $SCHTBL.ID[schtblid] = i$
1744 $i = i + 1$
1745 $new_id_list = APPEND(new_id_list, schtblid)$
1746 $END$
1747$END$
1748$FOREACH schtblid SCHTBL.ID_LIST$
1749 $IF EQ(SCHTBL.SYNCSTRATEGY[schtblid], "NONE")$
1750 $SCHTBL.ID[schtblid] = i$
1751 $i = i + 1$
1752 $new_id_list = APPEND(new_id_list, schtblid)$
1753 $END$
1754$END$
1755$NL$
1756$SCHTBL.ID_LIST = new_id_list$
1757
1758$exppt_index = 0$
1759$EXPPT.ID_LIST = {}$
1760$FOREACH expptactid EXPPTACT.ID_LIST$
1761$ // 満了アクションの属性と満了アクション処理内
1762容設定の整合性チェック
1763$ // taskが拡張タスクか(SETEVENTの場合)
1764 $IF EQ(EXPPTACT.EXPIREATR[expptactid], "SETEVENT")$
1765 $IF !TSK.EXTENDED[EXPPTACT.TSKID[expptactid]]$
1766 $ERROR EXPPTACT.TEXT_LINE[expptactid]$
1767 $FORMAT(_("OsScheduleTableSetEventTaskRef(%1%) of OsScheduleTableExpiryPoint(%2%) is not extended task"), EXPPTACT.TSKID[expptactid], expptactid)$$END$
1768 $END$
1769 $END$
1770
1771 $schtblid = EXPPTACT.SCHTBLID[expptactid]$
1772 $FOREACH expptid EXPPT.ID_LIST$
1773 $IF EXPPT.OFFSET[expptid] == EXPPTACT.OFFSET[expptactid] &&
1774 EXPPTACT.SCHTBLID[expptactid] == EXPPT.SCHTBLID[expptid]$
1775 $EXPPTACT.EXPPTID[expptactid] = expptid$
1776 $END$
1777 $END$
1778
1779$ // 満了点情
1780報の生成とスケジュールテーブルとの関連付け
1781 $IF !LENGTH(EXPPTACT.EXPPTID[expptactid])$
1782 $EXPPT.ID_LIST = APPEND(EXPPT.ID_LIST, exppt_index)$
1783 $EXPPT.SCHTBLID[exppt_index] = schtblid$
1784 $EXPPT.OFFSET[exppt_index] = EXPPTACT.OFFSET[expptactid]$
1785 $SCHTBL.EXPPTINDEX_LIST[schtblid] = APPEND(SCHTBL.EXPPTINDEX_LIST[schtblid], exppt_index)$
1786 $EXPPTACT.EXPPTID[expptactid] = exppt_index$
1787
1788$ 満了点のオフセットがスケジュールテーブルの周期を超
1789えたかチェック
1790 $IF EXPPT.OFFSET[exppt_index] > SCHTBL.DURATIONTICK[schtblid]$
1791 $ERROR EXPPTACT.TEXT_LINE[expptactid]$
1792 $FORMAT(_("OsScheduleTblExpPointOffset(%1%) of OsScheduleTableExpiryPoint(%2%) of OsScheduleTable(%3%) more than OsScheduleTableDuration(%4%)"),
1793 EXPPTACT.OFFSET[expptactid], expptactid, schtblid, SCHTBL.DURATIONTICK[schtblid])$$END$
1794 $END$
1795 $exppt_index = exppt_index + 1$
1796 $END$
1797
1798 $osapid = SCHTBL.OSAPID[schtblid]$
1799 $IF !OSAP.TRUSTED[osapid]$
1800 $IF !(TSK.ACSBTMP[EXPPTACT.TSKID[expptactid]] & OSAP.BTMP[osapid])$
1801 $ERROR SCHTBL.TEXT_LINE[schtblid]$$FORMAT(_("OsScheduleTableActivateTaskRef or OsScheduleTableSetEventTaskRef of OsScheduleTable(%1%) can't access OsTask(%2%)"),
1802 schtblid, EXPPTACT.TSKID[expptactid])$$END$
1803 $END$
1804 $END$
1805$END$
1806
1807
1808$ 暗黙スケジュールカウント用変数
1809$tnum_implscheduletable = 0$
1810
1811$FOREACH schtblid SCHTBL.ID_LIST$
1812$ // EXPPTINDEX_LISTをOFFSETの順にソートする
1813 $SCHTBL.EXPPTINDEX_LIST[schtblid] = SORT(SCHTBL.EXPPTINDEX_LIST[schtblid], "EXPPT.OFFSET")$
1814
1815 $astptn = 0$
1816 $FOREACH appid SCHTBL.APP_LIST[schtblid]$
1817 $astptn = astptn | (1 << APP.ID[appid])$
1818 $END$
1819 $SCHTBL.ASTPTN[schtblid] = astptn$
1820
1821$ // アプリケーションモード設定した場合のみ,初回起動ティック値をチェック
1822 $IF SCHTBL.ASTPTN[schtblid]$
1823
1824 $IF !(EQ(SCHTBL.AUTOSTARTTYPE[schtblid], "ABSOLUTE") || EQ(SCHTBL.AUTOSTARTTYPE[schtblid], "RELATIVE"))$
1825$ // autostarttypeにABSOLUTE/RELATIVE以外のものが登録されていないか
1826 $ERROR SCHTBL.TEXT_LINE[schtblid]$$FORMAT(_("OsScheduleTableAutostartType of OsScheduleTable(%1%) must be ABSOLUTE or RELATIVE"), schtblid)$$END$
1827 $ELIF EQ(SCHTBL.STARTTICK[schtblid], "NULL")$
1828$ // 初回起動ティック値が省略されたたか
1829 $ERROR SCHTBL.TEXT_LINE[schtblid]$$FORMAT(_("OsScheduleTableStartValue(%1%) of %2% AutoStart OsScheduleTable(%3%) must be designated"),
1830 SCHTBL.STARTTICK[schtblid], SCHTBL.AUTOSTARTTYPE[schtblid], schtblid)$$END$
1831 $DIE()$
1832 $END$
1833
1834$ // 初回起動ティック値は,カウンタ最大値を超
1835えるか或いは0より小さいか
1836 $IF CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]] < SCHTBL.STARTTICK[schtblid] || SCHTBL.STARTTICK[schtblid] < 0$
1837 $ERROR SCHTBL.TEXT_LINE[schtblid]$$FORMAT(_("OsScheduleTableStartValue(%1%) of OsScheduleTable(%2%) must be in the range 0 .. OsCounterMaxAllowedValue(%3%)"),
1838 SCHTBL.STARTTICK[schtblid], schtblid, CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]])$$END$
1839 $END$
1840
1841 $IF EQ(SCHTBL.AUTOSTARTTYPE[schtblid], "RELATIVE")$
1842$ // autostarttypeがRELATIVEの場合はSTARTTICK==0は禁止
1843 $IF SCHTBL.STARTTICK[schtblid] == 0$
1844 $ERROR SCHTBL.TEXT_LINE[schtblid]$$FORMAT(_("OsScheduleTableStartValue of RELATIVE OsScheduleTable(%1%) must not be zero"), schtblid)$$END$
1845 $END$
1846
1847$ //暗黙スケジュールテーブルのautostarttypeにRELATIVEが指定されているか
1848 $IF EQ(SCHTBL.SYNCSTRATEGY[schtblid], "IMPLICIT")$
1849 $ERROR SCHTBL.TEXT_LINE[schtblid]$$FORMAT(_("OsScheduleTableAutostartType of IMPLICIT OsScheduleTable(%1%) must not be RELATIVE"), schtblid)$$END$
1850 $END$
1851 $END$
1852 $END$
1853
1854$ //満了点数254を超
1855えるかチェック
1856 $IF LENGTH(SCHTBL.EXPPTINDEX_LIST[schtblid]) > 254$
1857 $ERROR SCHTBL.TEXT_LINE[schtblid]$
1858 $FORMAT(_("too many OsScheduleTableExpiryPoint of OsScheduleTable(%1%) %2% > 254"), schtblid, LENGTH(SCHTBL.EXPPTINDEX_LIST[schtblid]))$$END$
1859 $ELSE$
1860 $previous_exp_expptid = AT(SCHTBL.EXPPTINDEX_LIST[schtblid], 0)$
1861
1862$ // 初期オフセットは,0か接続カウンタの最小周期〜最大値かになる必
1863要がある
1864 $IF EXPPT.OFFSET[previous_exp_expptid] != 0 && (EXPPT.OFFSET[previous_exp_expptid] < CNT.MINCYCLE[SCHTBL.CNTID[schtblid]] ||
1865 EXPPT.OFFSET[previous_exp_expptid] > CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]])$
1866 $ERROR EXPPT.TEXT_LINE[previous_exp_expptid]$
1867 $FORMAT(_("The Initial Offset(%1%) of OsScheduleTable(%2%) must be zero OR in the range OsCounterMinCycle(%3%) .. OsCounterMaxAllowedValue(%4%)"),
1868 EXPPT.OFFSET[previous_exp_expptid], schtblid, CNT.MINCYCLE[SCHTBL.CNTID[schtblid]], CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]])$$END$
1869 $END$
1870
1871$ // 各満了点間の遅
1872延値は,接続カウンタの最小周期〜最大値かになる必
1873要がある
1874 $FOREACH exp_expptid SCHTBL.EXPPTINDEX_LIST[schtblid]$
1875 $IF previous_exp_expptid != exp_expptid$
1876 $IF (EXPPT.OFFSET[exp_expptid] - EXPPT.OFFSET[previous_exp_expptid] < CNT.MINCYCLE[SCHTBL.CNTID[schtblid]]) ||
1877 (EXPPT.OFFSET[exp_expptid] - EXPPT.OFFSET[previous_exp_expptid] > CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]])$
1878 $ERROR EXPPT.TEXT_LINE[exp_expptid]$
1879 $FORMAT(_("The delay of OsScheduleTable(%1%) between OsScheduleTblExpPointOffset(%2% and %3%) must be in the range OsCounterMinCycle(%4%) .. OsCounterMaxAllowedValue(%5%)"),
1880 schtblid, EXPPT.OFFSET[previous_exp_expptid], EXPPT.OFFSET[exp_expptid], CNT.MINCYCLE[SCHTBL.CNTID[schtblid]], CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]])$$END$
1881 $END$
1882 $previous_exp_expptid = exp_expptid$
1883 $END$
1884 $END$
1885
1886$ // 最終遅
1887延値は,接続カウンタの最小周期〜最大値かになる必
1888要がある(単発の場合0〜最大値が許される)
1889 $IF (SCHTBL.REPEAT[schtblid] != 1) &&
1890 ((SCHTBL.DURATIONTICK[schtblid] - EXPPT.OFFSET[previous_exp_expptid] < 0) ||
1891 (SCHTBL.DURATIONTICK[schtblid] - EXPPT.OFFSET[previous_exp_expptid] > CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]]))$
1892$ // 単発駆動の場合,0未満またはカウンタの最大値を超
1893える値を設定するとエラー
1894 $ERROR EXPPT.TEXT_LINE[previous_exp_expptid]$
1895 $FORMAT(_("Final Delay(%1%) of OsScheduleTable(%2%) must be in the range OsCounterMinCycle(%3%) .. OsCounterMaxAllowedValue(%4%), and allow zero when single-shot"),
1896 (SCHTBL.DURATIONTICK[schtblid] - EXPPT.OFFSET[previous_exp_expptid]), schtblid, CNT.MINCYCLE[SCHTBL.CNTID[schtblid]], CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]])$$END$
1897 $ELIF (SCHTBL.REPEAT[schtblid] == 1) &&
1898 ((SCHTBL.DURATIONTICK[schtblid] - EXPPT.OFFSET[previous_exp_expptid] < CNT.MINCYCLE[SCHTBL.CNTID[schtblid]]) ||
1899 (SCHTBL.DURATIONTICK[schtblid] - EXPPT.OFFSET[previous_exp_expptid] > CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]]))$
1900$ // 周期駆動の場合,カウンタの最小周期未満またはカウンタの最大値を超
1901える値を設定するとエラー
1902 $ERROR EXPPT.TEXT_LINE[previous_exp_expptid]$
1903 $FORMAT(_("Final Delay(%1%) of OsScheduleTable(%2%) must be in the range OsCounterMinCycle(%3%) .. OsCounterMaxAllowedValue(%4%), and allow zero when single-shot"),
1904 (SCHTBL.DURATIONTICK[schtblid] - EXPPT.OFFSET[previous_exp_expptid]), schtblid, CNT.MINCYCLE[SCHTBL.CNTID[schtblid]], CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]])$$END$
1905 $END$
1906 $END$
1907
1908$ // 暗黙スケジュールテーブルのカウント
1909 $IF EQ(SCHTBL.SYNCSTRATEGY[schtblid], "IMPLICIT")$
1910 $tnum_implscheduletable = tnum_implscheduletable + 1$
1911
1912$ 暗黙スケジュールテーブルの周期は,駆動カウント最大値+1かチェック
1913 $IF SCHTBL.DURATIONTICK[schtblid] != CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]] + 1$
1914 $ERROR SCHTBL.TEXT_LINE[schtblid]$$FORMAT(_("OsScheduleTableDuration(%1%) of IMPLICIT OsScheduleTable(%2%) must be OsCounterMaxAllowedValue(%3%) + 1"),
1915 SCHTBL.DURATIONTICK[schtblid], schtblid, CNT.MAXALLOWED[SCHTBL.CNTID[schtblid]])$$END$
1916 $END$
1917 $END$
1918$END$
1919
1920$ 他の非信頼OSAPに所属するカウンタを指定した場合
1921$FOREACH schtblid SCHTBL.ID_LIST$
1922 $IF !EQ(SCHTBL.OSAPID[schtblid], CNT.OSAPID[SCHTBL.CNTID[schtblid]])$
1923 $IF !OSAP.TRUSTED[CNT.OSAPID[SCHTBL.CNTID[schtblid]]]$
1924 $ERROR SCHTBL.TEXT_LINE[schtblid]$$FORMAT(_("OsScheduleTableCounterRef(%1%) is on a other Non-Trusted OS-Application"), SCHTBL.CNTID[schtblid])$$END$
1925 $END$
1926 $END$
1927$END$
1928
1929
1930$ =====================================================================
1931$ 信頼関数のエラーチェックとID設定
1932$ =====================================================================
1933
1934$i = 0$
1935$FOREACH tfnid TFN.ID_LIST$
1936 $TFN.ID[tfnid] = i$
1937 $i = i + 1$
1938
1939$ // OSアプリケーションは信頼OSアプリケーションか?
1940 $IF !OSAP.TRUSTED[TFN.OSAPID[tfnid]]$
1941 $ERROR TFN.TEXT_LINE[tfnid]$$FORMAT(_("OsApplicationTrustedFunction(%1%) of OsApplication(%2%) can't be assign to Non-Trusted OS-Application"),
1942 tfnid, TFN.OSAPID[tfnid])$$END$
1943 $END$
1944
1945 $IF EQ(TFN.FUNC[tfnid], REGEX_REPLACE(TFN.FUNC[tfnid], "^TRUSTED_", ""))$
1946 $ERROR TFN.TEXT_LINE[tfnid]$$FORMAT(_("OsTrustedFunctionName(%1%) of OsApplication(%2%) function name must begin with TRUSTED_"),
1947 TFN.FUNC[tfnid], TFN.OSAPID[tfnid])$$END$
1948 $END$
1949$END$
1950
1951
1952$ =====================================================================
1953$ 以下はHRP2からの移植
1954$ =====================================================================
1955
1956$ =====================================================================
1957$ 保護ドメインに関する前処理
1958$ =====================================================================
1959
1960$
1961$ 保護ドメインリストの作成
1962$ DOMLIST:ユーザドメインのリスト
1963$ DOMLIST_ALL:カーネルドメイン,ユーザドメイン,無所属のリスト
1964$
1965$FOREACH domid OSAP.ID_LIST$
1966 $IF !OSAP.TRUSTED[domid]$
1967 $DOMLIST = APPEND(DOMLIST, domid)$
1968 $END$
1969$END$
1970$DOMLIST_ALL = APPEND(TDOM_KERNEL, DOMLIST, TDOM_NONE)$
1971
1972$
1973$ 保護ドメイン毎のデフォルトのアクセス許可パターンの作成
1974$
1975$DEFAULT_ACPTN[TDOM_KERNEL] = VALUE("TACP_KERNEL", TACP_KERNEL)$
1976$FOREACH domid OSAP.ID_LIST$
1977 $DEFAULT_ACPTN[domid] = OSAP.ACPTN[domid]$
1978$END$
1979$DEFAULT_ACPTN[TDOM_NONE] = VALUE("TACP_SHARED", TACP_SHARED)$
1980
1981$
1982$ 保護ドメインのラベルの作成
1983$ OSAP.LABEL[domid]:保護ドメインのラベル
1984$
1985$OSAP.LABEL[TDOM_KERNEL] = "kernel"$
1986$FOREACH domid OSAP.ID_LIST$
1987 $IF !OSAP.TRUSTED[domid]$
1988 $OSAP.LABEL[domid] = domid$
1989 $END$
1990$END$
1991$OSAP.LABEL[TDOM_NONE] = "shared"$
1992
1993$ =====================================================================
1994$ メモリオブジェクトに関する前処理
1995$
1996$ 統合前のメモリオブジェクトの情
1997報をMO.XXXX[moid]に生成する.
1998$
1999$ nummo:統合前のメモリオブジェクトの数
2000$ MO.TYPE[moid]:メモリオブジェクトのタイプ
2001$ TOPPERS_ATTMOD:OsMemoryModuleで登録されたセクション
2002$ モジュール名をMO.MODULE[moid]に設定
2003$ TOPPERS_ATTSEC:OsMemorySectionで登録されたセクション
2004$ TOPPERS_ATTMEM:OsMemoryAreaで登録されたセクション
2005$ å…
2006ˆé ­ç•ªåœ°ã‚’MO.BASE[moid]に設定
2007$ サイズをMO.SIZE[moid]に設定
2008$ TOPPERS_USTACK:タスクのユーザスタック領域
2009$ タスクIDをMO.STKORDER[moid]に設定
2010$ å…
2011ˆé ­ç•ªåœ°ã‚’MO.BASE[moid]に設定(ユーザスタック領域をア
2012$ プリケーションが指定した場合のみ)
2013$ サイズをMO.SIZE[moid]に設定
2014$ MO.LINKER[moid]:リンカがé…
2015ç½®ã™ã‚‹ãƒ¡ãƒ¢ãƒªã‚ªãƒ–ジェクトか?
2016$ MO.OSAPID[moid]:属するOSAP(無所属の場合はTDOM_NONE)
2017$ MO.MEMREG[moid]:メモリリージョン番号(リンカがé…
2018ç½®ã™ã‚‹å ´åˆã®ã¿ï¼‰
2019$ MO.SECTION[moid]:セクション名(リンカがé…
2020ç½®ã™ã‚‹å ´åˆã®ã¿ï¼‰
2021$ MO.MEMATR[moid]:メモリオブジェクト属性
2022$ MO.ACPTN1[moid]:通常操作1(書込み)のアクセス許可パターン
2023$ MO.ACPTN2[moid]:通常操作2(読出し,実行)のアクセス許可パターン
2024$ MO.TEXT_LINE[moid]:メモリオブジェクトを登録したコンフィギュレーションフィアルの行番号
2025$ MO_USTACK_LIST:ジェネレータが割り付けるユーザスタック領域のリスト
2026$ MO_USTACK_LIST2:å…
2027ˆé ­ç•ªåœ°ã‚’指定されたユーザスタック領域のリスト
2028$ =====================================================================
2029
2030$TOPPERS_ATTMOD = VALUE("TOPPERS_ATTMOD", TOPPERS_ATTSEC + 1)$
2031$nummo = 0$
2032$MO_USTACK_LIST = {}$
2033$MO_USTACK_LIST2 = {}$
2034
2035$
2036$ é…
2037ç½®ã™ã‚‹ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«é–¢ã™ã‚‹å‰å‡¦ç†
2038$
2039$ OsLinkSectionでé…
2040ç½®ã™ã‚‹ã‚»ã‚¯ã‚·ãƒ§ãƒ³ï¼ˆãƒ¡ãƒ¢ãƒªã‚ªãƒ–ジェクトとして登録しない)の情
2041
2042$ 報を,LNKSEC[lsid]に生成する.
2043$
2044$ numls:é…
2045ç½®ã™ã‚‹ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®æ•°
2046$ LNKSEC.MEMREG[lsid]:メモリリージョン番号
2047$ LNKSEC.SECTION[lsid]:セクション名
2048
2049$numls = 0$
2050
2051$
2052$ OsMemoryRegionで登録されたリージョンに関するエラーチェックと前処理
2053$
2054$ REG_LIST:処理済みのメモリリージョンのリスト
2055$ REG.REGNAME[reg]:メモリリージョン名(=UNESCSTR(MO.REGION[reg]))
2056$
2057$FOREACH reg REG.ORDER_LIST$
2058$ // REG.REGNAME[reg]の作成
2059 $REG.REGNAME[reg] = UNESCSTR(REG.REGION[reg])$
2060
2061$ // メモリリージョン名が登録済みの場合
2062 $FOREACH reg2 REG_LIST$
2063 $IF EQ(REG.REGNAME[reg], REG.REGNAME[reg2])$
2064 $ERROR REG.TEXT_LINE[reg]$$FORMAT(_("OsMemoryRegionName(%1%) of OsMemoryRegion(%2%) is duplicated"), REG.REGNAME[reg], reg)$$END$
2065 $END$
2066 $END$
2067
2068$ // regatrが([TA_NOWRITE])でない場合
2069 $IF (REG.REGATR[reg] & ~(TA_NOWRITE|TARGET_REGATR)) != 0$
2070 $ERROR REG.TEXT_LINE[reg]$$FORMAT(_("illegal attribute(%1%) of OsMemoryRegion(%2%)"), REG.REGATR[reg], reg)$$END$
2071 $END$
2072
2073$ // ドメインに所属している場合
2074 $IF LENGTH(REG.DOMAIN[reg])$
2075 $ERROR REG.TEXT_LINE[reg]$$FORMAT(_("OsMemoryRegion(%1%) must be outside of OsApplication"), REG.REGNAME[reg])$$END$
2076 $END$
2077
2078$ // sizeが0の場合
2079 $IF REG.SIZE[reg] == 0$
2080 $ERROR REG.TEXT_LINE[reg]$$FORMAT(_("OsMemoryRegionSize of OsMemoryRegion(%1%) must not be zero"), reg)$$END$
2081 $END$
2082
2083$ // base+sizeが最大アドレスを越える場合
2084 $limit = (REG.BASE[reg] + REG.SIZE[reg]) & ((1 << sizeof_void_ptr * 8) - 1)$
2085 $IF limit < REG.BASE[reg] && limit != 0$
2086 $ERROR REG.TEXT_LINE[reg]$$FORMAT(_("OsMemoryRegionSize(%1%) of OsMemoryRegion(%2%) is too large"), REG.SIZE[reg], reg)$$END$
2087 $END$
2088
2089$ // 登録済みのメモリリージョンと領域が重なる場合
2090 $FOREACH reg2 REG_LIST$
2091 $IF ((REG.BASE[reg] <= REG.BASE[reg2]
2092 && REG.BASE[reg] + REG.SIZE[reg] > REG.BASE[reg2])
2093 || (REG.BASE[reg2] < REG.BASE[reg]
2094 && REG.BASE[reg2] + REG.SIZE[reg2] > REG.BASE[reg]))$
2095 $ERROR REG.TEXT_LINE[reg]$
2096 $FORMAT(_("OsMemoryRegionName(%1%) of OsMemoryRegion(%2%) overlaps with another OsMemoryRegionName(%3%) of OsMemoryRegion(%4%)"),
2097 REG.REGNAME[reg], reg, REG.REGNAME[reg2], reg2)$$END$
2098 $END$
2099 $END$
2100
2101$ // ターゲット依存のエラーチェック NOS0804
2102 $IF ISFUNCTION("HOOK_ERRORCHECK_REG")$
2103 $HOOK_ERRORCHECK_REG(reg)$
2104 $END$
2105 $REG_LIST = APPEND(REG_LIST, reg)$
2106$END$
2107
2108$ REG_ORDERの生成
2109$REG_ORDER = SORT(REG.ORDER_LIST, "REG.BASE")$
2110
2111$
2112$ OsStandardMemoryRegionで定義された標準メモリリージョンに関するエラーチェックと前処理
2113$
2114$ STANDARD_ROM:標準ROMリージョンのメモリリージョン番号
2115$ STANDARD_RAM:標準RAMリージョンのメモリリージョン番号
2116$
2117$IF !LENGTH(SRG.ORDER_LIST)$
2118$ //OsStandardMemoryRegionがない場合は,ここで処理を止める(以降のエラーの抑止)
2119 $ERROR$$FORMAT(_("no standard memory region is registered"))$$END$
2120 $DIE()$
2121$ELSE$
2122$ // ドメインの囲みの中に記述されている場合
2123 $IF LENGTH(SRG.DOMAIN[1])$
2124 $ERROR SEG.TEXT_LINE[1]$$FORMAT(_("OsStandardMemoryRegion must be outside of OsApplication"))$$END$
2125 $END$
2126
2127$ // OsStandardMemoryRegionが複数ある
2128 $IF LENGTH(SRG.ORDER_LIST) > 1$
2129 $ERROR$$FORMAT(_("too many OsStandardMemoryRegion"))$$END$
2130 $END$
2131
2132$ // stdromが登録されているかのチェック
2133 $STANDARD_ROM = 0$
2134 $FOREACH reg REG.ORDER_LIST$
2135 $IF EQ(UNESCSTR(SRG.STDROM[1]), REG.REGNAME[reg])$
2136 $STANDARD_ROM = reg$
2137 $END$
2138 $END$
2139 $IF STANDARD_ROM == 0$
2140 $ERROR SRG.TEXT_LINE[1]$$FORMAT(_("illegal region name(%1%) in OsStandardMemoryRegion"), UNESCSTR(SRG.STDROM[1]))$
2141 $END$
2142 $END$
2143
2144$ // stdromがTA_NOWRITE属性かのチェック
2145 $IF (REG.REGATR[STANDARD_ROM] & TA_NOWRITE) == 0$
2146 $ERROR SRG.TEXT_LINE[1]$$FORMAT(_("standard ROM region must have TA_NOWRITE attribute"))$$END$
2147 $END$
2148
2149$ // stdramが登録されているかのチェック
2150 $STANDARD_RAM = 0$
2151 $FOREACH reg REG.ORDER_LIST$
2152 $IF EQ(UNESCSTR(SRG.STDRAM[1]), REG.REGNAME[reg])$
2153 $STANDARD_RAM = reg$
2154 $END$
2155 $END$
2156 $IF STANDARD_RAM == 0$
2157 $ERROR SRG.TEXT_LINE[1]$$FORMAT(_("illegal region name(%1%) in OsStandardMemoryRegion"), UNESCSTR(SRG.STDRAM[1]))$
2158 $END$
2159 $END$
2160
2161$ // stdramがTA_NOWRITE属性でないかのチェック
2162 $IF (REG.REGATR[STANDARD_RAM] & TA_NOWRITE) != 0$
2163 $ERROR SRG.TEXT_LINE[1]$$FORMAT(_("standard RAM region must not have TA_NOWRITE attribute"))$$END$
2164 $END$
2165
2166$ // どちらかがエラーの場合は,ここで処理を止める(以降のエラーの抑止)
2167 $IF STANDARD_ROM==0 || STANDARD_RAM==0$
2168 $DIE()$
2169 $END$
2170$END$
2171
2172$
2173$ 標準のセクションの定義と標準セクションのリストの作成
2174$
2175$ DSEC_SECTION_LIST:標準のセクションと保護ドメイン毎標準セクションのリスト
2176$
2177$FOREACH dsec DSEC.ORDER_LIST$
2178 $DSEC_SECTION_LIST = APPEND(DSEC_SECTION_LIST, DSEC.SECTION[dsec])$
2179$END$
2180$FOREACH domid DOMLIST_ALL$
2181 $FOREACH dsec DSEC.ORDER_LIST$
2182 $DSEC_SECTION_LIST = APPEND(DSEC_SECTION_LIST,
2183 FORMAT("%s_%s", DSEC.SECTION[dsec], OSAP.LABEL[domid]))$
2184 $END$
2185$END$
2186
2187$
2188$ OsMemoryModuleで登録したのと同等に扱うモジュールの処理
2189$
2190$ å…
2191ˆé ­ã§OsMemoryModuleで登録したのと同等:START_OBJS, libkernel.o, kernel_mem.o, libkernel.a
2192$ 末尾でOsMemoryModuleで登録したのと同等:*, END_OBJS
2193$
2194$IF TOPPERS_SUPPORT_ATT_MOD$
2195 $nummod = LENGTH(MOD.ORDER_LIST)$
2196
2197 $FUNCTION ATT_MOD_FIRST$
2198 $nummod = nummod + 1$
2199 $MOD.ORDER_LIST = APPEND(nummod, MOD.ORDER_LIST)$
2200 $MOD.MODULE[nummod] = ESCSTR(ARGV[1])$
2201 $MOD.OSAPID[nummod] = ARGV[2]$
2202 $MOD.TEXT_LINE[nummod] = 0$
2203 $MOD.EXPORT[nummod] = 0$
2204 $END$
2205
2206 $FUNCTION ATT_MOD_LAST$
2207 $nummod = nummod + 1$
2208 $MOD.ORDER_LIST = APPEND(MOD.ORDER_LIST, nummod)$
2209 $MOD.MODULE[nummod] = ESCSTR(ARGV[1])$
2210 $MOD.OSAPID[nummod] = ARGV[2]$
2211 $MOD.TEXT_LINE[nummod] = 0$
2212 $MOD.EXPORT[nummod] = 0$
2213 $END$
2214
2215 $FOREACH module APPEND("libkernel.a", "kernel_mem.o", "Os_Lcfg.o",
2216 START_OBJS)$
2217 $ATT_MOD_FIRST(module, TDOM_KERNEL)$
2218 $END$
2219
2220 $ATT_MOD_LAST("*", TDOM_NONE)$
2221 $FOREACH module END_OBJS$
2222 $ATT_MOD_LAST(module, TDOM_KERNEL)$
2223 $END$
2224$END$
2225
2226$
2227$ OsMemoryModuleで登録されたモジュールに関する情
2228報の生成
2229$
2230$ MOD_LIST:処理済みのモジュールのリスト
2231$
2232$FOREACH mod MOD.ORDER_LIST$
2233$ // OsMemoryModuleがサポートされていない場合
2234 $IF !TOPPERS_SUPPORT_ATT_MOD$
2235 $ERROR MOD.TEXT_LINE[mod]$$FORMAT(_("OsMemoryModule is not supported on this target"))$$END$
2236 $END$
2237
2238$ // moduleが登録済みの場合
2239 $FOREACH mod2 MOD_LIST$
2240 $IF EQ(MOD.MODULE[mod], MOD.MODULE[mod2])$
2241 $ERROR MOD.TEXT_LINE[mod]$$FORMAT(_("OsMemoryModuleName(%1%) of OsMemoryModule(%2%) is duplicated"), UNESCSTR(MOD.MODULE[mod]), mod)$$END$
2242 $END$
2243 $END$
2244
2245$ // ターゲット依存のエラーチェック
2246 $IF ISFUNCTION("HOOK_ERRORCHECK_MOD")$
2247 $HOOK_ERRORCHECK_MOD(mod)$
2248 $END$
2249
2250$ // メモリオブジェクト情
2251報の生成
2252 $FOREACH dsec DSEC.ORDER_LIST$
2253 $nummo = nummo + 1$
2254 $MO.TYPE[nummo] = TOPPERS_ATTMOD$
2255 $MO.MODULE[nummo] = UNESCSTR(MOD.MODULE[mod])$
2256 $MO.LINKER[nummo] = 1$
2257 $IF EQ(MOD.OSAPID[mod], "")$
2258 $MO.OSAPID[nummo] = TDOM_NONE$
2259 $ELSE$
2260 $MO.OSAPID[nummo] = MOD.OSAPID[mod]$
2261 $END$
2262 $IF DSEC.MEMREG[dsec] == 1$
2263 $MO.MEMREG[nummo] = STANDARD_ROM$
2264 $ELSE$
2265 $MO.MEMREG[nummo] = STANDARD_RAM$
2266 $END$
2267 $MO.SECTION[nummo] = DSEC.SECTION[dsec]$
2268 $MO.MEMATR[nummo] = DSEC.MEMATR[dsec]$
2269
2270 $domptn = DEFAULT_ACPTN[MO.OSAPID[nummo]]$
2271 $MO.ACPTN1[nummo] = domptn$
2272 $MO.ACPTN2[nummo] = domptn$
2273 $IF MOD.EXPORT[mod] == 1$
2274 $MO.ACPTN2[nummo] = TACP_SHARED$
2275 $END$
2276 $MO.TEXT_LINE[nummo] = MOD.TEXT_LINE[mod]$
2277 $END$
2278 $MOD_LIST = APPEND(MOD_LIST, mod)$
2279$END$
2280
2281$
2282$ OsMemorySection定義と同等の機能を提供
2283$ 第1引数 セクション名
2284$ 第2引数 メモリ属性
2285$ 第3引数 メモリリージョン
2286$ 第4引数 å…
2287±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライトにするか
2288$
2289$FUNCTION ATT_SEC$
2290 $section = ARGV[1]$
2291 $mematr = ARGV[2]$
2292 $memreg = ARGV[3]$
2293 $export = ARGV[4]$
2294
2295 $numsec = LENGTH(SEC.ORDER_LIST)$
2296 $numsec = numsec + 1$
2297 $SEC.ORDER_LIST = APPEND(numsec, SEC.ORDER_LIST)$
2298 $SEC.SECTION[numsec] = ESCSTR(section)$
2299 $SEC.MEMATR[numsec] = mematr$
2300 $SEC.MEMREG[numsec] = REG.REGION[memreg]$
2301 $SEC.OSAPID[numsec] = TDOM_KERNEL$
2302 $SEC.TEXT_LINE[numsec] = 0$
2303 $SEC.EXPORT[numsec] = export$
2304$END$
2305
2306$ATT_SEC(".srpw_bss_kernel", TA_SDATA, STANDARD_RAM, 1)$
2307
2308$
2309$ OsMemorySection/OsLinkSectionで登録されたセクションに関する情
2310報の生成
2311$
2312$ SEC_LIST:処理済みのセクションのリスト
2313$
2314$FOREACH sec SEC.ORDER_LIST$
2315$ // sectionが標準のセクションの場合
2316 $IF TOPPERS_SUPPORT_ATT_MOD || !LENGTH(SEC.MEMATR[sec])$
2317 $IF LENGTH(FIND(DSEC_SECTION_LIST, UNESCSTR(SEC.SECTION[sec])))$
2318 $ERROR SEC.TEXT_LINE[sec]$
2319 $FORMAT(_("OsMemorySectionName of OsMemorySection(%1%) can't be attached default section(%2%)"), sec, UNESCSTR(SEC.SECTION[sec]))$
2320 $END$
2321 $END$
2322 $END$
2323
2324$ // sectionが登録済みの場合
2325 $FOREACH sec2 SEC_LIST$
2326 $IF EQ(SEC.SECTION[sec], SEC.SECTION[sec2])$
2327 $ERROR SEC.TEXT_LINE[sec]$
2328 $FORMAT(_("OsMemorySectionName(%1%) of OsMemorySection(%2%) is duplicated"), UNESCSTR(SEC.SECTION[sec]), sec)$
2329 $END$
2330 $END$
2331 $END$
2332
2333$ // memregのチェック
2334 $memreg = 0$
2335 $FOREACH reg REG.ORDER_LIST$
2336 $IF EQ(UNESCSTR(SEC.MEMREG[sec]), REG.REGNAME[reg])$
2337 $memreg = reg$
2338 $END$
2339 $END$
2340 $IF memreg == 0$
2341 $ERROR SEC.TEXT_LINE[sec]$
2342 $FORMAT(_("illegal OSMemorySectionMemoryRegionRef(%1%) of OsMemorySection(%2%)"), SEC.MEMREG[sec], sec)$
2343 $END$
2344$ // 以降のエラーの抑止
2345 $memreg = STANDARD_RAM$
2346 $END$
2347
2348 $IF LENGTH(SEC.MEMATR[sec])$
2349$ // OsMemorySectionの場合
2350
2351$ // mematrが([TA_NOWRITE|TA_NOREAD|TA_EXEC|TA_MEMINI|TA_MEMPRSV|TA_SDATA|TA_UNCACHE|TA_IODEV])でない場合
2352$ // mematrにTA_MEMINIとTA_MEMPRSVの両方を指定した場合(TA_RSATR)
2353 $IF (SEC.MEMATR[sec] & ~(TA_NOWRITE|TA_NOREAD|TA_EXEC|TA_MEMINI|TA_MEMPRSV|TA_SDATA|TA_UNCACHE|TA_IODEV|TARGET_MEMATR)) != 0
2354 || (SEC.MEMATR[sec] & (TA_MEMINI|TA_MEMPRSV)) == (TA_MEMINI|TA_MEMPRSV)$
2355 $ERROR SEC.TEXT_LINE[sec]$$FORMAT(_("illegal attribute(%1%) of OsMemorySection(%2%)"), SEC.MEMATR[sec], sec)$$END$
2356 $END$
2357
2358 $IF (SEC.EXPORT[sec] == 1 && (SEC.MEMATR[sec] & (TA_NOWRITE | TA_NOREAD | TA_EXEC)))$
2359 $ERROR SEC.TEXT_LINE[sec]$$FORMAT(_("illegal Exported section memory attribute(%1%) of OsMemorySection(%2%)"), SEC.MEMATR[sec], sec)$$END$
2360 $END$
2361
2362$ // ターゲット依存のエラーチェック
2363 $IF ISFUNCTION("HOOK_ERRORCHECK_SEC")$
2364 $HOOK_ERRORCHECK_SEC(sec)$
2365 $END$
2366
2367$ // メモリオブジェクト情
2368報の生成
2369 $nummo = nummo + 1$
2370 $MO.TYPE[nummo] = TOPPERS_ATTSEC$
2371 $MO.LINKER[nummo] = 1$
2372 $IF EQ(SEC.OSAPID[sec], "")$
2373 $MO.OSAPID[nummo] = TDOM_NONE$
2374 $ELSE$
2375 $MO.OSAPID[nummo] = SEC.OSAPID[sec]$
2376 $END$
2377 $MO.MEMREG[nummo] = memreg$
2378 $MO.SECTION[nummo] = UNESCSTR(SEC.SECTION[sec])$
2379 $IF (REG.REGATR[memreg] & TA_NOWRITE) != 0$
2380$ // メモリリージョン属性にTA_NOWRITEが設定されている時は,
2381$ // メモリオブジェクト属性にTA_NOWRITEを設定する.
2382 $MO.MEMATR[nummo] = SEC.MEMATR[sec] | TA_NOWRITE$
2383 $ELSE$
2384 $MO.MEMATR[nummo] = SEC.MEMATR[sec]$
2385 $END$
2386
2387 $domptn = DEFAULT_ACPTN[MO.OSAPID[nummo]]$
2388 $MO.ACPTN1[nummo] = domptn$
2389 $MO.ACPTN2[nummo] = domptn$
2390 $IF SEC.EXPORT[sec] == 1$
2391 $MO.ACPTN2[nummo] = TACP_SHARED$
2392 $END$
2393 $MO.TEXT_LINE[nummo] = SEC.TEXT_LINE[sec]$
2394 $ELSE$
2395$ // OsLinkSectionの場合
2396
2397$ // é…
2398ç½®ã™ã‚‹ã‚»ã‚¯ã‚·ãƒ§ãƒ³æƒ…
2399報の生成
2400 $numls = numls + 1$
2401 $LNKSEC.MEMREG[numls] = memreg$
2402 $LNKSEC.SECTION[numls] = UNESCSTR(SEC.SECTION[sec])$
2403 $END$
2404 $SEC_LIST = APPEND(SEC_LIST, sec)$
2405$END$
2406
2407$
2408$ OsLinkSection定義と同等の機能を提供
2409$ 第1引数 セクション名
2410$ 第3引数 メモリリージョン
2411$
2412$FUNCTION LNK_SEC$
2413 $section = ARGV[1]$
2414 $memreg = ARGV[2]$
2415
2416 $numls = numls + 1$
2417 $LNKSEC.MEMREG[numls] = memreg$
2418 $LNKSEC.SECTION[numls] = section$
2419$END$
2420
2421$
2422$ 保護ドメイン毎の標準セクションに関する情
2423報の生成
2424$
2425$FOREACH domid DOMLIST_ALL$
2426 $FOREACH dsec DSEC.ORDER_LIST$
2427$ // メモリオブジェクト情
2428報の生成
2429 $nummo = nummo + 1$
2430 $MO.TYPE[nummo] = TOPPERS_ATTSEC$
2431 $MO.LINKER[nummo] = 1$
2432 $MO.OSAPID[nummo] = domid$
2433 $IF DSEC.MEMREG[dsec] == 1$
2434 $MO.MEMREG[nummo] = STANDARD_ROM$
2435 $ELSE$
2436 $MO.MEMREG[nummo] = STANDARD_RAM$
2437 $END$
2438 $MO.SECTION[nummo] = FORMAT("%s_%s", DSEC.SECTION[dsec], OSAP.LABEL[domid])$
2439 $MO.MEMATR[nummo] = DSEC.MEMATR[dsec]$
2440
2441 $domptn = DEFAULT_ACPTN[domid]$
2442 $MO.ACPTN1[nummo] = domptn$
2443 $MO.ACPTN2[nummo] = domptn$
2444 $END$
2445$END$
2446
2447$
2448$ OsMemoryAreaで登録されたセクションに関する情
2449報の生成
2450$
2451$FOREACH mem MEM.ORDER_LIST$
2452$ // mematrが([TA_NOWRITE|TA_NOREAD|TA_EXEC|TA_MEMINI|TA_MEMPRSV|TA_UNCACHE|TA_IODEV])でない場合
2453$ // mematrにTA_MEMPRSVを指定しないかTA_MEMINIを指定した場合(TA_RSATR)
2454 $IF (MEM.MEMATR[mem] & ~(TA_NOWRITE|TA_NOREAD|TA_EXEC|TA_MEMINI|TA_MEMPRSV|TA_UNCACHE|TA_IODEV|TARGET_MEMATR)) != 0
2455 || (MEM.MEMATR[mem] & (TA_MEMINI|TA_MEMPRSV)) != TA_MEMPRSV$
2456 $ERROR MEM.TEXT_LINE[mem]$$FORMAT(_("illegal attribute(%1%) of OsMemoryArea(%2%)"), MEM.MEMATR[mem], mem)$$END$
2457 $END$
2458
2459$ // sizeが0の場合
2460 $IF MEM.SIZE[mem] == 0$
2461 $ERROR MEM.TEXT_LINE[mem]$$FORMAT(_("OsMemoryAreaSize of OsMemoryArea(%2%) must not be zero"), MEM.SIZE[mem], mem)$$END$
2462 $END$
2463
2464$ // ターゲット依存のエラーチェック
2465 $IF ISFUNCTION("HOOK_ERRORCHECK_MEM")$
2466 $HOOK_ERRORCHECK_MEM(mem)$
2467 $END$
2468
2469$ // メモリオブジェクト情
2470報の生成
2471 $nummo = nummo + 1$
2472 $MO.TYPE[nummo] = TOPPERS_ATTMEM$
2473 $MO.BASE[nummo] = MEM.BASE[mem]$
2474 $MO.SIZE[nummo] = MEM.SIZE[mem]$
2475 $MO.LINKER[nummo] = 0$
2476 $IF EQ(MEM.OSAPID[mem], "")$
2477 $MO.OSAPID[nummo] = TDOM_NONE$
2478 $ELSE$
2479 $MO.OSAPID[nummo] = MEM.OSAPID[mem]$
2480 $END$
2481 $MO.MEMATR[nummo] = MEM.MEMATR[mem]$
2482
2483 $domptn = DEFAULT_ACPTN[MO.OSAPID[nummo]]$
2484 $MO.ACPTN1[nummo] = domptn$
2485 $MO.ACPTN2[nummo] = domptn$
2486 $MO.TEXT_LINE[nummo] = MEM.TEXT_LINE[mem]$
2487$END$
2488
2489$FOREACH moid RANGE(1, nummo)$
2490 $IF MO.OSAPID[moid] != TDOM_KERNEL && MO.OSAPID[moid] != TDOM_NONE &&
2491 OSAP.TRUSTED[MO.OSAPID[moid]]$
2492 $MO.OSAPID[moid] = TDOM_KERNEL$
2493 $END$
2494$END$
2495
2496$ =====================================================================
2497$ HRP2からの移植ここまで
2498$ =====================================================================
2499
2500
2501$ =====================================================================
2502$ Os_Cfg_tmp.hの生成 Os_Cfg.hと差分がある場合Makefile内
2503Os_Cfg.hへコピー
2504$ =====================================================================
2505
2506$TRACE("OUTPUT FILES")$
2507
2508$FILE "Os_Cfg_tmp.h"$
2509/* Os_Cfg.h */$NL$
2510#ifndef TOPPERS_OS_CFG_H$NL$
2511#define TOPPERS_OS_CFG_H$NL$
2512$NL$
2513
2514/****** Scalability Class ******/$NL$$NL$
2515
2516#define CFG_USE_SCALABILITYCLASS3$NL$
2517$NL$
2518
2519/****** Object OS ******/$NL$$NL$
2520$IF OS.STACKMONITORING[1]$
2521 #define CFG_USE_STACKMONITORING$NL$
2522$END$
2523
2524$IF OS.GETSERVICEID[1]$
2525 #define CFG_USE_GETSERVICEID$NL$
2526$END$
2527
2528$IF OS.PARAMETERACCESS[1]$
2529 #define CFG_USE_PARAMETERACCESS$NL$
2530$END$
2531
2532$USE_HOOK = 0$
2533
2534$NL$
2535/****** Object HOOK ******/$NL$$NL$
2536$IF HOOK.STARTUPHOOK[1]$
2537 #define CFG_USE_STARTUPHOOK$NL$
2538 $USE_HOOK = 1$
2539$END$
2540
2541$IF HOOK.SHUTDOWNHOOK[1]$
2542 #define CFG_USE_SHUTDOWNHOOK$NL$
2543 $USE_HOOK = 1$
2544$END$
2545
2546$IF HOOK.PRETASKHOOK[1]$
2547 #define CFG_USE_PRETASKHOOK$NL$
2548 $USE_HOOK = 1$
2549$END$
2550
2551$IF HOOK.POSTTASKHOOK[1]$
2552 #define CFG_USE_POSTTASKHOOK$NL$
2553 $USE_HOOK = 1$
2554$END$
2555
2556$IF HOOK.ERRORHOOK[1]$
2557 #define CFG_USE_ERRORHOOK$NL$
2558 $USE_HOOK = 1$
2559$END$
2560
2561$IF HOOK.PROTECTIONHOOK[1]$
2562 #define CFG_USE_PROTECTIONHOOK$NL$
2563 $USE_HOOK = 1$
2564$END$
2565
2566$NL$
2567#endif /* TOPPERS_OS_CFG_H */$NL$
2568
2569
2570$ =====================================================================
2571$ Os_Lcfg.hの生成
2572$ =====================================================================
2573
2574$FILE "Os_Lcfg.h"$
2575/* Os_Lcfg.h */$NL$
2576#ifndef TOPPERS_OS_LCFG_H$NL$
2577#define TOPPERS_OS_LCFG_H$NL$
2578$NL$
2579
2580$
2581$ オブジェクト数マクロの出力
2582$
2583#define TNUM_ALARM UINT_C($LENGTH(ALM.ID_LIST)$)$NL$
2584#define TNUM_COUNTER UINT_C($LENGTH(CNT.ID_LIST)$)$NL$
2585#define TNUM_HARDCOUNTER UINT_C($LENGTH(HWCNT.ID_LIST)$)$NL$
2586#define TNUM_ISR2 UINT_C($LENGTH(ISR2.ID_LIST)$)$NL$
2587#define TNUM_STD_RESOURCE UINT_C($LENGTH(STDRES.ID_LIST)$)$NL$
2588#define TNUM_TASK UINT_C($LENGTH(TSK.ID_LIST) - tnum_os_restarttask$)$NL$
2589#define TNUM_TASK_INC_RT UINT_C($LENGTH(TSK.ID_LIST)$)$NL$
2590#define TNUM_EXTTASK UINT_C($tnum_exttask$)$NL$
2591#define TNUM_APP_MODE UINT_C($LENGTH(APP.ID_LIST)$)$NL$
2592#define TNUM_SCHEDULETABLE UINT_C($LENGTH(SCHTBL.ID_LIST)$)$NL$
2593#define TNUM_IMPLSCHEDULETABLE UINT_C($tnum_implscheduletable$)$NL$
2594#define TNUM_TFN UINT_C($LENGTH(TFN.ID_LIST)$)$NL$
2595#define TNUM_OSAP UINT_C($LENGTH(OSAP.ID_LIST)$)$NL$
2596$NL$
2597
2598/*$NL$
2599$SPC$* Default Definitions of Trace Log Macros$NL$
2600$SPC$*/$NL$
2601$NL$
2602#ifndef TOPPERS_ENABLE_TRACE$NL$
2603#ifndef LOG_USER_MARK$NL$
2604#define LOG_USER_MARK(str)$NL$
2605#endif /* LOG_USER_MARK */$NL$
2606#endif /* TOPPERS_ENABLE_TRACE */$NL$
2607$NL$
2608 /****** Object TASK ******/$NL$$NL$
2609
2610$ タスクのIDの出力
2611$FOREACH tskid TSK.ID_LIST$
2612$ //OSが生成したリスタートタスク以外のタスクIDを出力する
2613 $IF tskid < tmin_os_restarttask$
2614 #define $tskid$$TAB$UINT_C($TSK.ID[tskid]$)$NL$
2615 $END$
2616$END$
2617$NL$
2618
2619 /****** Object COUNTER ******/$NL$$NL$
2620
2621$ カウンタIDの出力
2622
2623$FOREACH cntid CNT.ID_LIST$
2624 #define $cntid$$TAB$UINT_C($CNT.ID[cntid]$)$NL$
2625$END$
2626$NL$
2627
2628$ カウンタオブジェクトのOS定数の出力
2629$FOREACH cntid CNT.ID_LIST$
2630 #define OSMAXALLOWEDVALUE_$cntid$$TAB$((TickType) $+CNT.MAXALLOWED[cntid]$)$NL$
2631 #define OSTICKSPERBASE_$cntid$$TAB$((TickType) $+CNT.TICKSPERBASE[cntid]$)$NL$
2632 #define OSMINCYCLE_$cntid$$TAB$((TickType) $+CNT.MINCYCLE[cntid]$)$NL$
2633$END$
2634$NL$
2635
2636$ ティック値から時間への変換マクロ(PhysicalTimeTypeの型はfloat,doubleのいずれかと想定)
2637$FOREACH cntid HWCNT.ID_LIST$
2638 $IF LENGTH(CNT.NSPERTICK[cntid])$
2639 #define OS_TICKS2SEC_$cntid$(tick)$TAB$(((PhysicalTimeType)$CNT.NSPERTICK[cntid]$) * (tick) / 1000000000U) /* ($CNT.SECONDSPERTICK[cntid]$ * 1000000000) * (tick) / 1000000000 */$NL$
2640 #define OS_TICKS2MS_$cntid$(tick)$TAB$(((PhysicalTimeType)$CNT.NSPERTICK[cntid]$) * (tick) / 1000000U) /* ($CNT.SECONDSPERTICK[cntid]$ * 1000000000) * (tick) / 1000000 */$NL$
2641 #define OS_TICKS2US_$cntid$(tick)$TAB$(((PhysicalTimeType)$CNT.NSPERTICK[cntid]$) * (tick) / 1000U) /* ($CNT.SECONDSPERTICK[cntid]$ * 1000000000) * (tick) / 1000 */$NL$
2642 #define OS_TICKS2NS_$cntid$(tick)$TAB$(((PhysicalTimeType)$CNT.NSPERTICK[cntid]$) * (tick)) /* ($CNT.SECONDSPERTICK[cntid]$ * 1000000000) * (tick) */$NL$
2643 $END$
2644 $NL$
2645$END$
2646
2647 /****** Object ALARM ******/$NL$$NL$
2648
2649$ アラームIDの出力
2650$FOREACH almid ALM.ID_LIST$
2651 #define $almid$$TAB$UINT_C($ALM.ID[almid]$)$NL$
2652$END$
2653$NL$
2654
2655 /****** Object SCHEDULETABLE ******/$NL$$NL$
2656
2657$ スケジュールテーブルIDの出力
2658$FOREACH schtblid SCHTBL.ID_LIST$
2659 #define $schtblid$$TAB$UINT_C($SCHTBL.ID[schtblid]$)$NL$
2660$END$
2661$NL$
2662
2663 /****** Object RESOURCE ******/$NL$$NL$
2664
2665$ リソースIDの出力
2666$FOREACH resid RES.ID_LIST$
2667 #define $resid$$TAB$UINT_C($RES.ID[resid]$)$NL$
2668$END$
2669$NL$
2670
2671 /****** Object ISR ******/$NL$$NL$
2672
2673$ ISRのIDの出力
2674$FOREACH isrid ISR.ID_LIST$
2675 #define $isrid$$TAB$UINT_C($ISR.ID[isrid]$)$NL$
2676$END$
2677$NL$
2678
2679 /****** Object APPMODE ******/$NL$$NL$
2680
2681$FOREACH appid APP.ID_LIST$
2682 #define $appid$$TAB$UINT_C($APP.ID[appid]$)$NL$
2683$END$
2684$NL$
2685
2686$ イベントの出力
2687 /****** Object EVENT ******/$NL$
2688$FOREACH evtid EVT.ID_LIST$
2689 #define $evtid$$TAB$UINT_C($FORMAT("0x%08x", +EVT.CALC_MASK[evtid])$)$NL$
2690$END$
2691$NL$
2692
2693$ 信頼関数のIDの出力
2694 /****** Object Trusted Function ******/$NL$$NL$
2695$FOREACH tfnid TFN.ID_LIST$
2696 #define $tfnid$$TAB$UINT_C($TFN.ID[tfnid]$)$NL$
2697$END$
2698$NL$
2699
2700$ OSAPのIDの出力
2701 /****** Object OSApplication ******/$NL$
2702$FOREACH osapid OSAP.ID_LIST$
2703 #define $osapid$ UINT_C($OSAP.ID[osapid]$)$NL$
2704$END$
2705$NL$
2706
2707$NL$
2708
2709
2710$ =====================================================================
2711$ Os_Lcfg.cの生成
2712$ =====================================================================
2713$FILE "Os_Lcfg.c"$
2714
2715/* Os_Lcfg.c */$NL$
2716#include "kernel/kernel_int.h"$NL$
2717#include "Os_Lcfg.h"$NL$
2718$IF LENGTH(IOC.ID_LIST)$
2719 #include "Ioc.h"$NL$
2720 $NL$
2721$END$
2722$NL$
2723#ifndef TOPPERS_EMPTY_LABEL$NL$
2724#define TOPPERS_EMPTY_LABEL(x, y) x y[0]$NL$
2725#endif$NL$
2726$NL$
2727
2728$
2729$ トレースログマクロのデフォルト定義
2730$
2731/*$NL$
2732$SPC$* Default Definitions of Trace Log Macros$NL$
2733$SPC$*/$NL$
2734$NL$
2735#ifndef LOG_ISR_ENTER$NL$
2736#define LOG_ISR_ENTER(isrid)$NL$
2737#endif /* LOG_ISR_ENTER */$NL$
2738$NL$
2739#ifndef LOG_ISR_LEAVE$NL$
2740#define LOG_ISR_LEAVE(isrid)$NL$
2741#endif /* LOG_ISR_LEAVE */$NL$
2742$NL$
2743
2744$
2745$ インクルードディレクティブ(#include)
2746$
2747/*$NL$
2748$SPC$* Include Directives (#include)$NL$
2749$SPC$*/$NL$
2750$NL$
2751$INCLUDES$
2752$NL$
2753
2754$
2755$ オブジェクト数変数の出力
2756$
2757const AlarmType tnum_alarm = TNUM_ALARM;$NL$
2758const CounterType tnum_counter = TNUM_COUNTER;$NL$
2759const CounterType tnum_hardcounter = TNUM_HARDCOUNTER;$NL$
2760const ISRType tnum_isr2 = TNUM_ISR2;$NL$
2761const ResourceType tnum_stdresource = TNUM_STD_RESOURCE;$NL$
2762const TaskType tnum_task = TNUM_TASK;$NL$
2763const TaskType tnum_exttask = TNUM_EXTTASK;$NL$
2764const AppModeType tnum_appmode = TNUM_APP_MODE;$NL$
2765const ScheduleTableType tnum_scheduletable = TNUM_SCHEDULETABLE;$NL$
2766const ScheduleTableType tnum_implscheduletable = TNUM_IMPLSCHEDULETABLE;$NL$
2767const TrustedFunctionIndexType tnum_tfn = TNUM_TFN;$NL$
2768const ApplicationType tnum_osap = TNUM_OSAP;$NL$
2769$NL$
2770
2771$
2772$ タスク
2773$
2774$NL$
2775 /****** Object TASK ******/$NL$
2776$NL$
2777
2778$ =====================================================================
2779$ 以下はHRP2からの移植
2780$ =====================================================================
2781$
2782$ システムスタック領域の確保関数
2783$
2784$IF !ISFUNCTION("ALLOC_SSTACK")$
2785$FUNCTION ALLOC_SSTACK$
2786 $IF !EQ(ARGV[3], "")$
2787 $ARGV[3]$$SPC$
2788 $END$
2789 StackType $ARGV[1]$[COUNT_STK_T($ARGV[2]$)];$NL$
2790$END$
2791$END$
2792
2793$ システムスタックサイズが,0であるか,ターゲット定義の最小値
2794$ (TARGET_MIN_SSTKSZ)よりも小さい場合のエラーチェック関数
2795$FUNCTION CHECK_MIN_SSTKSZ$
2796 $IF ARGV[1] == 0 || (TARGET_MIN_SSTKSZ && ARGV[1] < TARGET_MIN_SSTKSZ)$
2797 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("%1%(%2%) of OsTask(%3%) is too small"), ARGV[2], ARGV[1], tskid)$$END$
2798 $END$
2799$END$
2800
2801$ システムスタック領域の生成とそれに関するエラーチェック
2802$FOREACH tskid TSK.ID_LIST$
2803 $IF OSAP.TRUSTED[TSK.OSAPID[tskid]]$
2804$ // 信頼タスクの場合の処理
2805
2806$ // sstkが省略されておらず,NULLでない場合
2807 $IF LENGTH(TSK.SSTK[tskid]) && !EQ(TSK.SSTK[tskid],"NULL")$
2808 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskSystemStackStartAddress of trusted OsTask(%1%) must not define"), tskid)$$END$
2809 $END$
2810
2811 $IF LENGTH(TSK.STKSZ[tskid]) && TSK.STKSZ[tskid] != 0$
2812 $TSK.STKSZ[tskid] = VALUE(CONCAT(+TSK.STKSZ[tskid],"U"),+TSK.STKSZ[tskid])$
2813 $ELSE$
2814 $TSK.STKSZ[tskid] = VALUE(CONCAT(+DEFAULT_TASKSTKSZ,"U"),+DEFAULT_TASKSTKSZ)$
2815 $END$
2816$ //信頼タスクに対するSystemStackSizeは,存在する場合にStackSizeに合算する仕様であるため,存在しない場合にはDEFAULT_TASKSTKSZにしない
2817 $IF LENGTH(TSK.SSTKSZ[tskid]) && TSK.SSTKSZ[tskid] != 0$
2818 $TSK.SSTKSZ[tskid] = VALUE(CONCAT(+TSK.SSTKSZ[tskid],"U"),+TSK.SSTKSZ[tskid])$
2819 $END$
2820
2821 $IF EQ(TSK.STK[tskid], "NULL")$
2822$ // stkがNULLの場合の処理
2823
2824 $IF LENGTH(TSK.SSTKSZ[tskid]) && TSK.SSTKSZ[tskid] > 0$
2825$ // sstkszが省略されていない場合の処理
2826
2827$ // システムスタック領域のサイズを求める(エラーチェックに
2828$ // 使うため,エラーチェックの前に求めておく)
2829 $sstksz = VALUE(FORMAT("(%1%) + (%2%)",
2830 TSK.STKSZ[tskid], TSK.SSTKSZ[tskid]),
2831 TSK.STKSZ[tskid] + TSK.SSTKSZ[tskid])$
2832
2833$ // stksz+sstkszがターゲット定義の最小値よりも小さい場合
2834 $CHECK_MIN_SSTKSZ(sstksz, "OsTaskStackSize+OsTaskSystemStackSize")$
2835 $ELSE$
2836$ // sstkszが省略されている場合の処理
2837
2838$ // stkszが,ターゲット定義の最小値よりも小さい場合
2839 $CHECK_MIN_SSTKSZ(TSK.STKSZ[tskid], "OsTaskStackSize")$
2840
2841$ // システムスタック領域のサイズを求める
2842 $sstksz = TSK.STKSZ[tskid]$
2843 $END$
2844
2845 $IF TSK.EXTENDED[tskid]$
2846$ // システムスタック領域の確保
2847 $ALLOC_SSTACK(CONCAT("_kernel_sstack_", tskid), sstksz, "")$
2848 $TSK.TINIB_SSTKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", sstksz)$
2849 $TSK.TINIB_SSTK[tskid] = CONCAT("_kernel_sstack_", tskid)$
2850 $ELSE$
2851 $TSK.TINIB_SSTK[tskid] = CONCAT("_kernel_shared_sstack_", +TSK.PRIORITY[tskid])$
2852 $TSK.SHARED_SSTK_ID[tskid] = TSK.PRIORITY[tskid]$
2853$ // 基本タスク用のå…
2854±æœ‰ã‚¹ã‚¿ãƒƒã‚¯ã®ã‚µã‚¤ã‚ºã‚’求める
2855 $IF !LENGTH(shared_sstack_size[TSK.PRIORITY[tskid]])
2856 || shared_sstack_size[TSK.PRIORITY[tskid]] < sstksz$
2857 $shared_sstack_size[TSK.PRIORITY[tskid]] = sstksz$
2858 $END$
2859 $END$
2860 $ELSE$
2861$ // stkがNULLでない場合の処理
2862
2863$ // stkszが,ターゲット定義の最小値よりも小さい場合
2864 $CHECK_MIN_SSTKSZ(TSK.STKSZ[tskid], "OsTaskStackSize")$
2865
2866$ // stkszがスタック領域のサイズの制約を満たしていない場合
2867 $IF CHECK_STKSZ_ALIGN
2868 && (TSK.STKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
2869 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskStackSize(%1%) of OsTask(%2%) is not aligned"), TSK.STKSZ[tskid], tskid)$$END$
2870 $END$
2871
2872$ // sstkszが省略されておらず,0でない場合
2873 $IF LENGTH(TSK.SSTKSZ[tskid]) && (TSK.SSTKSZ[tskid] != 0)$
2874 $ERROR TSK.TEXT_LINE[tskid]$
2875 $FORMAT(_("OsTaskSystemStackSize(%1%) of OsTask(%2%) must be zero because OsTaskStackStartAddress defined"), TSK.SSTKSZ[tskid], tskid)$$END$
2876 $END$
2877
2878 $TSK.TINIB_SSTKSZ[tskid] = TSK.STKSZ[tskid]$
2879 $TSK.TINIB_SSTK[tskid] = TSK.STK[tskid]$
2880 $END$
2881 $ELSE$
2882$ // 非信頼タスクの場合
2883
2884 $IF !LENGTH(TSK.SSTK[tskid]) || EQ(TSK.SSTK[tskid], "NULL")$
2885$ // sstkが省略されているか,NULLの場合の処理
2886
2887 $IF LENGTH(TSK.SSTKSZ[tskid]) && TSK.SSTKSZ[tskid] != 0$
2888 $TSK.SSTKSZ[tskid] = VALUE(CONCAT(+TSK.SSTKSZ[tskid],"U"),+TSK.SSTKSZ[tskid])$
2889$ // sstkszが0か,ターゲット定義の最小値よりも小さい場合
2890 $CHECK_MIN_SSTKSZ(TSK.SSTKSZ[tskid], "OsTaskSystemStackSize")$
2891 $ELSE$
2892 $TSK.SSTKSZ[tskid] = VALUE(CONCAT(+DEFAULT_TASKSYSTEMSTKSZ,"U"),+DEFAULT_TASKSYSTEMSTKSZ)$
2893 $END$
2894
2895$ // システムスタック領域のサイズを求める
2896 $sstksz = TSK.SSTKSZ[tskid]$
2897
2898
2899 $IF TSK.EXTENDED[tskid]$
2900$ // システムスタック領域の確保
2901 $TSK.TINIB_SSTKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", sstksz)$
2902 $ALLOC_SSTACK(CONCAT("_kernel_sstack_", tskid), TSK.TINIB_SSTKSZ[tskid], "")$
2903 $TSK.TINIB_SSTK[tskid] = CONCAT("_kernel_sstack_", tskid)$
2904 $ELIF !EQ(TSK.RESTARTTASK[tskid],"")$
2905 $TSK.TINIB_SSTKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", sstksz)$
2906 $ALLOC_SSTACK(CONCAT("_kernel_sstack_restart_", TSK.RESTARTTASK[tskid]), TSK.TINIB_SSTKSZ[tskid], "")$
2907 $TSK.TINIB_SSTK[tskid] = CONCAT("_kernel_sstack_restart_", TSK.RESTARTTASK[tskid])$
2908 $ELSE$
2909 $TSK.TINIB_SSTK[tskid] = CONCAT("_kernel_shared_sstack_", +TSK.PRIORITY[tskid])$
2910 $TSK.SHARED_SSTK_ID[tskid] = TSK.PRIORITY[tskid]$
2911$ // 基本タスク用のå…
2912±æœ‰ã‚¹ã‚¿ãƒƒã‚¯ã®ã‚µã‚¤ã‚ºã‚’求める
2913 $IF !LENGTH(shared_sstack_size[TSK.PRIORITY[tskid]])
2914 || shared_sstack_size[TSK.PRIORITY[tskid]] < sstksz$
2915 $shared_sstack_size[TSK.PRIORITY[tskid]] = sstksz$
2916 $END$
2917 $END$
2918 $ELSE$
2919$ // sstkが省略されておらず,NULLでない場合の処理
2920
2921 $IF LENGTH(TSK.SSTKSZ[tskid]) && TSK.SSTKSZ[tskid] != 0$
2922 $TSK.SSTKSZ[tskid] = VALUE(CONCAT(+TSK.SSTKSZ[tskid],"U"),+TSK.SSTKSZ[tskid])$
2923 $ELSE$
2924 $TSK.SSTKSZ[tskid] = VALUE(CONCAT(+DEFAULT_TASKSYSTEMSTKSZ,"U"),+DEFAULT_TASKSYSTEMSTKSZ)$
2925 $END$
2926
2927$ // sstkszが0か,ターゲット定義の最小値よりも小さい場合
2928 $CHECK_MIN_SSTKSZ(TSK.SSTKSZ[tskid], "OsTaskSystemStackSize")$
2929
2930$ // sstkszがスタック領域のサイズの制約を満たしていない場合
2931 $IF CHECK_STKSZ_ALIGN
2932 && (TSK.SSTKSZ[tskid] & (CHECK_STKSZ_ALIGN - 1))$
2933 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskSystemStackSize(%1%) of OsTask(%2%) is not aligned"), TSK.SSTKSZ[tskid], tskid)$$END$
2934 $END$
2935
2936 $TSK.TINIB_SSTKSZ[tskid] = TSK.SSTKSZ[tskid]$
2937 $TSK.TINIB_SSTK[tskid] = TSK.SSTK[tskid]$
2938 $END$
2939 $END$
2940$END$
2941
2942$FOREACH tskid TSK.ID_LIST$
2943 $IF LENGTH(TSK.SHARED_SSTK_ID[tskid])$
2944 $TSK.TINIB_SSTKSZ[tskid] = FORMAT("ROUND_STK_T(%1%)", shared_sstack_size[TSK.PRIORITY[tskid]])$
2945 $END$
2946$END$
2947
2948$FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$
2949 $IF LENGTH(shared_sstack_size[tskpri])$
2950 $ALLOC_SSTACK(CONCAT("_kernel_shared_sstack_", +tskpri), shared_sstack_size[tskpri], "")$
2951 $END$
2952$END$
2953$NL$
2954
2955$ ユーザスタック領域の生成とそれに関するエラーチェック
2956$FOREACH tskid TSK.ID_LIST$
2957 $IF OSAP.TRUSTED[TSK.OSAPID[tskid]] || tmin_os_restarttask <= tskid $
2958$ // 信頼タスクもしくはOSが生成したリスタートタスクの場合の処理
2959 $TSK.TINIB_USTKSZ[tskid] = VALUE("0U", 0)$
2960 $TSK.TINIB_USTK[tskid] = "NULL"$
2961 $ELSE$
2962$ // 非信頼タスクの場合の処理
2963
2964$ // MO生成するかのフラグ
2965 $create_mo = 1$
2966
2967 $IF LENGTH(TSK.STKSZ[tskid]) && TSK.STKSZ[tskid] != 0$
2968 $TSK.STKSZ[tskid] = VALUE(CONCAT(+TSK.STKSZ[tskid],"U"),+TSK.STKSZ[tskid])$
2969 $ELSE$
2970 $TSK.STKSZ[tskid] = VALUE(CONCAT(+DEFAULT_TASKSTKSZ,"U"),+DEFAULT_TASKSTKSZ)$
2971 $END$
2972
2973$ // stkszが0か,ターゲット定義の最小値(TARGET_MIN_USTKSZ)よりも
2974$ // 小さい場合
2975 $IF TSK.STKSZ[tskid] == 0 || (TARGET_MIN_USTKSZ &&
2976 TSK.STKSZ[tskid] < TARGET_MIN_USTKSZ)$
2977 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskStackSize(%1%) of OsTask(%2%) is too small"), TSK.STKSZ[tskid], tskid)$$END$
2978 $END$
2979
2980 $IF EQ(TSK.STK[tskid],"NULL")$
2981$ // stkがNULLの場合の処理
2982
2983$ // ユーザスタック領域の確保
2984 $IF TSK.EXTENDED[tskid]$
2985 $ALLOC_USTACK(tskid, TSK.STKSZ[tskid])$
2986 $ELSE$
2987 $TSK.TINIB_USTK[tskid] = CONCAT("_kernel_shared_ustack_", +TSK.PRIORITY[tskid])$
2988 $TSK.SHARED_USTK_ID[tskid] = TSK.PRIORITY[tskid]$
2989$ // 基本タスク用のå…
2990±æœ‰ã‚¹ã‚¿ãƒƒã‚¯ã®ã‚µã‚¤ã‚ºã‚’求める
2991 $IF !LENGTH(shared_ustack_size[TSK.PRIORITY[tskid]])
2992 || shared_ustack_size[TSK.PRIORITY[tskid]] < TSK.STKSZ[tskid]$
2993 $shared_ustack_size[TSK.PRIORITY[tskid]] = TSK.STKSZ[tskid]$
2994 $END$
2995 $END$
2996 $ELSE$
2997$ // stkがNULLでないの場合の処理
2998
2999$ // stkszがスタック領域のサイズの制約を満たしていない場合
3000 $IF CHECK_USTKSZ_ALIGN
3001 && (TSK.STKSZ[tskid] & (CHECK_USTKSZ_ALIGN - 1))$
3002 $ERROR TSK.TEXT_LINE[tskid]$$FORMAT(_("OsTaskStackSize(%1%) of OsTask(%2%) is not aligned"), TSK.STKSZ[tskid], tskid)$$END$
3003 $END$
3004
3005 $TSK.TINIB_USTKSZ[tskid] = TSK.STKSZ[tskid]$
3006 $TSK.TINIB_USTK[tskid] = TSK.STK[tskid]$
3007
3008$ // å…
3009±æœ‰ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ã‚¹ã‚¿ãƒƒã‚¯é ˜åŸŸã®æ¤œå‡º
3010 $FOREACH moid MO_USTACK_LIST2$
3011 $IF MO.OSAPID[moid] == TSK.OSAPID[tskid] &&
3012 EQ(MO.BASE[moid], TSK.STK[tskid]) &&
3013 EQ(MO.SIZE[moid], TSK.STKSZ[tskid])$
3014 $create_mo = 0$
3015 $TSK.USTACK_MO[tskid] = moid$
3016 $END$
3017 $END$
3018 $END$
3019
3020 $IF LENGTH(TSK.SHARED_USTK_ID[tskid])$
3021 $IF LENGTH(shared_ustack_mo[TSK.SHARED_USTK_ID[tskid]])$
3022 $create_mo = 0$
3023 $TSK.USTACK_MO[tskid] = shared_ustack_mo[TSK.SHARED_USTK_ID[tskid]]$
3024 $END$
3025 $END$
3026
3027 $IF create_mo$
3028$ // メモリオブジェクト情
3029報の生成
3030 $nummo = nummo + 1$
3031 $MO.TYPE[nummo] = TOPPERS_USTACK$
3032 $MO.TSKID[nummo] = tskid$
3033 $MO.STKORDER[nummo] = tskid$
3034 $IF !EQ(TSK.STK[tskid],"NULL")$
3035 $MO.BASE[nummo] = TSK.STK[tskid]$
3036 $MO.LINKER[nummo] = 0$
3037 $MO.SIZE[nummo] = TSK.TINIB_USTKSZ[tskid]$
3038 $MO_USTACK_LIST2 = APPEND(MO_USTACK_LIST2, nummo)$
3039 $ELSE$
3040 $MO.LINKER[nummo] = 1$
3041 $MO.MEMREG[nummo] = STANDARD_RAM$
3042 $IF LENGTH(TSK.SHARED_USTK_ID[tskid])$
3043 $MO.SECTION[nummo] = SECTION_SHARED_USTACK(TSK.SHARED_USTK_ID[tskid])$
3044 $shared_ustack_mo[TSK.SHARED_USTK_ID[tskid]] = nummo$
3045 $ELSE$
3046 $MO.SECTION[nummo] = SECTION_USTACK(tskid)$
3047 $MO.SIZE[nummo] = TSK.STKSZ[tskid]$
3048 $END$
3049 $MO_USTACK_LIST = APPEND(MO_USTACK_LIST, nummo)$
3050 $END$
3051 $MO.OSAPID[nummo] = TSK.OSAPID[tskid]$
3052 $MO.MEMATR[nummo] = TARGET_MEMATR_USTACK$
3053
3054 $domptn = DEFAULT_ACPTN[MO.OSAPID[nummo]]$
3055 $MO.ACPTN1[nummo] = domptn$
3056 $MO.ACPTN2[nummo] = domptn$
3057 $MO.TEXT_LINE[nummo] = TSK.TEXT_LINE[tskid]$
3058 $TSK.USTACK_MO[tskid] = nummo$
3059 $END$
3060 $END$
3061$END$
3062
3063$ =====================================================================
3064$ HRP2からの移植ここまで
3065$ =====================================================================
3066
3067$ OSAPCBの出力
3068$IF LENGTH(OSAP.ID_LIST)$
3069 OSAPCB osapcb_table[TNUM_OSAP];$NL$
3070$ELSE$
3071 TOPPERS_EMPTY_LABEL(OSAPCB, osapcb_table);$NL$
3072$END$
3073
3074$FOREACH tskid TSK.ID_LIST$
3075 $IF LENGTH(TSK.SHARED_USTK_ID[tskid])$
3076 $TSK.TINIB_USTKSZ[tskid] = shared_ustack_size[TSK.PRIORITY[tskid]]$
3077 $MO.SIZE[TSK.USTACK_MO[tskid]] = TSK.TINIB_USTKSZ[tskid]$
3078 $END$
3079$END$
3080
3081$FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$
3082 $IF LENGTH(shared_ustack_size[tskpri])$
3083 $shared_ustack_size[tskpri] = CONCAT(USTACK_ALIGN_SIZE(shared_ustack_size[tskpri]), "U")$
3084 $ALLOC_SHARED_USTACK(CONCAT("_kernel_shared_ustack_", +tskpri), tskpri, shared_ustack_size[tskpri])$
3085 $END$
3086$END$
3087
3088$NL$
3089
3090$ TCBの出力
3091$IF LENGTH(TSK.ID_LIST)$
3092 TCB tcb_table[TNUM_TASK_INC_RT];$NL$
3093 $NL$
3094$ELSE$
3095 TOPPERS_EMPTY_LABEL(TCB, tcb_table);$NL$
3096$END$
3097
3098$
3099$ カウンタの出力
3100$
3101$NL$
3102 /****** Object COUNTER ******/$NL$
3103$NL$
3104
3105$IF LENGTH(CNT.ID_LIST)$
3106 const CNTINIB cntinib_table[TNUM_COUNTER] = {$NL$
3107 $JOINEACH cntid CNT.ID_LIST ",\n"$
3108 $TAB${ $+CNT.MAXALLOWED[cntid]$U,$SPC$
3109 ($+CNT.MAXALLOWED[cntid]$U * 2U) + 1U,$SPC$
3110 $+CNT.TICKSPERBASE[cntid]$U,$SPC$
3111 $+CNT.MINCYCLE[cntid]$U,$SPC$
3112 &(osapcb_table[$CNT.OSAPID[cntid]$]),$SPC$
3113 $FORMAT("0x%08xU", +CNT.ACSBTMP[cntid])$ }
3114 $END$
3115 $NL$
3116 };$NL$
3117 $NL$
3118
3119 CNTCB cntcb_table[TNUM_COUNTER];$NL$
3120$ELSE$
3121 TOPPERS_EMPTY_LABEL(const CNTINIB, cntinib_table);$NL$
3122 TOPPERS_EMPTY_LABEL(CNTCB, cntcb_table);$NL$
3123$END$
3124
3125$ ハードウェアカウンタポインタテーブル定義の出力
3126$IF LENGTH(HWCNT.ID_LIST)$
3127 const HWCNTINIB hwcntinib_table[TNUM_HARDCOUNTER] = $NL$
3128 {$NL$
3129 $JOINEACH cntid HWCNT.ID_LIST ",\n"$
3130 $TAB${$NL$
3131 $TAB$$TAB$&init_hwcounter_$cntid$,$NL$
3132 $TAB$$TAB$&start_hwcounter_$cntid$,$NL$
3133 $TAB$$TAB$&stop_hwcounter_$cntid$,$NL$
3134 $TAB$$TAB$&set_hwcounter_$cntid$,$NL$
3135 $TAB$$TAB$&get_hwcounter_$cntid$,$NL$
3136 $TAB$$TAB$&cancel_hwcounter_$cntid$,$NL$
3137 $TAB$$TAB$&trigger_hwcounter_$cntid$,$NL$
3138 $TAB$$TAB$&int_clear_hwcounter_$cntid$,$NL$
3139 $TAB$$TAB$&int_cancel_hwcounter_$cntid$,$NL$
3140 $TAB$$TAB$&increment_hwcounter_$cntid$,$NL$
3141 $TAB$$TAB$$CNT.NSPERTICK[cntid]$ /* $CNT.SECONDSPERTICK[cntid]$ * 1000000000 */ $NL$
3142 $TAB$}
3143 $END$
3144 $NL$};$NL$
3145
3146$ELSE$
3147 TOPPERS_EMPTY_LABEL(const HWCNTINIB, hwcntinib_table);$NL$
3148$END$
3149$NL$
3150
3151
3152$
3153$ アラームの出力
3154$
3155$NL$
3156 /****** Object ALARM ******/$NL$
3157$NL$
3158
3159$FOREACH almid ALM.ID_LIST$
3160
3161$ // タスク起動用のアクション関数
3162 $IF EQ(ALM.ALMATR[almid], "ACTIVATETASK")$
3163 static void$NL$
3164 _activate_alarm_$+almid$(void);$NL$
3165 static void$NL$
3166 _activate_alarm_$+almid$(void)$NL$
3167 {$NL$
3168 $TAB$(void) activate_task_action(&(osapcb_table[$ALM.OSAPID[almid]$]), $ALM.TSKID[almid]$);$NL$
3169 }$NL$
3170
3171$ // イベントセット用のアクション関数
3172 $ELIF EQ(ALM.ALMATR[almid], "SETEVENT")$
3173 static void$NL$
3174 _setevent_alarm_$+almid$(void);$NL$
3175 static void$NL$
3176 _setevent_alarm_$+almid$(void)$NL$
3177 {$NL$
3178 $TAB$(void) set_event_action(&(osapcb_table[$ALM.OSAPID[almid]$]), $ALM.TSKID[almid]$, $ALM.EVTID[almid]$);$NL$
3179 }$NL$
3180
3181$ // IncrementCounter用のアクション関数
3182 $ELIF EQ(ALM.ALMATR[almid], "INCREMENTCOUNTER")$
3183 static void$NL$
3184 _incrementcounter_alarm_$+almid$(void);$NL$
3185 static void$NL$
3186 _incrementcounter_alarm_$+almid$(void)$NL$
3187 {$NL$
3188 $TAB$(void) incr_counter_action(&(osapcb_table[$ALM.OSAPID[almid]$]), $ALM.INCID[almid]$);$NL$
3189 }$NL$
3190 $END$
3191
3192 $NL$
3193$END$
3194
3195$ アラームコントロールブロック
3196
3197$IF LENGTH(ALM.ID_LIST)$
3198 const ALMINIB alminib_table[TNUM_ALARM] = {$NL$
3199 $JOINEACH almid ALM.ID_LIST ",\n"$
3200 $TAB${ &(cntcb_table[$ALM.CNTID[almid]$]),$SPC$
3201 $IF EQ(ALM.ALMATR[almid], "ACTIVATETASK")$
3202$ // タスク起動用
3203 &_activate_alarm_$+almid$,$SPC$
3204 $ELIF EQ(ALM.ALMATR[almid], "SETEVENT")$
3205$ // イベントセット用
3206 &_setevent_alarm_$+almid$,$SPC$
3207 $ELIF EQ(ALM.ALMATR[almid], "INCREMENTCOUNTER")$
3208$ // IncrementCounter用
3209 &_incrementcounter_alarm_$+almid$,$SPC$
3210 $END$
3211
3212 $FORMAT("0x%08xU", +ALM.ASTPTN[almid])$,$SPC$
3213 $IF ALM.ASTPTN[almid]$
3214 $+ALM.ALARMTIME[almid]$U,$SPC$
3215 $+ALM.CYCLETIME[almid]$U,$SPC$
3216$ // 自動起動属性以外の属性を管理しない
3217 $+ALM.AUTOSTARTTYPE[almid]$U,$SPC$
3218 $ELSE$
3219 0U, 0U, 0U,$SPC$
3220 $END$
3221 &(osapcb_table[$ALM.OSAPID[almid]$]),$SPC$
3222 $FORMAT("0x%08xU", +ALM.ACSBTMP[almid])$$SPC$}
3223 $END$
3224 $NL$
3225 };$NL$
3226 $NL$
3227
3228 ALMCB almcb_table[TNUM_ALARM];$NL$
3229$ELSE$
3230 TOPPERS_EMPTY_LABEL(const ALMINIB, alminib_table);$NL$
3231 TOPPERS_EMPTY_LABEL(ALMCB, almcb_table);$NL$
3232$END$
3233
3234
3235$
3236$ スケジュールテーブルの出力
3237$
3238$NL$
3239 /****** Object SCHEDULETABLE ******/$NL$
3240$NL$
3241
3242$ 各スケジュールテーブルの各満了点のアクション関数と満了点管理ブロックの生成
3243$FOREACH schtblid SCHTBL.ID_LIST$
3244 /* Object SCHEDULETABLE($schtblid$) */$NL$
3245 $NL$
3246 $FOREACH exppt_index RANGE(0, LENGTH(SCHTBL.EXPPTINDEX_LIST[schtblid]) - 1)$
3247 $expptid = AT(SCHTBL.EXPPTINDEX_LIST[schtblid], exppt_index)$
3248 static void$NL$
3249 _expire_scheduletable_$+schtblid$_$exppt_index$(void);$NL$
3250 static void$NL$
3251 _expire_scheduletable_$+schtblid$_$exppt_index$(void)$NL$
3252 {$NL$
3253$ // タスク起動
3254 $FOREACH expptactid EXPPTACT.ID_LIST$
3255 $IF EXPPTACT.EXPPTID[expptactid] == expptid && EQ(EXPPTACT.EXPIREATR[expptactid], "ACTIVATETASK")$
3256 $TAB$(void) activate_task_action(&(osapcb_table[$SCHTBL.OSAPID[EXPPTACT.SCHTBLID[expptactid]]$]), $EXPPTACT.TSKID[expptactid]$);$NL$
3257 $END$
3258 $END$
3259$ // イベントセット
3260 $FOREACH expptactid EXPPTACT.ID_LIST$
3261 $IF EXPPTACT.EXPPTID[expptactid] == expptid && EQ(EXPPTACT.EXPIREATR[expptactid], "SETEVENT")$
3262 $TAB$(void) set_event_action(&(osapcb_table[$SCHTBL.OSAPID[EXPPTACT.SCHTBLID[expptactid]]$]), $EXPPTACT.TSKID[expptactid]$, $EXPPTACT.EVTID[expptactid]$);$NL$
3263 $END$
3264 $END$
3265 }$NL$
3266 $END$
3267 $NL$
3268 static const SCHTBLEXPPTCB schtblexppt_table_$+schtblid$[$LENGTH(SCHTBL.EXPPTINDEX_LIST[schtblid])$] = {$NL$
3269 $JOINEACH exppt_index RANGE(0, LENGTH(SCHTBL.EXPPTINDEX_LIST[schtblid]) - 1) ",\n"$
3270 $expptid = AT(SCHTBL.EXPPTINDEX_LIST[schtblid], exppt_index)$
3271 $TAB${ $+EXPPT.OFFSET[expptid]$U, &_expire_scheduletable_$+schtblid$_$exppt_index$ }
3272 $END$
3273 $NL$
3274 };$NL$
3275 $NL$
3276$END$
3277$NL$
3278
3279$ スケジュールテーブル関連のデータブロックの宣言
3280$IF LENGTH(SCHTBL.ID_LIST)$
3281 const SCHTBLINIB schtblinib_table[TNUM_SCHEDULETABLE] = {$NL$
3282 $JOINEACH schtblid SCHTBL.ID_LIST ",\n"$
3283 $TAB${ &(cntcb_table[$SCHTBL.CNTID[schtblid]$]),$SPC$
3284 $+SCHTBL.DURATIONTICK[schtblid]$U,$SPC$
3285 $FORMAT("0x%08xU", +SCHTBL.ASTPTN[schtblid])$,$SPC$
3286 $IF SCHTBL.ASTPTN[schtblid]$
3287 $+SCHTBL.AUTOSTARTTYPE[schtblid]$U,$SPC$
3288 $+SCHTBL.STARTTICK[schtblid]$U, $SPC$
3289 $ELSE$
3290 0U, 0U,$SPC$
3291 $END$
3292 schtblexppt_table_$+schtblid$,$SPC$
3293 $IF SCHTBL.REPEAT[schtblid]$
3294 TRUE,$SPC$
3295 $ELSE$
3296 FALSE,$SPC$
3297 $END$
3298 $LENGTH(SCHTBL.EXPPTINDEX_LIST[schtblid])$U,$SPC$
3299 &(osapcb_table[$SCHTBL.OSAPID[schtblid]$]),$SPC$
3300 $FORMAT("0x%08xU", +SCHTBL.ACSBTMP[schtblid])$ }
3301 $END$
3302 $NL$
3303 };$NL$
3304 $NL$
3305 SCHTBLCB schtblcb_table[TNUM_SCHEDULETABLE];$NL$
3306$ELSE$
3307 TOPPERS_EMPTY_LABEL(const SCHTBLINIB, schtblinib_table);$NL$
3308 TOPPERS_EMPTY_LABEL(SCHTBLCB, schtblcb_table);$NL$
3309$END$
3310
3311$NL$
3312
3313
3314$
3315$ リソースの出力
3316$
3317$NL$
3318 /****** Object RESOURCE ******/$NL$
3319$NL$
3320
3321$IF LENGTH(STDRES.ID_LIST)$
3322 const RESINIB resinib_table[TNUM_STD_RESOURCE] = {$NL$
3323 $JOINEACH resid STDRES.ID_LIST ",\n"$
3324 $IF RES.CEILPRI[resid] > 0$
3325$ タスクのみが扱うリソースの場合
3326 $TAB${ $TMAX_TPRI - RES.CEILPRI[resid]$,$SPC$
3327 $ELSE$
3328$ ISRも扱うリソースの場合
3329 $TAB${ $RES.CEILPRI[resid]$,$SPC$
3330 $END$
3331 $FORMAT("0x%08xU", +RES.ACSBTMP[resid])$ }
3332 $END$
3333 $NL$
3334 };$NL$
3335 $NL$
3336
3337 RESCB rescb_table[TNUM_STD_RESOURCE];$NL$
3338$ELSE$
3339 TOPPERS_EMPTY_LABEL(const RESINIB, resinib_table);$NL$
3340 TOPPERS_EMPTY_LABEL(RESCB, rescb_table);$NL$
3341$END$
3342
3343$NL$
3344
3345
3346$
3347$ オブジェクト初期化ルーチン
3348$
3349$NL$
3350void$NL$
3351object_initialize(void)$NL$
3352{$NL$
3353$TAB$osap_initialize();$NL$
3354$TAB$interrupt_initialize();$NL$
3355$IF LENGTH(STDRES.ID_LIST)$
3356$TAB$resource_initialize();$NL$
3357$END$
3358$TAB$task_initialize();$NL$
3359$ //OSが生成したリスタートタスクの初期化コードを追加する
3360$FOREACH killer RANGE(tmin_os_restarttask, LENGTH(TSK.ID_LIST))$
3361 $TAB$/* initialize the Os-genereted Restart Task */$NL$
3362 $TAB$tcb_table[$killer - 1$].p_tinib = &(tinib_table[$killer - 1$]);$NL$
3363$END$
3364$IF LENGTH(CNT.ID_LIST)$
3365$TAB$counter_initialize();$NL$
3366$END$
3367$IF LENGTH(ALM.ID_LIST)$
3368$TAB$alarm_initialize();$NL$
3369$END$
3370$IF LENGTH(SCHTBL.ID_LIST)$
3371$TAB$schtbl_initialize();$NL$
3372$END$
3373$IF LENGTH(IOC.ID_LIST)$
3374$TAB$ioc_initialize();$NL$
3375$END$
3376}$NL$
3377$NL$
3378
3379$
3380$ オブジェクト終了処理ルーチン
3381$
3382$NL$
3383void$NL$
3384object_terminate(void)$NL$
3385{$NL$
3386$IF LENGTH(CNT.ID_LIST)$
3387$TAB$counter_terminate();$NL$
3388$END$
3389}$NL$
3390$NL$
3391
3392$
3393$ 割込み管理機能
3394$
3395$NL$
3396/*$NL$
3397$SPC$* Interrupt Management Functions$NL$
3398$SPC$*/$NL$
3399$NL$
3400
3401$ ISR用の割込みハンドラ
3402$FOREACH isrid ISR2.ID_LIST$
3403 $IF !OSAP.TRUSTED[ISR.OSAPID[isrid]] && ISFUNCTION("GENERATE_USER_INTHDR")$
3404 $GENERATE_USER_INTHDR(isrid)$
3405 $ELSE$
3406 void$NL$
3407 $ISR.INT_ENTRY[isrid]$(void)$NL$
3408 {$NL$
3409 $TAB$i_begin_int($+ISR.INTNO[isrid]$U);$NL$
3410 $TAB$LOG_ISR_ENTER($isrid$);$NL$
3411 $TAB$ISRNAME($isrid$)();$NL$
3412 $TAB$LOG_ISR_LEAVE($isrid$);$NL$
3413 $TAB$i_end_int($+ISR.INTNO[isrid]$U);$NL$
3414 }$NL$
3415 $END$
3416$END$
3417$NL$
3418
3419$ ハードウェアカウンタ割込み処理
3420/* HardWare Counter Interrupt Handler(C2ISR) */$NL$
3421$FOREACH cntid HWCNT.ID_LIST$
3422 ISR($CNT.ISRID[cntid]$)$NL$
3423 {$NL$
3424 $TAB$notify_hardware_counter($cntid$);$NL$
3425 }$NL$
3426$END$
3427$NL$
3428
3429/*$NL$
3430$SPC$* Stack Area for Non-task Context$NL$
3431$SPC$*/$NL$
3432$NL$
3433
3434$ 非タスクコンテキスト用のスタック領域サイズ計算
3435$FOREACH isrid ISR2.ID_LIST$
3436$ // NULL(0)か0を指定した場合,デフォルト値設定
3437 $IF ISR.STKSZ[isrid] == 0$
3438 $ISR.STKSZ[isrid] = DEFAULT_ISRSTKSZ$
3439 $END$
3440
3441$ // 非タスクコンテキスト用のスタック領域計算の為,優å…
3442ˆåº¦æ¯Žæœ€å¤§å€¤ã®åˆè¨ˆæº–å‚™
3443 $IF LENGTH(ISR.STKSZ[isrid]) && (!LENGTH(isr_shared_stack_size[ISR.INTPRI[isrid]])
3444 || isr_shared_stack_size[ISR.INTPRI[isrid]] < ISR.STKSZ[isrid])$
3445 $isr_shared_stack_size[ISR.INTPRI[isrid]] = ISR.STKSZ[isrid]$
3446 $END$
3447$END$
3448
3449$ // MINIMUM_OSTKSZは,非タスクコンテキストスタックサイズの最小値として,依存部に設置
3450$total_stksz = MINIMUM_OSTKSZ$
3451
3452$ ISRスタック領域のサイズを合計
3453$FOREACH isrpri RANGE(-MAX_PRI_ISR2, -MIN_PRI_ISR2)$
3454 $IF LENGTH(isr_shared_stack_size[isrpri])$
3455 $total_stksz = total_stksz + isr_shared_stack_size[isrpri]$
3456 $END$
3457$END$
3458
3459$IF USE_HOOK$
3460$ // スタックサイズのデフォルト設定
3461$ // NULL(0)か0を指定した場合,デフォルト値設定
3462 $IF LENGTH(HSTK.ID_LIST) && HSTK.STKSZ[1] != 0$
3463 $total_stksz = total_stksz + HSTK.STKSZ[1]$
3464 $ELSE$
3465 $total_stksz = total_stksz + DEFAULT_HOOKSTKSZ$
3466 $END$
3467$END$
3468
3469$IF OS.STACKMONITORING[1]$
3470$ スタック残量チェック方式用のスタック残量サイズ計算
3471$FOREACH isrid ISR.ID_LIST$
3472 $ISR.STKSZ_2[isrid] = ISR.STKSZ[isrid]$
3473 $IF (EQ(ISR.CATEGORY[isrid], "CATEGORY_2"))$
3474 $FOREACH isrpri RANGE(-ISR.INTPRI[isrid], -MIN_PRI_ISR2)$
3475 $IF ISR.INTPRI[isrid] < isrpri$
3476 $IF LENGTH(isr_shared_stack_size[isrpri])$
3477 $ISR.STKSZ_2[isrid] = ISR.STKSZ_2[isrid] + isr_shared_stack_size[isrpri]$
3478 $END$
3479 $END$
3480 $END$
3481 $END$
3482$END$
3483
3484$ フック有効時,スタック残量チェック方式用スタックサイズを加算
3485$IF USE_HOOK$
3486 $FOREACH isrid2 ISR2.ID_LIST$
3487 $IF LENGTH(HSTK.ID_LIST) && HSTK.STKSZ[1] != 0$
3488 $ISR.STKSZ_2[isrid2] = ISR.STKSZ_2[isrid2] + HSTK.STKSZ[1]$
3489 $ELSE$
3490 $ISR.STKSZ_2[isrid2] = ISR.STKSZ_2[isrid2] +DEFAULT_HOOKSTKSZ$
3491 $END$
3492 $END$
3493$END$
3494$END$
3495
3496$ 割込み管理機能のための標準的な初期化情
3497報の生成
3498$IF !OMIT_INITIALIZE_INTERRUPT$
3499
3500$ // 割込み要求ライン数
3501 #define TNUM_INTNO UINT_C($LENGTH(ISR.ID_LIST)$)$NL$
3502 const InterruptNumberType tnum_intno = TNUM_INTNO;$NL$
3503 $NL$
3504
3505$ // 割込み要求ライン初期化テーブル
3506 $IF LENGTH(ISR.ID_LIST)$
3507 const INTINIB intinib_table[TNUM_INTNO] = {$NL$
3508 $JOINEACH isrid ISR.ID_LIST ",\n"$
3509 $TAB${ ($+ISR.INTNO[isrid]$U),$ISR.INTATR[isrid]$, ($-ISR.INTPRI[isrid]$),
3510 $IF OS.STACKMONITORING[1]$
3511 $FORMAT("0x%xU",+ISR.STKSZ_2[isrid])$
3512 $END$
3513 }
3514 $END$$NL$
3515 };$NL$
3516 $ELSE$
3517 TOPPERS_EMPTY_LABEL(const INTINIB, intinib_table);$NL$
3518 $END$
3519 $NL$
3520$END$
3521
3522$
3523$ ISRの出力
3524$
3525$NL$
3526 /****** Object ISR ******/$NL$
3527$NL$
3528$NL$
3529
3530$IF LENGTH(ISR2.ID_LIST)$
3531 $FOREACH isrid ISR2.ID_LIST$
3532 $ALLOC_SSTACK(CONCAT("_kernel_sstack_", isrid), +DEFAULT_TASKSYSTEMSTKSZ)$
3533 $ALLOC_USTACK_ISR(isrid, +DEFAULT_TASKSTKSZ)$
3534$ // メモリオブジェクト情
3535報の生成
3536 $nummo = nummo + 1$
3537 $MO.TYPE[nummo] = TOPPERS_USTACK$
3538 $MO.TSKID[nummo] = isrid$
3539 $MO.STKORDER[nummo] = isrid$
3540 $MO.LINKER[nummo] = 1$
3541 $MO.MEMREG[nummo] = STANDARD_RAM$
3542 $MO.SECTION[nummo] = SECTION_USTACK(isrid)$
3543 $MO.SIZE[nummo] = ISR.TINIB_USTKSZ[isrid]$
3544 $MO_USTACK_LIST = APPEND(MO_USTACK_LIST, nummo)$
3545 $MO.OSAPID[nummo] = ISR.OSAPID[isrid]$
3546 $MO.MEMATR[nummo] = TARGET_MEMATR_USTACK$
3547
3548 $domptn = DEFAULT_ACPTN[MO.OSAPID[nummo]]$
3549 $MO.ACPTN1[nummo] = domptn$
3550 $MO.ACPTN2[nummo] = domptn$
3551 $MO.TEXT_LINE[nummo] = ISR.TEXT_LINE[isrid]$
3552 $ISR.USTACK_MO[isrid] = nummo$
3553 $END$
3554 $NL$
3555 const ISRINIB isrinib_table[TNUM_ISR2] = {$NL$
3556 $JOINEACH isrid ISR2.ID_LIST ",\n"$
3557 $TAB${$NL$
3558 $TAB$$TAB$&(intinib_table[$isrid$]),$SPC$
3559 &(osapcb_table[$ISR.OSAPID[isrid]$]), $FORMAT("0x%08xU", +ISR.ACSBTMP[isrid])$,$NL$
3560 $TAB$$TAB$$+DEFAULT_TASKSYSTEMSTKSZ$, (StackType)((uint8 *)$CONCAT("_kernel_sstack_", isrid)$ + $+DEFAULT_TASKSYSTEMSTKSZ$),$NL$
3561 $TAB$$TAB$$+DEFAULT_TASKSTKSZ$, (StackType)((uint8 *)$ISR.TINIB_USTK[isrid]$ + $+DEFAULT_TASKSTKSZ$),$NL$
3562 $TAB$$TAB$$ISR.TINIB_USTK[isrid]$, $ISR.TINIB_USTK[isrid]$ + $+DEFAULT_TASKSTKSZ$$NL$
3563 $TAB$}
3564 $END$
3565 $NL$
3566 };$NL$
3567 $NL$
3568
3569 ISRCB isrcb_table[TNUM_ISR2];$NL$
3570 $NL$
3571$ELSE$
3572 TOPPERS_EMPTY_LABEL(const ISRINIB, isrinib_table);$NL$
3573 TOPPERS_EMPTY_LABEL(ISRCB, isrcb_table);$NL$
3574$END$
3575
3576$
3577$ Trusted Function
3578$
3579
3580$NL$
3581 /******** Trusted Function ********/
3582$NL$
3583
3584$ Trusted Function 初期化ブロックの生成
3585$IF LENGTH(TFN.ID_LIST)$
3586 const TFINIB tfinib_table[TNUM_TFN] = {$NL$
3587 $JOINEACH tfnid TFN.ID_LIST ",\n"$
3588$ // 信頼関数スタックサイズのデフォルト設定
3589$ // NULL(0)か0を指定した場合,デフォルト設定
3590 $IF !LENGTH(TFN.STKSZ[tfnid]) || TFN.STKSZ[tfnid] == 0$
3591 $TFN.STKSZ[tfnid] = DEFAULT_TRUSTEDFUNCTIONSTKSZ$
3592 $END$
3593 $TAB${ &$TFN.FUNC[tfnid]$, $+TFN.STKSZ[tfnid]$U }
3594 $END$$NL$
3595 };$NL$
3596 $NL$
3597$ELSE$
3598 TOPPERS_EMPTY_LABEL(const TFINIB, tfinib_table);$NL$
3599$END$
3600
3601$
3602$ 非タスクコンテキスト用のスタック領域
3603$
3604$IF !LENGTH(OSTK.ID_LIST)$
3605$ // OSTKがない場合の計算したスタック合計値の設定
3606$ // 非スタックコンテキストスタックサイズ = ISRå…
3607±æœ‰å¾Œã‚µã‚¤ã‚º + MINIMUM_OSTKSZ
3608 $ALLOC_SSTACK("_kernel_ostack", FORMAT("0x%xU", +total_stksz), "static")$
3609 #define TOPPERS_OSTKSZ $FORMAT("ROUND_STK_T(0x%xU)", +total_stksz)$$NL$
3610 #define TOPPERS_OSTK (_kernel_ostack)$NL$
3611$ELSE$
3612$ // スタックサイズのデフォルト設定
3613$ // NULL(0)か0を指定した場合,デフォルト値設定
3614 $IF !LENGTH(OSTK.STKSZ[1]) || OSTK.STKSZ[1] == 0$
3615 $OSTK.STKSZ[1] = DEFAULT_OSSTKSZ$
3616 $END$
3617
3618$ // stkszがスタック領域のサイズとして正しくない場合
3619 $IF !EQ(OSTK.STK[1], "NULL") && CHECK_STKSZ_ALIGN
3620 && OSTK.STKSZ[1] & (CHECK_STKSZ_ALIGN - 1)$
3621 $ERROR OSTK.TEXT_LINE[1]$$FORMAT(_("OsOsStackSize(%1%) is not aligned"), OSTK.STKSZ[1])$$END$
3622 $END$
3623
3624$ // stkszが必
3625要なスタックサイズより小さい場合
3626 $IF OSTK.STKSZ[1] < total_stksz$
3627 $ERROR OSTK.TEXT_LINE[1]$$FORMAT(_("OsOsStackSize(%1%) is necessary 0x%2$x and more)"), OSTK.STKSZ[1], +total_stksz)$$END$
3628 $END$
3629
3630 $IF EQ(OSTK.STK[1], "NULL")$
3631$ // スタック領域の自動割付け
3632 $ALLOC_SSTACK("_kernel_ostack", OSTK.STKSZ[1], "")$
3633 #define TOPPERS_OSTKSZ ROUND_STK_T($OSTK.STKSZ[1]$)$NL$
3634 #define TOPPERS_OSTK (_kernel_ostack)$NL$
3635 $ELSE$
3636 #define TOPPERS_OSTKSZ ($OSTK.STKSZ[1]$)$NL$
3637 #define TOPPERS_OSTK ($OSTK.STK[1]$)$NL$
3638 $END$
3639$END$
3640$NL$
3641
3642$ 非タスクコンテキスト用のスタック領域
3643const MemorySizeType _ostksz = TOPPERS_OSTKSZ;$NL$
3644StackType * const _ostk = (StackType *) TOPPERS_OSTK;$NL$
3645$NL$
3646#ifdef TOPPERS_OSTKPT$NL$
3647$IF ISFUNCTION("DEFINE_CONST_VAR")$
3648 $DEFINE_CONST_VAR("StackType * const", "_ostkpt")$ = TOPPERS_OSTKPT(TOPPERS_OSTK, TOPPERS_OSTKSZ);$NL$
3649$ELSE$
3650 StackType * const _ostkpt = TOPPERS_OSTKPT(TOPPERS_OSTK, TOPPERS_OSTKSZ);$NL$
3651$END$
3652#endif /* TOPPERS_OSTKPT */$NL$
3653$NL$
3654
3655$ =====================================================================
3656$ IOC情
3657報の生成
3658$ =====================================================================
3659$INCLUDE "kernel/ioc.tf"$
3660
3661
3662$FILE "Os_Lcfg.h"$
3663#ifndef TOPPERS_MACRO_ONLY$NL$
3664
3665$
3666$ 割込み管理機能
3667$
3668$NL$
3669/*$NL$
3670$SPC$* Interrupt Management Functions$NL$
3671$SPC$*/$NL$
3672$NL$
3673
3674$FOREACH isrid ISR.ID_LIST$
3675$ //割込み関数であることを示すコンパイルオプションを付ける関数が定義されている場合か
3676 $IF EQ(ISR.CATEGORY[isrid], "CATEGORY_1") && ISFUNCTION("EXTERN_C1ISR_HANDLER")$
3677 $EXTERN_C1ISR_HANDLER(ISR.INT_ENTRY[isrid])$$NL$
3678 $ELSE$
3679 extern void $ISR.INT_ENTRY[isrid]$(void);$NL$
3680 $END$
3681$END$
3682
3683$ ISR用の割込みハンドラ
3684$FOREACH isrid ISR2.ID_LIST$
3685 extern ISR($isrid$);$NL$
3686$END$
3687$NL$
3688
3689#ifdef TOPPERS_ENABLE_TRACE$NL$
3690extern const char8 *atk2_appid_str(AppModeType id);$NL$
3691extern const char8 *atk2_tskid_str(TaskType id);$NL$
3692extern const char8 *atk2_isrid_str(ISRType id);$NL$
3693extern const char8 *atk2_cntid_str(CounterType id);$NL$
3694extern const char8 *atk2_almid_str(AlarmType id);$NL$
3695extern const char8 *atk2_resid_str(ResourceType id);$NL$
3696extern const char8 *atk2_schtblid_str(ScheduleTableType id);$NL$
3697extern const char8 *atk2_evtid_str(TaskType task, EventMaskType event);$NL$
3698extern const char8 *atk2_osapid_str(ApplicationType id);$NL$
3699extern const char8 *atk2_iocid_str(IocType id);$NL$
3700extern const char8 *atk2_tfnid_str(TrustedFunctionIndexType id);$NL$
3701#endif /* TOPPERS_ENABLE_TRACE */$NL$
3702$NL$
3703
3704$ ハードウェアカウンタの外部参ç…
3705§å®£è¨€ã®å‡ºåŠ›
3706$FOREACH cntid HWCNT.ID_LIST$
3707 extern void init_hwcounter_$cntid$(TickType maxval, TimeType nspertick);$NL$
3708 extern void start_hwcounter_$cntid$(void);$NL$
3709 extern void stop_hwcounter_$cntid$(void);$NL$
3710 extern void set_hwcounter_$cntid$(TickType exprtick);$NL$
3711 extern TickType get_hwcounter_$cntid$(void);$NL$
3712 extern void cancel_hwcounter_$cntid$(void);$NL$
3713 extern void trigger_hwcounter_$cntid$(void);$NL$
3714 extern void int_clear_hwcounter_$cntid$(void);$NL$
3715 extern void int_cancel_hwcounter_$cntid$(void);$NL$
3716 extern void increment_hwcounter_$cntid$(void);$NL$
3717$END$
3718$NL$
3719
3720 /******** Trusted Function ********/
3721$NL$
3722
3723$ TFNのextern宣言
3724$FOREACH tfnid TFN.ID_LIST$
3725extern TRUSTEDFUNCTION($TFN.FUNC[tfnid]$, FunctionIndex, FunctionParams);$NL$
3726$END$
3727$NL$
3728
3729$IF ISFUNCTION("EXTERN_INT_HANDLER")$
3730 $EXTERN_INT_HANDLER()$
3731$END$
3732
3733#endif /* TOPPERS_MACRO_ONLY */$NL$
3734
3735#endif /* TOPPERS_OS_LCFG_H */$NL$
3736
3737
3738$FILE "Os_Lcfg.c"$
3739#ifdef TOPPERS_ENABLE_TRACE$NL$
3740const char8 *$NL$
3741atk2_appid_str(AppModeType id)$NL$
3742{$NL$
3743$IF LENGTH(APP.ID_LIST)$
3744 $TAB$const char8 *appid_str;$NL$
3745 $TAB$switch (id) {$NL$
3746 $FOREACH appid APP.ID_LIST$
3747 $TAB$case $appid$:$NL$
3748 $TAB$$TAB$appid_str = "$appid$";$NL$
3749 $TAB$$TAB$break;$NL$
3750 $END$
3751 $TAB$default:$NL$
3752 $TAB$$TAB$appid_str = "";$NL$
3753 $TAB$$TAB$break;$NL$
3754 $TAB$}$NL$
3755 $TAB$return(appid_str);$NL$
3756$ELSE$
3757 $TAB$return("");$NL$
3758$END$
3759}$NL$
3760
3761const char8 *$NL$
3762atk2_tskid_str(TaskType id)$NL$
3763{$NL$
3764$TAB$const char8 *tskid_str;$NL$
3765$TAB$switch (id) {$NL$
3766$FOREACH tskid TSK.ID_LIST$
3767$ //OSが生成したリスタートタスク以外のタスクIDを出力する
3768 $IF tskid < tmin_os_restarttask$
3769 $TAB$case $tskid$:$NL$
3770 $TAB$$TAB$tskid_str = "$tskid$";$NL$
3771 $TAB$$TAB$break;$NL$
3772 $END$
3773$END$
3774$TAB$case INVALID_TASK:$NL$
3775$TAB$$TAB$tskid_str = "INVALID_TASK";$NL$
3776$TAB$$TAB$break;$NL$
3777$TAB$default:$NL$
3778$TAB$$TAB$tskid_str = "";$NL$
3779$TAB$$TAB$break;$NL$
3780$TAB$}$NL$
3781$TAB$return(tskid_str);$NL$
3782}$NL$
3783
3784$NL$
3785const char8 *$NL$
3786atk2_isrid_str(ISRType id)$NL$
3787{$NL$
3788$TAB$const char8 *isrid_str;$NL$
3789$TAB$switch (id) {$NL$
3790$FOREACH isrid ISR.ID_LIST$
3791 $TAB$case $isrid$:$NL$
3792 $TAB$$TAB$isrid_str = "$isrid$";$NL$
3793 $TAB$$TAB$break;$NL$
3794$END$
3795$TAB$case INVALID_ISR:$NL$
3796$TAB$$TAB$isrid_str = "INVALID_ISR";$NL$
3797$TAB$$TAB$break;$NL$
3798$TAB$default:$NL$
3799$TAB$$TAB$isrid_str = "";$NL$
3800$TAB$$TAB$break;$NL$
3801$TAB$}$NL$
3802$TAB$return(isrid_str);$NL$
3803}$NL$
3804
3805$NL$
3806const char8 *$NL$
3807atk2_cntid_str(CounterType id)$NL$
3808{$NL$
3809$IF LENGTH(CNT.ID_LIST)$
3810 $TAB$const char8 *cntid_str;$NL$
3811 $TAB$switch (id) {$NL$
3812 $FOREACH cntid CNT.ID_LIST$
3813 $TAB$case $cntid$:$NL$
3814 $TAB$$TAB$cntid_str = "$cntid$";$NL$
3815 $TAB$$TAB$break;$NL$
3816 $END$
3817 $TAB$default:$NL$
3818 $TAB$$TAB$cntid_str = "";$NL$
3819 $TAB$$TAB$break;$NL$
3820 $TAB$}$NL$
3821 $TAB$return(cntid_str);$NL$
3822$ELSE$
3823 $TAB$return("");$NL$
3824$END$
3825}$NL$
3826
3827$NL$
3828const char8 *$NL$
3829atk2_almid_str(AlarmType id)$NL$
3830{$NL$
3831$IF LENGTH(ALM.ID_LIST)$
3832 $TAB$const char8 *almid_str;$NL$
3833 $TAB$switch (id) {$NL$
3834 $FOREACH almid ALM.ID_LIST$
3835 $TAB$case $almid$:$NL$
3836 $TAB$$TAB$almid_str = "$almid$";$NL$
3837 $TAB$$TAB$break;$NL$
3838 $END$
3839 $TAB$default:$NL$
3840 $TAB$$TAB$almid_str = "";$NL$
3841 $TAB$$TAB$break;$NL$
3842 $TAB$}$NL$
3843 $TAB$return(almid_str);$NL$
3844$ELSE$
3845 $TAB$return("");$NL$
3846$END$
3847}$NL$
3848
3849$NL$
3850const char8 *$NL$
3851atk2_resid_str(ResourceType id)$NL$
3852{$NL$
3853$IF LENGTH(RES.ID_LIST)$
3854 $TAB$const char8 *resid_str;$NL$
3855 $TAB$switch (id) {$NL$
3856 $FOREACH resid RES.ID_LIST$
3857 $TAB$case $resid$:$NL$
3858 $TAB$$TAB$resid_str = "$resid$";$NL$
3859 $TAB$$TAB$break;$NL$
3860 $END$
3861 $TAB$default:$NL$
3862 $TAB$$TAB$resid_str = "";$NL$
3863 $TAB$$TAB$break;$NL$
3864 $TAB$}$NL$
3865 $TAB$return(resid_str);$NL$
3866$ELSE$
3867 $TAB$return("");$NL$
3868$END$
3869}$NL$
3870
3871$NL$
3872const char8 *$NL$
3873atk2_schtblid_str(ScheduleTableType id)$NL$
3874{$NL$
3875$IF LENGTH(SCHTBL.ID_LIST)$
3876 $TAB$const char8 *schtblid_str;$NL$
3877 $TAB$switch (id) {$NL$
3878 $FOREACH schtblid SCHTBL.ID_LIST$
3879 $TAB$case $schtblid$:$NL$
3880 $TAB$$TAB$schtblid_str = "$schtblid$";$NL$
3881 $TAB$$TAB$break;$NL$
3882 $END$
3883 $TAB$default:$NL$
3884 $TAB$$TAB$schtblid_str = "";$NL$
3885 $TAB$$TAB$break;$NL$
3886 $TAB$}$NL$
3887 $TAB$return(schtblid_str);$NL$
3888$ELSE$
3889 $TAB$return("");$NL$
3890$END$
3891}$NL$
3892
3893$NL$
3894const char8 *$NL$
3895atk2_evtid_str(TaskType task, EventMaskType event)$NL$
3896{$NL$
3897$TAB$const char8 *evtid_str;$NL$
3898$IF LENGTH(TSK.ID_LIST)$
3899 $TAB$switch (task) {$NL$
3900 $FOREACH tskid TSK.ID_LIST$
3901$ //OSが生成したリスタートタスク以外のタスクIDを出力する
3902 $IF tskid < tmin_os_restarttask$
3903 $TAB$case $tskid$:$NL$
3904 $IF LENGTH(TSK.EVT_LIST[tskid])$
3905 $TAB$$TAB$switch (event) {$NL$
3906 $FOREACH evtid TSK.EVT_LIST[tskid]$
3907 $TAB$$TAB$case $evtid$:$NL$
3908 $TAB$$TAB$$TAB$evtid_str = "$evtid$";$NL$
3909 $TAB$$TAB$$TAB$break;$NL$
3910 $END$
3911 $TAB$$TAB$default:$NL$
3912 $TAB$$TAB$$TAB$evtid_str = NULL;$NL$
3913 $TAB$$TAB$$TAB$break;$NL$
3914 $TAB$$TAB$}$NL$
3915 $ELSE$
3916 $TAB$$TAB$evtid_str = NULL;$NL$
3917 $END$
3918 $TAB$$TAB$break;$NL$
3919 $END$
3920 $END$
3921 $TAB$default:$NL$
3922 $TAB$$TAB$evtid_str = NULL;$NL$
3923 $TAB$$TAB$break;$NL$
3924 $TAB$}$NL$
3925$END$
3926$TAB$if (evtid_str == NULL) {$NL$
3927$FOREACH evtid EVT.ID_LIST$
3928 $TAB$$TAB$if (event == $evtid$) {$NL$
3929 $TAB$$TAB$$TAB$evtid_str = "$evtid$";$NL$
3930 $TAB$$TAB$}$NL$
3931$END$
3932$TAB$}$NL$
3933$TAB$return(evtid_str);$NL$
3934}$NL$
3935
3936$NL$
3937const char8 *$NL$
3938atk2_osapid_str(ApplicationType id)$NL$
3939{$NL$
3940$TAB$const char8 *osapid_str;$NL$
3941$TAB$switch (id) {$NL$
3942$FOREACH osapid OSAP.ID_LIST$
3943 $TAB$case $osapid$:$NL$
3944 $TAB$$TAB$osapid_str = "$osapid$";$NL$
3945 $TAB$$TAB$break;$NL$
3946$END$
3947$TAB$case INVALID_OSAPPLICATION:$NL$
3948$TAB$$TAB$osapid_str = "INVALID_OSAPPLICATION";$NL$
3949$TAB$$TAB$break;$NL$
3950$TAB$default:$NL$
3951$TAB$$TAB$osapid_str = "";$NL$
3952$TAB$$TAB$break;$NL$
3953$TAB$}$NL$
3954$TAB$return(osapid_str);$NL$
3955}$NL$
3956
3957$NL$
3958const char8 *$NL$
3959atk2_iocid_str(IocType id)$NL$
3960{$NL$
3961$TAB$const char8 *iocid_str;$NL$
3962$TAB$switch (id) {$NL$
3963$FOREACH iocid IOC.ID_LIST$
3964 $TAB$case $iocid$:$NL$
3965 $TAB$$TAB$iocid_str = "$iocid$";$NL$
3966 $TAB$$TAB$break;$NL$
3967$END$
3968$TAB$default:$NL$
3969$TAB$$TAB$iocid_str = "";$NL$
3970$TAB$$TAB$break;$NL$
3971$TAB$}$NL$
3972$TAB$return(iocid_str);$NL$
3973}$NL$
3974
3975$NL$
3976const char8 *$NL$
3977atk2_tfnid_str(TrustedFunctionIndexType id)$NL$
3978{$NL$
3979$IF LENGTH(TFN.ID_LIST)$
3980 $TAB$const char8 *tfnid_str;$NL$
3981 $TAB$switch (id) {$NL$
3982 $FOREACH tfnid TFN.ID_LIST$
3983 $TAB$case $tfnid$:$NL$
3984 $TAB$$TAB$tfnid_str = "$tfnid$";$NL$
3985 $TAB$$TAB$break;$NL$
3986 $END$
3987 $TAB$default:$NL$
3988 $TAB$$TAB$tfnid_str = "";$NL$
3989 $TAB$$TAB$break;$NL$
3990 $TAB$}$NL$
3991 $TAB$return(tfnid_str);$NL$
3992$ELSE$
3993 $TAB$return("");$NL$
3994$END$
3995}$NL$
3996#endif /* TOPPERS_ENABLE_TRACE */$NL$
3997
3998
3999$ =====================================================================
4000$ 以下はHRP2からの移植
4001$ =====================================================================
4002
4003$
4004$ メモリオブジェクト管理機能
4005$
4006
4007$
4008$ 統合前のメモリオブジェクトの情
4009報の加工
4010$
4011$ 統合前のメモリオブジェクトの情
4012報に,以下の情
4013報を追加ないしは修正を加
4014$ える.
4015$
4016$ MO.MEMATR[moid]:メモリオブジェクト属性
4017$ TA_NOWRITE属性のメモリリージョンにé…
4018ç½®ã•ã‚Œã‚‹å ´åˆã¯ï¼ŒTA_MEMINIと
4019$ TA_MEMPRSVをクリアする
4020$ MO.ACPTN1[moid]:通常操作1(書込み)のアクセス許可パターン
4021$ MO.MEMATR[moid]にTA_NOWRITEが設定されている場合は0にする.
4022$ MO.CLASS[moid]:メモリオブジェクトをé…
4023ç½®ã™ã‚‹ãŸã‚ã®åˆ†é¡žæŒ‡æ¨™ï¼ˆãƒªãƒ³ã‚«ãŒ
4024$ é…
4025ç½®ã™ã‚‹å ´åˆã®ã¿ï¼‰
4026$ 0:標準のメモリオブジェクト属性,ACPTN1とACPTN2が標準
4027$ (タスクのユーザスタック領域もここに含める)
4028$ 1:標準のメモリオブジェクト属性,ACPTN1またはACPTN2が標準でない
4029$ 2:標準でないメモリオブジェクト属性
4030$ MO.SRPW[moid]:å…
4031±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライト領域か?(リンカがé…
4032ç½®ã™ã‚‹å ´åˆã®ã¿ï¼‰
4033$ MEMATR_MASK:メモリオブジェクト属性が標準であるかを判定する時のマスク
4034$
4035$IF !LENGTH(MEMATR_MASK)$
4036 $MEMATR_MASK = ~TA_SDATA$
4037$END$
4038$FOREACH moid RANGE(1, nummo)$
4039 $domptn = DEFAULT_ACPTN[MO.OSAPID[moid]]$
4040
4041 $IF (MO.MEMATR[moid] & TA_NOWRITE) != 0$
4042 $MO.ACPTN1[moid] = TACP_KERNEL$
4043 $END$
4044
4045 $IF (MO.MEMATR[moid] & (TA_NOREAD | TA_EXEC)) == TA_NOREAD$
4046 $MO.ACPTN2[moid] = TACP_KERNEL$
4047 $END$
4048
4049 $IF MO.MEMATR[moid] & TA_NOREAD$
4050 $MO.ACPTN_R[moid] = TACP_KERNEL$
4051 $ELSE$
4052 $MO.ACPTN_R[moid] = MO.ACPTN2[moid]$
4053 $END$
4054
4055 $MO.ACPTN_W[moid] = MO.ACPTN1[moid]$
4056
4057 $IF MO.MEMATR[moid] & TA_EXEC$
4058 $MO.ACPTN_X[moid] = MO.ACPTN2[moid]$
4059 $ELSE$
4060 $MO.ACPTN_X[moid] = TACP_KERNEL$
4061 $END$
4062
4063 $IF MO.LINKER[moid]$
4064 $MO.SRPW[moid] = 0$
4065 $IF (REG.REGATR[MO.MEMREG[moid]] & TA_NOWRITE) != 0$
4066 $MO.MEMATR[moid] = MO.MEMATR[moid] & ~(TA_MEMINI|TA_MEMPRSV)$
4067 $IF (MO.MEMATR[moid] & TA_EXEC) != 0
4068 && (MO.MEMATR[moid] & MEMATR_MASK) != MEMATR_TEXT
4069 || (MO.MEMATR[moid] & TA_EXEC) == 0
4070 && (MO.MEMATR[moid] & MEMATR_MASK) != MEMATR_RODATA$
4071 $MO.CLASS[moid] = 2$
4072 $ELIF MO.ACPTN2[moid] != domptn$
4073 $MO.CLASS[moid] = 1$
4074$ // ROMでå…
4075±æœ‰ãƒªãƒ¼ãƒ‰ï¼ˆå®Ÿè¡Œï¼‰ã®å ´åˆã¯ãƒ‰ãƒ¡ã‚¤ãƒ³ãªã—にする
4076$ // 次のIF文は必
4077ず真なのでROMの場合はCLASS==1は存在しない
4078 $IF MO.ACPTN2[moid] == TACP_SHARED$
4079 $MO.OSAPID[moid] = TDOM_NONE$
4080 $MO.CLASS[moid] = 0$
4081 $END$
4082 $ELSE$
4083 $MO.CLASS[moid] = 0$
4084 $END$
4085 $ELSE$
4086 $IF MO.TYPE[moid] == TOPPERS_USTACK$
4087 $MO.CLASS[moid] = 0$
4088 $ELIF (MO.MEMATR[moid] & TA_MEMINI) != 0
4089 && (MO.MEMATR[moid] & MEMATR_MASK) != MEMATR_DATA
4090 || (MO.MEMATR[moid] & TA_MEMPRSV) != 0
4091 && (MO.MEMATR[moid] & MEMATR_MASK) != MEMATR_PRSV
4092 || (MO.MEMATR[moid] & (TA_MEMINI|TA_MEMPRSV)) == 0
4093 && (MO.MEMATR[moid] & MEMATR_MASK) != MEMATR_BSS$
4094 $MO.CLASS[moid] = 2$
4095
4096 $ELIF MO.ACPTN1[moid] != domptn$
4097$ // ここに来ることはない
4098 $MO.CLASS[moid] = 1$
4099 $ELIF MO.ACPTN2[moid] != domptn$
4100 $MO.CLASS[moid] = 1$
4101 $IF MO.ACPTN2[moid] == TACP_SHARED$
4102 $MO.SRPW[moid] = 1$
4103 $END$
4104 $ELSE$
4105 $MO.CLASS[moid] = 0$
4106 $END$
4107 $END$
4108
4109$ // 書き込みできない領域はSRPWにしない
4110 $IF (MO.MEMATR[moid] & TA_NOWRITE) == 0$
4111 $IF MO.ACPTN1[moid] == domptn && MO.ACPTN2[moid] != domptn && MO.ACPTN2[moid] == TACP_SHARED$
4112 $MO.SRPW[moid] = 1$
4113 $END$
4114 $END$
4115 $END$
4116$END$
4117
4118$
4119$ 統合前のメモリオブジェクトをソートするためのé…
4120åˆ—を作る
4121$
4122$ MO.ORDER[moid]:メモリオブジェクトをソートするための1次指標
4123$ MO.MEMATR1[moid]:ソートする際に,ACPTN1,ACPTN2よりå…
4124ˆã«ç”¨ã„る属性
4125$ MO.MEMATR2[moid]:ソートする際に,ACPTN1,ACPTN2より後に用いる属性
4126$
4127$FOREACH moid RANGE(1, nummo)$
4128$ // まず,STANDARD_ROMを最初にし,その後はメモリリージョン番号の順に
4129$ // ソートする.
4130 $IF MO.LINKER[moid]$
4131 $IF MO.MEMREG[moid] == STANDARD_ROM$
4132 $memreg = 0$
4133 $ELSE$
4134 $memreg = MO.MEMREG[moid]$
4135 $END$
4136 $ELSE$
4137$ // リンカがé…
4138ç½®ã—ないものは,最後にする.
4139 $memreg = LENGTH(REG.ORDER_LIST) + 1$
4140 $END$
4141 $order = memreg$
4142
4143$ // 次に,é…
4144ç½®ã‚¿ã‚¤ãƒ—によってソートする.
4145 $IF MO.TYPE[moid] == TOPPERS_USTACK$
4146$ // ユーザスタック領域のé…
4147ç½®ã‚¿ã‚¤ãƒ—の決定.
4148 $type = 1$
4149 $ELIF MO.ACPTN1[moid] == 0 && MO.ACPTN2[moid] == TACP_SHARED
4150 && (MO.MEMATR[moid] & TA_SDATA) != 0$
4151$ // å…
4152±æœ‰ãƒªãƒ¼ãƒ‰ãƒ»ãƒ©ã‚¤ãƒˆä¸å¯ã®ã‚·ãƒ§ãƒ¼ãƒˆãƒ‡ãƒ¼ã‚¿é ˜åŸŸã®é…
4153ç½®ã‚¿ã‚¤ãƒ—の決定.
4154$ // カーネルドメインのå…
4155±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライト領域もここに含まれる.
4156 $type = 4$
4157 $ELIF MO.LINKER[moid] && MO.SRPW[moid]$
4158$ // å…
4159±æœ‰ãƒªãƒ¼ãƒ‰å°‚有ライト領域のé…
4160ç½®ã‚¿ã‚¤ãƒ—の決定.
4161 $IF (MO.MEMATR[moid] & TA_SDATA) != 0$
4162 $type = 5$
4163 $ELSE$
4164 $type = 3$
4165 $END$
4166 $ELIF MO.OSAPID[moid] == TDOM_KERNEL$
4167$ // カーネルドメインのé…
4168ç½®ã‚¿ã‚¤ãƒ—の決定.
4169 $IF (MO.MEMATR[moid] & TA_SDATA) != 0$
4170 $type = 6$
4171 $ELSE$
4172 $type = 0$
4173 $END$
4174 $ELIF MO.OSAPID[moid] == TDOM_NONE$
4175$ // 無所属のé…
4176ç½®ã‚¿ã‚¤ãƒ—の決定.
4177 $IF MO.LINKER[moid] && MO.CLASS[moid] == 0$
4178 $IF (MO.MEMATR[moid] & TA_SDATA) != 0$
4179 $type = 7$
4180 $ELSE$
4181 $type = 8$
4182 $END$
4183 $ELSE$
4184 $IF (MO.MEMATR[moid] & TA_SDATA) != 0$
4185 $type = 6$
4186 $ELSE$
4187 $type = 2$
4188 $END$
4189 $END$
4190 $ELSE$
4191$ // ユーザドメインのé…
4192ç½®ã‚¿ã‚¤ãƒ—の決定.
4193 $IF (MO.MEMATR[moid] & TA_SDATA) != 0$
4194 $type = 6$
4195 $ELSE$
4196 $type = 2$
4197 $END$
4198 $END$
4199 $order = (order << 4) + type$
4200
4201$ // 次に,保護ドメインによってソートする.
4202$ // ユーザドメインの数が32個以下であることを仮定している.
4203 $IF MO.OSAPID[moid] == TDOM_KERNEL$
4204 $domain = 0$
4205 $ELIF MO.OSAPID[moid] == TDOM_NONE$
4206 $domain = 63$
4207 $ELSE$
4208 $domain = MO.OSAPID[moid]$
4209 $END$
4210 $order = (order << 6) + domain$
4211
4212$ // 次に,メモリオブジェクトをé…
4213ç½®ã™ã‚‹ãŸã‚ã®åˆ†é¡žæŒ‡æ¨™ã«ã‚ˆã£ã¦é…
4214ç½®ã™ã‚‹ï¼Ž
4215 $class = 0$
4216 $IF MO.LINKER[moid] && MO.TYPE[moid] != TOPPERS_USTACK$
4217 $IF (REG.REGATR[MO.MEMREG[moid]] & TA_NOWRITE) != 0$
4218 $IF MO.OSAPID[moid] == TDOM_NONE$
4219$ // TA_NOWRITE属性のメモリリージョンの無所属は,CLASSの逆順
4220$ // にé…
4221ç½®ã™ã‚‹ï¼Ž
4222 $class = 2 - MO.CLASS[moid]$
4223 $ELSE$
4224$ // カーネルドメインとユーザドメインは,CLASSの順にé…
4225ç½®ã™ã‚‹ï¼Ž
4226 $class = MO.CLASS[moid]$
4227 $END$
4228 $ELSE$
4229 $IF MO.OSAPID[moid] == TDOM_KERNEL || MO.OSAPID[moid] == TDOM_NONE$
4230$ // TA_NOWRITE属性でないメモリリージョンのカーネルドメイン
4231$ // と無所属は,CLASSの逆順にé…
4232ç½®ã™ã‚‹ï¼Ž
4233 $class = 2 - MO.CLASS[moid]$
4234 $ELSE$
4235$ // ユーザドメインは,CLASSの順にé…
4236ç½®ã™ã‚‹ï¼Ž
4237 $class = MO.CLASS[moid]$
4238 $END$
4239 $END$
4240 $END$
4241 $order = (order << 2) + class$
4242
4243$ // 結果をMO.ORDER[moid]に格納する
4244 $MO.ORDER[moid] = order$
4245
4246$ // MO.MEMATR1[moid]とMO.MEMATR2[moid]を設定する
4247 $IF MO.LINKER[moid]$
4248 $IF (REG.REGATR[MO.MEMREG[moid]] & TA_NOWRITE) != 0$
4249 $MO.MEMATR1[moid] = MO.MEMATR[moid] & ~TA_EXEC$
4250 $MO.MEMATR2[moid] = MO.MEMATR[moid] & TA_EXEC$
4251$ // TA_EXECが設定されている方を前にé…
4252ç½®ã™ã‚‹
4253 $MO.MEMATR2[moid] = MO.MEMATR2[moid] ^ TA_EXEC$
4254 $ELSE$
4255 $MO.MEMATR1[moid] = MO.MEMATR[moid] & ~(TA_MEMINI|TA_MEMPRSV)$
4256 $MO.MEMATR2[moid] = MO.MEMATR[moid] & (TA_MEMINI|TA_MEMPRSV)$
4257$ // TA_MEMINIが設定されている方を前にé…
4258ç½®ã™ã‚‹
4259 $MO.MEMATR2[moid] = MO.MEMATR2[moid] ^ TA_MEMINI$
4260 $END$
4261 $END$
4262$END$
4263
4264$
4265$ メモリオブジェクトをソートするための比較関数
4266$
4267$IF !ISFUNCTION("MO_COMPARE")$
4268$FUNCTION MO_COMPARE$
4269$ まずは,MO.ORDERで比較する.
4270 $RESULT = MO.ORDER[ARGV[1]] - MO.ORDER[ARGV[2]]$
4271 $IF (RESULT == 0) && MO.LINKER[ARGV[1]]$
4272$ // MO.ORDERが同じで,リンカのé…
4273ç½®å¯¾è±¡ã®å ´åˆã¯ï¼Œã•ã‚‰ã«ã‚½ãƒ¼ãƒˆã™ã‚‹ï¼Ž
4274 $_moid1 = ARGV[1]$
4275 $_moid2 = ARGV[2]$
4276 $IF MO.TYPE[_moid1] == TOPPERS_USTACK$
4277$ // ユーザスタック領域の場合
4278$ // MO.STKORDERでソートする.
4279 $RESULT = MO.STKORDER[_moid1] - MO.STKORDER[_moid2]$
4280 $ELIF MO.MEMATR1[_moid1] != MO.MEMATR1[_moid2]$
4281$ // MO.MEMATR1が異なれば,それでソートする.
4282 $RESULT = MO.MEMATR1[_moid1] - MO.MEMATR1[_moid2]$
4283 $ELIF MO.ACPTN1[_moid1] != MO.ACPTN1[_moid2]$
4284$ // MO.ACPTN1が異なれば,それでソートする.
4285 $RESULT = MO.ACPTN1[_moid1] - MO.ACPTN1[_moid2]$
4286 $ELIF MO.ACPTN2[_moid1] != MO.ACPTN2[_moid2]$
4287$ // MO.ACPTN2が異なれば,それでソートする.
4288 $RESULT = MO.ACPTN2[_moid1] - MO.ACPTN2[_moid2]$
4289 $ELIF MO.MEMATR2[_moid1] != MO.MEMATR2[_moid2]$
4290$ // MO.MEMATR2が異なれば,それでソートする.
4291 $RESULT = MO.MEMATR2[_moid1] - MO.MEMATR2[_moid2]$
4292 $ELSE$
4293 $RESULT = 0$
4294 $END$
4295 $END$
4296$END$
4297$END$
4298
4299$
4300$ メモリオブジェクトのソート
4301$
4302$ 最初にMO.ORDERでソートしておくことで,MO_COMPAREを使ったソートが効率
4303$ 化されることを期待
4304している.
4305$
4306$MO_ORDER = SORT(RANGE(1, nummo), "MO.ORDER")$
4307$MO_ORDER = LSORT(MO_ORDER, "MO_COMPARE")$
4308
4309$
4310$ メモリオブジェクトの統合処理
4311$
4312$ MO.SEFLAG[moid]:以下のビットのビット毎論理和に設定する.
4313$ 0x01:セクションのå…
4314ˆé ­
4315$ 0x02:セクションの最後
4316$ 0x04:メモリオブジェクトのå…
4317ˆé ­
4318$ 0x08:メモリオブジェクトの最後
4319$ 0x10:メモリ保護単位のå…
4320ˆé ­
4321$ 0x20:メモリ保護単位の最後
4322$ 0x40:メモリリージョンのå…
4323ˆé ­
4324$ 0x80:メモリリージョンの最後
4325$ 0x100:å…
4326±æœ‰ãƒªãƒ¼ãƒ‰å°‚用ライト領域å…
4327¨ä½“のå…
4328ˆé ­
4329$ 0x200:å…
4330±æœ‰ãƒªãƒ¼ãƒ‰å°‚用ライト領域å…
4331¨ä½“の最後
4332$ 0x400:ショートデータセクションのå…
4333ˆé ­
4334$ MO.MOEND[moid]:統合後のメモリオブジェクトの最後のmoid(統合後の
4335$ メモリオブジェクトのå…
4336ˆé ­ã®moidに対して設定)
4337$ MO_SECTION_LIST:セクションのå…
4338ˆé ­ã®ãƒªã‚¹ãƒˆ
4339$ MO_START_LIST:メモリオブジェクトのå…
4340ˆé ­ã®ãƒªã‚¹ãƒˆ
4341$ MO_START_LIST_NOLINKER:リンカがé…
4342ç½®ã—ないメモリオブジェクトのå…
4343ˆé ­ã®ãƒªã‚¹ãƒˆ
4344$ MO_MPROTECT_LIST:メモリ保護単位のå…
4345ˆé ­ã®ãƒªã‚¹ãƒˆ
4346$
4347$MO_SECTION_LIST = {}$
4348$MO_START_LIST = {}$
4349$MO_START_LIST_NOLINKER = {}$
4350$MO_MPROTECT_LIST = {}$
4351$i = 0$
4352$FOREACH moid MO_ORDER$
4353 $IF i == 0$
4354 $MO.SEFLAG[moid] = 0x15$
4355 $mostart = moid$
4356 $IF MO.LINKER[moid]$
4357 $MO.SEFLAG[moid] = MO.SEFLAG[moid] | 0x40$
4358 $END$
4359 $ELSE$
4360 $IF MO.ORDER[moid] != MO.ORDER[prev_moid]
4361 || (MO.TYPE[moid] & TOPPERS_ATTSEC) == 0
4362 || (MO.TYPE[prev_moid] & TOPPERS_ATTSEC) == 0
4363 || (MO.MEMATR[moid] & ~(TA_MEMINI|TA_MEMPRSV))
4364 != (MO.MEMATR[prev_moid] & ~(TA_MEMINI|TA_MEMPRSV))
4365 || MO.ACPTN1[moid] != MO.ACPTN1[prev_moid]
4366 || MO.ACPTN2[moid] != MO.ACPTN2[prev_moid]$
4367 $MO.SEFLAG[moid] = 0x15$
4368 $MO.SEFLAG[prev_moid] = MO.SEFLAG[prev_moid] | 0x2a$
4369 $MO.MOEND[mostart] = prev_moid$
4370 $mostart = moid$
4371 $ELIF MO.MEMATR[moid] != MO.MEMATR[prev_moid]$
4372 $MO.SEFLAG[moid] = 0x05$
4373 $MO.SEFLAG[prev_moid] = MO.SEFLAG[prev_moid] | 0x0a$
4374 $MO.MOEND[mostart] = prev_moid$
4375 $mostart = moid$
4376 $ELSE$
4377 $MO.SEFLAG[moid] = 0$
4378 $END$
4379
4380 $IF MO.LINKER[prev_moid] && MO.LINKER[moid]
4381 && MO.MEMREG[prev_moid] != MO.MEMREG[moid]$
4382 $MO.SEFLAG[moid] = MO.SEFLAG[moid] | 0x40$
4383 $MO.SEFLAG[prev_moid] = MO.SEFLAG[prev_moid] | 0x80$
4384 $ELIF MO.LINKER[prev_moid] && !MO.LINKER[moid]$
4385 $MO.SEFLAG[prev_moid] = MO.SEFLAG[prev_moid] | 0x80$
4386 $END$
4387
4388 $IF !(MO.LINKER[prev_moid] && MO.SRPW[prev_moid])
4389 && (MO.LINKER[moid] && MO.SRPW[moid])$
4390 $MO.SEFLAG[moid] = MO.SEFLAG[moid] | 0x100$
4391 $END$
4392 $IF (MO.LINKER[prev_moid] && MO.SRPW[prev_moid])
4393 && !(MO.LINKER[moid] && MO.SRPW[moid])$
4394 $MO.SEFLAG[prev_moid] = MO.SEFLAG[prev_moid] | 0x200$
4395 $END$
4396 $IF !(MO.LINKER[prev_moid] && (MO.MEMATR[prev_moid] & TA_SDATA) != 0)
4397 && (MO.LINKER[moid] && (MO.MEMATR[moid] & TA_SDATA) != 0)$
4398 $MO.SEFLAG[moid] = MO.SEFLAG[moid] | 0x400$
4399 $END$
4400 $END$
4401
4402$ // MO_SECTION_LIST,MO_START_LIST,MO_MPROTECT_LISTへの追加
4403 $IF (MO.SEFLAG[moid] & 0x01) != 0$
4404 $MO_SECTION_LIST = APPEND(MO_SECTION_LIST, moid)$
4405 $END$
4406 $IF (MO.SEFLAG[moid] & 0x04) != 0$
4407 $MO_START_LIST = APPEND(MO_START_LIST, moid)$
4408 $IF (!MO.LINKER[moid])$
4409 $MO_START_LIST_NOLINKER = APPEND(MO_START_LIST_NOLINKER, moid)$
4410 $END$
4411 $END$
4412 $IF (MO.SEFLAG[moid] & 0x10) != 0$
4413 $MO_MPROTECT_LIST = APPEND(MO_MPROTECT_LIST, moid)$
4414 $END$
4415
4416 $prev_moid = moid$
4417 $i = i + 1$
4418$END$
4419$MO.SEFLAG[prev_moid] = MO.SEFLAG[prev_moid] | 0x2a$
4420$MO.MOEND[mostart] = prev_moid$
4421$IF MO.LINKER[prev_moid]$
4422 $MO.SEFLAG[prev_moid] = MO.SEFLAG[prev_moid] | 0x80$
4423$END$
4424$IF MO.LINKER[prev_moid] && MO.SRPW[prev_moid]$
4425 $MO.SEFLAG[prev_moid] = MO.SEFLAG[prev_moid] | 0x200$
4426$END$
4427
4428$
4429$ メモリオブジェクトのラベルの生成
4430$
4431$ MO.SLABEL[moid]:セクションのラベル
4432$ MO.ILABEL[moid]:初期化データ領域のラベル
4433$ MO.MLABEL[moid]:メモリオブジェクトのラベル
4434$ MO.PLABEL[moid]:メモリ保護単位のラベル
4435$ DATASEC_LIST:dataセクションのリスト
4436$ BSSSEC_LIST:bssセクションのリスト
4437$
4438$DATASEC_LIST = {}$
4439$BSSSEC_LIST = {}$
4440$FOREACH moid MO_ORDER$
4441 $IF MO.LINKER[moid]$
4442 $IF MO.MEMREG[moid] == STANDARD_ROM || MO.MEMREG[moid] == STANDARD_RAM$
4443 $reglabel = ""$
4444 $ELSE$
4445 $reglabel = FORMAT("%s_", REG.REGNAME[MO.MEMREG[moid]])$
4446 $END$
4447 $domlabel = OSAP.LABEL[MO.OSAPID[moid]]$
4448
4449 $ilabel = ""$
4450 $plabel = ""$
4451 $IF (REG.REGATR[MO.MEMREG[moid]] & TA_NOWRITE) != 0$
4452 $IF (MO.MEMATR[moid] & TA_EXEC) != 0$
4453 $typelabel = "text"$
4454 $ELSE$
4455 $typelabel = "rodata"$
4456 $END$
4457 $acptn12 = FORMAT("%x", +MO.ACPTN2[moid])$
4458 $ELSE$
4459 $IF (MO.MEMATR[moid] & TA_MEMINI) != 0$
4460 $IF (MO.MEMATR[moid] & TA_SDATA) != 0$
4461 $typelabel = "sdata"$
4462 $ELSE$
4463 $typelabel = "data"$
4464 $END$
4465 $IF (MO.SEFLAG[moid] & 0x01) != 0$
4466 $DATASEC_LIST = APPEND(DATASEC_LIST, moid)$
4467 $END$
4468 $ilabel = FORMAT("%si%s_%s", reglabel, typelabel, domlabel)$
4469 $ELIF (MO.MEMATR[moid] & TA_MEMPRSV) != 0$
4470 $IF (MO.MEMATR[moid] & TA_SDATA) != 0$
4471 $typelabel = "sprsv"$
4472 $ELSE$
4473 $typelabel = "prsv"$
4474 $END$
4475 $ELSE$
4476 $IF (MO.MEMATR[moid] & TA_SDATA) != 0$
4477 $typelabel = "sbss"$
4478 $ELSE$
4479 $typelabel = "bss"$
4480 $END$
4481 $IF (MO.SEFLAG[moid] & 0x01) != 0$
4482 $BSSSEC_LIST = APPEND(BSSSEC_LIST, moid)$
4483 $END$
4484 $END$
4485 $acptn12 = FORMAT("%x_%x", +MO.ACPTN1[moid], +MO.ACPTN2[moid])$
4486 $IF (MO.MEMATR[moid] & TA_SDATA) != 0$
4487 $plabel = FORMAT("%ssram_%s", reglabel, domlabel)$
4488 $ELSE$
4489 $plabel = FORMAT("%sram_%s", reglabel, domlabel)$
4490 $END$
4491 $END$
4492 $label = FORMAT("%s%s_%s", reglabel, typelabel, domlabel)$
4493 $IF MO.TYPE[moid] == TOPPERS_USTACK$
4494 $MO.SLABEL[moid] = REGEX_REPLACE(MO.SECTION[moid], "\\.", "")$
4495 $MO.MLABEL[moid] = REGEX_REPLACE(MO.SECTION[moid], "\\.", "")$
4496 $MO.PLABEL[moid] = ""$
4497 $ELIF MO.CLASS[moid] == 0$
4498 $MO.SLABEL[moid] = label$
4499 $IF !EQ(ilabel, "")$
4500 $MO.ILABEL[moid] = ilabel$
4501 $END$
4502 $MO.MLABEL[moid] = FORMAT("%s__std", label)$
4503 $IF !EQ(plabel, "")$
4504 $MO.PLABEL[moid] = plabel$
4505 $END$
4506 $ELIF MO.CLASS[moid] == 1$
4507 $MO.SLABEL[moid] = FORMAT("%s_%s", label, acptn12)$
4508 $IF !EQ(ilabel, "")$
4509 $MO.ILABEL[moid] = FORMAT("%s_%s", ilabel, acptn12)$
4510 $END$
4511 $MO.MLABEL[moid] = FORMAT("%s__%s", label, acptn12)$
4512 $IF !EQ(plabel, "")$
4513 $MO.PLABEL[moid] = FORMAT("%s_%s", plabel, acptn12)$
4514 $END$
4515 $ELSE$
4516 $MO.SLABEL[moid] = FORMAT("%s_%s_%x", label,
4517 acptn12, +MO.MEMATR[moid])$
4518 $IF !EQ(ilabel, "")$
4519 $MO.ILABEL[moid] = FORMAT("%s_%s_%x", ilabel,
4520 acptn12, +MO.MEMATR[moid])$
4521 $END$
4522 $MO.MLABEL[moid] = FORMAT("%s__%s_%x", label,
4523 acptn12, +MO.MEMATR[moid])$
4524 $IF !EQ(plabel, "")$
4525 $MO.PLABEL[moid] = FORMAT("%s_%s_%x", plabel,
4526 acptn12, MO.MEMATR[moid] & ~(TA_MEMINI|TA_MEMPRSV))$
4527 $END$
4528 $END$
4529 $END$
4530$END$
4531
4532$
4533$ =====================================================================
4534$ 仮のメモリ構成・初期化ファイルの生成
4535$ =====================================================================
4536$FILE "kernel_mem2.c"$
4537#include "kernel_int.h"$NL$
4538#include "Os_Lcfg.h"$NL$
4539
4540#ifndef TOPPERS_EMPTY_LABEL$NL$
4541#define TOPPERS_EMPTY_LABEL(x, y) x y[0]$NL$
4542#endif$NL$
4543
4544/*$NL$
4545$SPC$* Include Directives (#include)$NL$
4546$SPC$*/$NL$
4547$NL$
4548$INCLUDES$
4549$NL$
4550
4551$
4552$ 仮メモリオブジェクト初期化ブロックの生成
4553$
4554$IF !OMIT_STANDARD_MEMINIB$
4555
4556$ // アドレス0を置く領域
4557 $tsize_meminib = 1$
4558 $FOREACH moid MO_START_LIST$
4559$ // メモリオブジェクトのå…
4560ˆé ­ç•ªåœ°ã‚’置く領域
4561 $tsize_meminib = tsize_meminib + 1$
4562 $IF !MO.LINKER[moid]$
4563$ // リンカがé…
4564ç½®ã—ないメモリオブジェクトは最終番地も必
4565要
4566 $tsize_meminib = tsize_meminib + 1$
4567 $ELIF (MO.SEFLAG[MO.MOEND[moid]] & 0x80) != 0$
4568$ // メモリリージョンの最後のメモリオブジェクトは最終番地も必
4569要
4570 $tsize_meminib = tsize_meminib + 1$
4571 $END$
4572 $END$
4573
4574 const uint32 tnum_meminib = $tsize_meminib$U;$NL$
4575 $NL$
4576
4577 void *const memtop_table[$tsize_meminib$] = {
4578 $IF LENGTH(MO_START_LIST_NOLINKER)$
4579 $NL$
4580 $JOINEACH moid MO_START_LIST_NOLINKER ",\n"$
4581 $TAB$(void *)($MO.BASE[moid]$) /* $MO.ACPTN_R[moid]$, $MO.ACPTN_W[moid]$, $MO.ACPTN_X[moid]$ */
4582 $END$$NL$
4583 $ELSE$
4584 $SPC$0$SPC$
4585 $END$
4586 };$NL$
4587 $NL$
4588
4589 const MEMINIB meminib_table[$tsize_meminib$] =
4590 $SPC${{ TA_NULL, 0U, 0U, 0U }};$NL$
4591 $NL$
4592$END$
4593
4594$
4595$ dataセクション初期化ブロックの生成
4596$
4597$IF !OMIT_STANDARD_DATASECINIB$
4598 /*$NL$
4599 $SPC$* Data Section Management Functions$NL$
4600 $SPC$*/$NL$
4601 $NL$
4602
4603$ // dataセクションの数
4604 #define TNUM_DATASEC $IF !OMIT_IDATA$$LENGTH(DATASEC_LIST)$$ELSE$0$END$$NL$
4605 $NL$
4606
4607 $IF ISFUNCTION("DEFINE_CONST_VAR")$
4608 $DEFINE_CONST_VAR("const uint32", "tnum_datasec")$ = TNUM_DATASEC;$NL$
4609 $ELSE$
4610 const uint32 tnum_datasec = TNUM_DATASEC;$NL$
4611 $END$
4612 $NL$
4613
4614$ // dataセクション初期化ブロック
4615 $IF !OMIT_IDATA && LENGTH(DATASEC_LIST)$
4616 $IF ISFUNCTION("DEFINE_CONST_VAR")$
4617 $DEFINE_CONST_VAR("const DATASECINIB", "datasecinib_table[TNUM_DATASEC]")$ =
4618 $ELSE$
4619 const DATASECINIB datasecinib_table[TNUM_DATASEC] =
4620 $END$
4621 $SPC${{ 0U, 0U, 0U }};$NL$
4622 $ELSE$
4623 TOPPERS_EMPTY_LABEL(const DATASECINIB, datasecinib_table);$NL$
4624 $NL$
4625 $END$$NL$
4626$END$
4627
4628$
4629$ bssセクション初期化ブロックの生成
4630$
4631$IF !OMIT_STANDARD_BSSSECINIB$
4632 /*$NL$
4633 $SPC$* BSS Section Management Functions$NL$
4634 $SPC$*/$NL$
4635 $NL$
4636
4637$ // bssセクションの数
4638 #define TNUM_BSSSEC $LENGTH(BSSSEC_LIST)$$NL$
4639 $NL$
4640
4641 const uint32 tnum_bsssec = TNUM_BSSSEC;$NL$
4642 $NL$
4643
4644$ // bssセクション初期化ブロック
4645 $IF LENGTH(BSSSEC_LIST)$
4646 const BSSSECINIB bsssecinib_table[TNUM_BSSSEC] = {{0U, 0U}};$NL$
4647 $ELSE$
4648 TOPPERS_EMPTY_LABEL(const BSSSECINIB, bsssecinib_table);$NL$
4649 $END$$NL$
4650$END$
4651
4652$ =====================================================================
4653$ HRP2からの移植ここまで
4654$ =====================================================================
4655
4656$ ターゲット依存部で必
4657要なMPUINFOBを出力する
4658$GENERATE_TARGET_MPUINFOB()$
4659
4660$ タスクスタック領域をextern宣言する(kernel_common.tf)
4661$GENERATE_EXPORT_TSK_STK()$
4662
4663$ タスクをextern宣言する(kernel_common.tf)
4664$EXTERN_TSK()$
4665
4666$ タスク管理ブロックをextern宣言する(kernel_common.tf)
4667$EXTERN_TCB()$
4668
4669$ OSAP管理ブロックをextern宣言する(kernel_common.tf)
4670$EXTERN_OSAPCB()$
4671
4672$ タスク初期化ブロックを出力する(kernel_common.tf)
4673$GENERATE_TINIB_TABLE()$
4674
4675$ OSアプリケーション初期化ブロックを出力する(kernel_common.tf)
4676$GENERATE_OSAPINIB_TABLE()$
4677
4678$ =====================================================================
4679$ パス3, パス4に渡す情
4680報の生成
4681$ =====================================================================
4682
4683$FILE "cfg2_out.tf"$
4684$$ cfg2_out.tf$NL$
4685$NL$
4686
4687$ STANDARD_ROM,STANDARD_RAMの出力
4688$$STANDARD_ROM = $STANDARD_ROM$$$$NL$
4689$$STANDARD_RAM = $STANDARD_RAM$$$$NL$
4690$NL$
4691
4692$ REG_ORDERの出力
4693$$REG_ORDER = { $REG_ORDER$ }$$$NL$
4694$NL$
4695
4696$ REG.*の出力
4697$FOREACH reg REG.ORDER_LIST$
4698 $$REG.REGNAME[$reg$] = $REG.REGION[reg]$$$$NL$
4699 $$REG.REGATR[$reg$] = VALUE($ESCSTR(REG.REGATR[reg])$,
4700 $SPC$$+REG.REGATR[reg]$)$$$NL$
4701 $$REG.BASE[$reg$] = VALUE($ESCSTR(REG.BASE[reg])$,
4702 $SPC$$+REG.BASE[reg]$)$$$NL$
4703 $$REG.SIZE[$reg$] = VALUE($ESCSTR(REG.SIZE[reg])$,
4704 $SPC$$+REG.SIZE[reg]$)$$$NL$
4705 $NL$
4706$END$
4707
4708$ MO_ORDER,MO_SECTION_LIST,MO_START_LIST,MO_START_LIST_NOLINKER,
4709$ MO_MPROTECT_LISTの出力
4710$$MO_ORDER = { $MO_ORDER$ }$$$NL$
4711$NL$
4712$$MO_SECTION_LIST = { $MO_SECTION_LIST$ }$$$NL$
4713$NL$
4714$$MO_START_LIST = { $MO_START_LIST$ }$$$NL$
4715$NL$
4716$$MO_START_LIST_NOLINKER = { $MO_START_LIST_NOLINKER$ }$$$NL$
4717$NL$
4718$$MO_MPROTECT_LIST = { $MO_MPROTECT_LIST$ }$$$NL$
4719$NL$
4720
4721$ tsize_meminibの出力
4722$IF !OMIT_STANDARD_MEMINIB$
4723 $$tsize_meminib = $tsize_meminib$$$$NL$
4724 $NL$
4725$END$
4726
4727$ MO_SECTION_LIST,DATASEC_LIST,BSSSEC_LISTの出力
4728$$MO_SECTION_LIST = { $MO_SECTION_LIST$ }$$$NL$
4729$NL$
4730$$DATASEC_LIST = { $DATASEC_LIST$ }$$$NL$
4731$NL$
4732$$BSSSEC_LIST = { $BSSSEC_LIST$ }$$$NL$
4733$NL$
4734
4735$ MO.*の出力
4736$FOREACH moid MO_ORDER$
4737 $$MO.TYPE[$moid$] = VALUE($ESCSTR(MO.TYPE[moid])$,
4738 $SPC$$+MO.TYPE[moid]$)$$$NL$
4739 $IF MO.TYPE[moid] == TOPPERS_ATTMOD$
4740 $$MO.MODULE[$moid$] = $ESCSTR(MO.MODULE[moid])$$$$NL$
4741 $ELIF MO.TYPE[moid] == TOPPERS_ATTMEM$
4742 $$MO.BASE[$moid$] = $ESCSTR(MO.BASE[moid])$$$$NL$
4743 $$MO.SIZE[$moid$] = VALUE($ESCSTR(MO.SIZE[moid])$,
4744 $SPC$$+MO.SIZE[moid]$)$$$NL$
4745 $IF LENGTH(MO.PADDR[moid])$
4746 $$MO.PADDR[$moid$] = VALUE($ESCSTR(MO.PADDR[moid])$,
4747 $SPC$$+MO.PADDR[moid]$)$$$NL$
4748 $END$
4749 $ELIF MO.TYPE[moid] == TOPPERS_USTACK$
4750 $$MO.TSKID[$moid$] = VALUE($ESCSTR(MO.TSKID[moid])$,
4751 $SPC$$+MO.TSKID[moid]$)$$$NL$
4752 $IF !MO.LINKER[moid]$
4753 $$MO.BASE[$moid$] = $ESCSTR(MO.BASE[moid])$$$$NL$
4754 $$MO.SIZE[$moid$] = VALUE($ESCSTR(MO.SIZE[moid])$,
4755 $SPC$$+MO.SIZE[moid]$)$$$NL$
4756 $ELSE$
4757 $$MO.SIZE[$moid$] = VALUE($ESCSTR(MO.SIZE[moid])$,
4758 $SPC$$+MO.SIZE[moid]$)$$$NL$
4759 $END$
4760 $IF LENGTH(MO.STKORDER[moid])$
4761 $$MO.STKORDER[$moid$] = $+MO.STKORDER[moid]$$$$NL$
4762 $END$
4763 $END$
4764 $$MO.LINKER[$moid$] = $MO.LINKER[moid]$$$$NL$
4765 $$MO.OSAPID[$moid$] = VALUE($ESCSTR(MO.OSAPID[moid])$,
4766 $SPC$$+MO.OSAPID[moid]$)$$$NL$
4767 $IF MO.LINKER[moid]$
4768 $$MO.MEMREG[$moid$] = $MO.MEMREG[moid]$$$$NL$
4769 $$MO.SECTION[$moid$] = $ESCSTR(MO.SECTION[moid])$$$$NL$
4770 $$MO.CLASS[$moid$] = $MO.CLASS[moid]$$$$NL$
4771 $$MO.SRPW[$moid$] = $MO.SRPW[moid]$$$$NL$
4772 $$MO.MEMATR1[$moid$] = $MO.MEMATR1[moid]$$$$NL$
4773 $$MO.MEMATR2[$moid$] = $MO.MEMATR2[moid]$$$$NL$
4774 $END$
4775 $$MO.MEMATR[$moid$] = VALUE($ESCSTR(MO.MEMATR[moid])$,
4776 $SPC$$+MO.MEMATR[moid]$)$$$NL$
4777 $$MO.ACPTN1[$moid$] = VALUE($ESCSTR(MO.ACPTN1[moid])$,
4778 $SPC$$+MO.ACPTN1[moid]$)$$$NL$
4779 $$MO.ACPTN2[$moid$] = VALUE($ESCSTR(MO.ACPTN2[moid])$,
4780 $SPC$$+MO.ACPTN2[moid]$)$$$NL$
4781 $$MO.ACPTN_R[$moid$] = VALUE($ESCSTR(MO.ACPTN_R[moid])$,
4782 $SPC$$+MO.ACPTN_R[moid]$)$$$NL$
4783 $$MO.ACPTN_W[$moid$] = VALUE($ESCSTR(MO.ACPTN_W[moid])$,
4784 $SPC$$+MO.ACPTN_W[moid]$)$$$NL$
4785 $$MO.ACPTN_X[$moid$] = VALUE($ESCSTR(MO.ACPTN_X[moid])$,
4786 $SPC$$+MO.ACPTN_X[moid]$)$$$NL$
4787 $IF LENGTH(MO.TEXT_LINE[moid])$
4788 $$MO.TEXT_LINE[$moid$] = VALUE($ESCSTR(MO.TEXT_LINE[moid])$,
4789 $SPC$$+MO.TEXT_LINE[moid]$)$$$NL$
4790 $END$
4791 $IF LENGTH(MO.ILABEL[moid])$
4792 $$MO.ILABEL[$moid$] = $ESCSTR(MO.ILABEL[moid])$$$$NL$
4793 $END$
4794 $$MO.ORDER[$moid$] = $MO.ORDER[moid]$$$$NL$
4795 $$MO.SEFLAG[$moid$] = 0x$FORMAT("%x", +MO.SEFLAG[moid])$$$$NL$
4796 $IF LENGTH(MO.MOEND[moid])$
4797 $$MO.MOEND[$moid$] = $MO.MOEND[moid]$$$$NL$
4798 $END$
4799 $$MO.SLABEL[$moid$] = $ESCSTR(MO.SLABEL[moid])$$$$NL$
4800 $$MO.ILABEL[$moid$] = $ESCSTR(MO.ILABEL[moid])$$$$NL$
4801 $$MO.MLABEL[$moid$] = $ESCSTR(MO.MLABEL[moid])$$$$NL$
4802 $$MO.PLABEL[$moid$] = $ESCSTR(MO.PLABEL[moid])$$$$NL$
4803 $NL$
4804$END$
4805
4806$$OSAP.ID_LIST = {
4807$JOINEACH osapid OSAP.ID_LIST ","$
4808 VALUE("$osapid$", $+osapid$)
4809$END$
4810}$$$NL$
4811$NL$
4812$FOREACH osapid OSAP.ID_LIST$
4813 $$OSAP.BTMP[$+osapid$] = $OSAP.BTMP[osapid]$$$$NL$
4814 $$OSAP.RESTARTTASK[$+osapid$] = VALUE($ESCSTR(OSAP.RESTARTTASK[osapid])$, $+OSAP.RESTARTTASK[osapid]$)$$$NL$
4815 $$DEFAULT_ACPTN[$+osapid$] = VALUE($ESCSTR(DEFAULT_ACPTN[osapid])$,
4816 $SPC$$+DEFAULT_ACPTN[osapid]$)$$$NL$
4817$END$
4818$NL$
4819$$DEFAULT_ACPTN[TDOM_KERNEL] = $DEFAULT_ACPTN[TDOM_KERNEL]$$$$NL$
4820$$DEFAULT_ACPTN[TDOM_NONE] = $DEFAULT_ACPTN[TDOM_NONE]$$$$NL$
4821$NL$
4822
4823$$TSK.ID_LIST = {
4824$JOINEACH tskid TSK.ID_LIST ","$
4825 VALUE("$tskid$", $+tskid$)
4826$END$
4827}$$$NL$
4828$NL$
4829$FOREACH tskid TSK.ID_LIST$
4830 $$TSK.OSAPID[$+tskid$] = VALUE("$TSK.OSAPID[tskid]$", $+TSK.OSAPID[tskid]$)$$$NL$
4831 $$TSK.ACSBTMP[$+tskid$] = $TSK.ACSBTMP[tskid]$$$$NL$
4832 $$TSK.ASTPTN[$+tskid$] = $TSK.ASTPTN[tskid]$$$$NL$
4833 $IF LENGTH(TSK.INRESPRI[tskid])$
4834 $$TSK.INRESPRI[$+tskid$] = $TSK.INRESPRI[tskid]$$$$NL$
4835 $END$
4836 $$TSK.TINIB_USTKSZ[$+tskid$] = $ESCSTR(TSK.TINIB_USTKSZ[tskid])$$$$NL$
4837 $$TSK.TINIB_USTK [$+tskid$] = $ESCSTR(TSK.TINIB_USTK [tskid])$$$$NL$
4838 $$TSK.TINIB_SSTKSZ[$+tskid$] = $ESCSTR(TSK.TINIB_SSTKSZ[tskid])$$$$NL$
4839 $$TSK.TINIB_SSTK [$+tskid$] = $ESCSTR(TSK.TINIB_SSTK [tskid])$$$$NL$
4840 $IF LENGTH(TSK.SHARED_USTK_ID[tskid])$
4841 $$TSK.SHARED_USTK_ID[$+tskid$] = $TSK.SHARED_USTK_ID[tskid]$$$$NL$
4842 $END$
4843 $IF LENGTH(TSK.SHARED_SSTK_ID[tskid])$
4844 $$TSK.SHARED_SSTK_ID[$+tskid$] = $TSK.SHARED_SSTK_ID[tskid]$$$$NL$
4845 $END$
4846 $IF LENGTH(TSK.USTACK_MO[tskid])$
4847 $$TSK.USTACK_MO[$+tskid$] = VALUE($ESCSTR(TSK.USTACK_MO[tskid])$,
4848 $SPC$$+TSK.USTACK_MO[tskid]$)$$$NL$
4849 $END$
4850$ //OS指定リスタートタスクの情
4851報のうち,パス3,パス4でで使用するものを出力する
4852 $$TSK.PRIORITY[$+tskid$] = $TSK.PRIORITY[tskid]$$$$NL$
4853 $$TSK.ACTIVATION[$+tskid$] = VALUE($ESCSTR(TSK.ACTIVATION[tskid])$,$TSK.ACTIVATION[tskid]$)$$$NL$
4854 $$TSK.RESTARTTASK[$+tskid$] = $ESCSTR(TSK.RESTARTTASK[tskid])$$$$NL$
4855 $NL$
4856$END$
4857
4858$$tnum_os_restarttask = VALUE($ESCSTR(tnum_os_restarttask)$, $+tnum_os_restarttask$)$$$NL$
4859$$tmin_os_restarttask = VALUE($ESCSTR(tmin_os_restarttask)$, $+tmin_os_restarttask$)$$$NL$
4860$NL$
4861
4862$FOREACH tskpri RANGE(TMIN_TPRI, TMAX_TPRI)$
4863 $IF LENGTH(shared_ustack_size[tskpri])$
4864 $$shared_ustack_size[$tskpri$] = $ESCSTR(shared_ustack_size[tskpri])$$$$NL$
4865 $END$
4866 $IF LENGTH(shared_sstack_size[tskpri])$
4867 $$shared_sstack_size[$tskpri$] = $ESCSTR(shared_sstack_size[tskpri])$$$$NL$
4868 $END$
4869$END$
4870
4871$NL$
4872$$HWCNT.ID_LIST = {
4873$JOINEACH hwcntid HWCNT.ID_LIST ","$
4874 VALUE("$hwcntid$", $+hwcntid$)
4875$END$
4876}$$$NL$
4877
4878$NL$
4879
4880$ LNKSEC.*の出力
4881$$numls = $numls$$$$NL$
4882$NL$
4883$FOREACH lsid RANGE(1, numls)$
4884 $$LNKSEC.MEMREG[$lsid$] = $LNKSEC.MEMREG[lsid]$$$$NL$
4885 $$LNKSEC.SECTION[$lsid$] = $ESCSTR(LNKSEC.SECTION[lsid])$$$$NL$
4886 $NL$
4887$END$
Note: See TracBrowser for help on using the repository browser.