source: atk2-sc3_fl850f1l/kernel/kernel.tf@ 117

Last change on this file since 117 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

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