source: EcnlProtoTool/trunk/asp3_dcre/kernel/kernel_check.trb@ 439

Last change on this file since 439 was 439, checked in by coas-nagasima, 4 years ago

mrubyを2.1.1に更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 14.2 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# TOPPERS/ASP Kernel
4# Toyohashi Open Platform for Embedded Real-Time Systems/
5# Advanced Standard Profile Kernel
6#
7# Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
8# Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
9# Graduate School of Information Science, Nagoya Univ., JAPAN
10#
11# 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13# 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16# スコード中に含まれていること.
17# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20# の無保証規定を掲載すること.
21# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23# と.
24# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25# 作権表示,この利用条件および下記の無保証規定を掲載すること.
26# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27# 報告すること.
28# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31# 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32# 免責すること.
33#
34# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38# の責任を負わない.
39#
40# $Id$
41#
42
43#
44# コンフィギュレータのパス3の生成スクリプト
45#
46
47#
48# タイムスタンプファイルの指定
49#
50$timeStampFileName = "check.timestamp"
51
52#
53# データセクションのLMAからVMAへのコピー
54#
55if defined?($lmaList)
56 $lmaList.each do |lma|
57 startData = SYMBOL(lma[:START_DATA])
58 endData = SYMBOL(lma[:END_DATA])
59 startIdata = SYMBOL(lma[:START_IDATA])
60 if startData.nil?
61 error_exit("symbol `lma[:START_DATA]' not found")
62 elsif endData.nil?
63 error_exit("symbol `lma[:END_DATA]' not found")
64 elsif startIdata.nil?
65 error_exit("symbol `lma[:START_IDATA]' not found")
66 else
67 BCOPY(startIdata, startData, endData - startData)
68 end
69 end
70end
71
72#
73# 通知情報のチェック関数
74#
75$tmax_tskid = $TMIN_TSKID + $cfgData[:CRE_TSK].size - 1
76$tmax_semid = $TMIN_SEMID + $cfgData[:CRE_SEM].size - 1
77$tmax_flgid = $TMIN_FLGID + $cfgData[:CRE_FLG].size - 1
78$tmax_dtqid = $TMIN_DTQID + $cfgData[:CRE_DTQ].size - 1
79
80def checkNotifyHandler(key, params, objid, exinf, nfyhdr)
81 # パラメータを変数に格納
82 nfymode = params[:nfymode]
83 nfymode1 = nfymode & 0x0f
84 nfymode2 = nfymode & ~0x0f
85 par1 = params[:par1]
86 par2 = params[:par2]
87 funcname = "_kernel_nfyhdr_#{params[objid]}"
88
89 # 通知処理のパラメータ数による補正処理
90 if nfymode1 == $TNFY_SETVAR || nfymode1 == $TNFY_SETFLG \
91 || nfymode1 == $TNFY_SNDDTQ
92 # 通知処理のパラメータが2つの場合
93 epar1 = params[:par3]
94 # epar2 = params[:par4]
95 else
96 # 通知処理のパラメータが1つの場合
97 epar1 = params[:par2]
98 # epar2 = params[:par3]
99 end
100
101 # タイムイベントハンドラの先頭番地が,プログラムの先頭番地として正し
102 # くない場合(E_PAR)[NGKI3693]
103 if nfymode == $TNFY_HANDLER
104 tmehdr = nfyhdr
105 params1 = params.dup
106 params1[:tmehdr] = par2
107 if (tmehdr & ($CHECK_FUNC_ALIGN - 1)) != 0
108 error_wrong_id("E_PAR", params1, :tmehdr, objid, "not aligned")
109 end
110 if $CHECK_FUNC_NONNULL && tmehdr == 0
111 error_wrong_id("E_PAR", params1, :tmehdr, objid, "null")
112 end
113 end
114
115 # イベント通知処理の変数の番地とオブジェクトIDのチェック
116 if nfymode1 == $TNFY_SETVAR || nfymode1 == $TNFY_INCVAR
117 # 変数の設定/インクリメントによるタイムイベントの通知
118 p_var = exinf
119 params1 = params.dup
120 params1[:p_var] = par1
121
122 # 通知方法中の変数の番地が,intptr_t型の変数の番地として正しくない
123 # 場合(E_PAR)[NGKI3699][NGKI3897]
124 if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
125 error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
126 end
127 if $CHECK_INTPTR_NONNULL && p_var == 0
128 error_wrong_id("E_PAR", params1, :p_var, objid, "null")
129 end
130 elsif (nfymode1 == $TNFY_ACTTSK || nfymode1 == $TNFY_WUPTSK)
131 # タスクの起動/起床によるタイムイベントの通知
132 tskid = exinf
133 params1 = params.dup
134 params1[:tskid] = par1
135
136 # 通知方法中のタスクIDが有効範囲外の場合(E_ID)[NGKI3704]
137 if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
138 error_illegal_id("E_ID", params1, :tskid, objid)
139 end
140 elsif nfymode1 == $TNFY_SIGSEM
141 # セマフォの資源の返却によるタイムイベントの通知
142 semid = exinf
143 params1 = params.dup
144 params1[:semid] = par1
145
146 # 通知方法中のセマフォIDが有効範囲外の場合(E_ID)[NGKI3707]
147 if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
148 error_illegal_id("E_ID", params1, :semid, objid)
149 end
150 elsif nfymode1 == $TNFY_SETFLG
151 # イベントフラグのセットによるタイムイベントの通知
152 flgid = exinf
153 params1 = params.dup
154 params1[:flgid] = par1
155
156 # 通知方法中のイベントフラグIDが有効範囲外の場合(E_ID)[NGKI3710]
157 if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
158 error_illegal_id("E_ID", params1, :flgid, objid)
159 end
160 elsif nfymode1 == $TNFY_SNDDTQ
161 # データキューへの送信によるタイムイベントの通知
162 dtqid = exinf
163 params1 = params.dup
164 params1[:dtqid] = par1
165
166 # 通知方法中のデータキューIDが有効範囲外の場合(E_ID)[NGKI3713]
167 if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
168 error_illegal_id("E_ID", params1, :dtqid, objid)
169 end
170 end
171
172 # エラー通知処理の変数の番地とオブジェクトIDのチェック
173 if (nfymode2 == $TENFY_SETVAR || nfymode2 == $TENFY_INCVAR)
174 # 変数の設定/インクリメントによるエラーの通知
175 p_var = PEEK(SYMBOL(funcname + "_p_evar"), $sizeof_intptr_t)
176 params1 = params.dup
177 params1[:p_var] = epar1
178
179 # 通知方法中の変数の番地が,intptr_t型の変数の番地として正しくない
180 # 場合(E_PAR)[NGKI3701][NGKI3897]
181 if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
182 error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
183 end
184 if $CHECK_INTPTR_NONNULL && p_var == 0
185 error_wrong_id("E_PAR", params1, :p_var, objid, "null")
186 end
187 elsif nfymode2 == $TENFY_ACTTSK || nfymode2 == $TENFY_WUPTSK
188 # タスクの起動/起床によるエラーの通知
189 tskid = PEEK(SYMBOL(funcname + "_etskid"), $sizeof_ID)
190 params1 = params.dup
191 params1[:tskid] = epar1
192
193 # 通知方法中のタスクIDが有効範囲外の場合(E_ID)[NGKI3704]
194 if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
195 error_illegal_id("E_ID", params1, :tskid, objid)
196 end
197 elsif nfymode2 == $TENFY_SIGSEM
198 # セマフォの資源の返却によるエラーの通知
199 semid = PEEK(SYMBOL(funcname + "_esemid"), $sizeof_ID)
200 params1 = params.dup
201 params1[:semid] = epar1
202
203 # 通知方法中のセマフォIDが有効範囲外の場合(E_ID)[NGKI3707]
204 if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
205 error_illegal_id("E_ID", params1, :semid, objid)
206 end
207 elsif nfymode2 == $TENFY_SETFLG
208 # イベントフラグのセットによるエラーの通知
209 flgid = PEEK(SYMBOL(funcname + "_eflgid"), $sizeof_ID)
210 params1 = params.dup
211 params1[:flgid] = epar1
212
213 # 通知方法中のイベントフラグIDが有効範囲外の場合(E_ID)[NGKI3710]
214 if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
215 error_illegal_id("E_ID", params1, :flgid, objid)
216 end
217 elsif nfymode2 == $TENFY_SNDDTQ
218 # データキューへの送信によるエラーの通知
219 dtqid = PEEK(SYMBOL(funcname + "_edtqid"), $sizeof_ID)
220 params1 = params.dup
221 params1[:dtqid] = epar1
222
223 # 通知方法中のデータキューIDが有効範囲外の場合(E_ID)[NGKI3715]
224 if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
225 error_illegal_id("E_ID", params1, :dtqid, objid)
226 end
227 end
228end
229
230#
231# タスクに関するチェック
232#
233tinib = SYMBOL("_kernel_tinib_table")
234$cfgData[:CRE_TSK].sort.each do |key, params|
235 # taskがプログラムの先頭番地として正しくない場合(E_PAR)[NGKI1033]
236 task = PEEK(tinib + $offsetof_TINIB_task, $sizeof_TASK)
237 if (task & ($CHECK_FUNC_ALIGN - 1)) != 0
238 error_wrong_id("E_PAR", params, :task, :tskid, "not aligned")
239 end
240 if $CHECK_FUNC_NONNULL && task == 0
241 error_wrong_id("E_PAR", params, :task, :tskid, "null")
242 end
243
244 # stkがターゲット定義の制約に合致しない場合(E_PAR)[NGKI1056]
245 if $USE_TSKINICTXB
246 stk = GetStackTskinictxb(key, params, tinib)
247 else
248 stk = PEEK(tinib + $offsetof_TINIB_stk, $sizeof_void_ptr)
249 end
250 if (stk & ($CHECK_STACK_ALIGN - 1)) != 0
251 error_wrong_id("E_PAR", params, :stk, :tskid, "not aligned")
252 end
253 if $CHECK_STACK_NONNULL && stk == 0
254 error_wrong_id("E_PAR", params, :stk, :tskid, "null")
255 end
256
257 tinib += $sizeof_TINIB
258end
259
260#
261# 固定長メモリプールに関するチェック
262#
263mpfinib = SYMBOL("_kernel_mpfinib_table")
264$cfgData[:CRE_MPF].sort.each do |_, params|
265 mpf = PEEK(mpfinib + $offsetof_MPFINIB_mpf, $sizeof_void_ptr)
266
267 # mpfがターゲット定義の制約に合致しない場合(E_PAR)[NGKI2249]
268 if (mpf & ($CHECK_MPF_ALIGN - 1)) != 0
269 error_wrong_id("E_PAR", params, :mpf, :mpfid, "not aligned")
270 end
271 if $CHECK_MPF_NONNULL && mpf == 0
272 error_wrong_id("E_PAR", params, :mpf, :mpfid, "null")
273 end
274
275 mpfinib += $sizeof_MPFINIB
276end
277
278#
279# 周期通知に関するチェック
280#
281cycinib = SYMBOL("_kernel_cycinib_table")
282$cfgData[:CRE_CYC].sort.each do |key, params|
283 exinf = PEEK(cycinib + $offsetof_CYCINIB_exinf, $sizeof_intptr_t)
284 nfyhdr = PEEK(cycinib + $offsetof_CYCINIB_nfyhdr, $sizeof_NFYHDR)
285
286 # 通知情報のチェック
287 checkNotifyHandler(key, params, :cycid, exinf, nfyhdr)
288
289 cycinib += $sizeof_CYCINIB
290end
291
292#
293# アラーム通知に関するチェック
294#
295alminib = SYMBOL("_kernel_alminib_table")
296$cfgData[:CRE_ALM].sort.each do |key, params|
297 exinf = PEEK(alminib + $offsetof_ALMINIB_exinf, $sizeof_intptr_t)
298 nfyhdr = PEEK(alminib + $offsetof_ALMINIB_nfyhdr, $sizeof_NFYHDR)
299
300 # 通知情報のチェック
301 checkNotifyHandler(key, params, :almid, exinf, nfyhdr)
302
303 alminib += $sizeof_ALMINIB
304end
305
306#
307# 割込みサービスルーチンに関するチェック
308#
309isrinib = SYMBOL("_kernel_isrinib_table")
310$cfgData[:CRE_ISR].sort.each do |_, params|
311 isr = PEEK(isrinib + $offsetof_ISRINIB_isr, $sizeof_ISR)
312
313 # isrがプログラムの先頭番地として正しくない場合[NGKI3004]
314 if (isr & ($CHECK_FUNC_ALIGN - 1)) != 0
315 error_wrong_id("E_PAR", params, :isr, :isrid, "not aligned")
316 end
317 if $CHECK_FUNC_NONNULL && isr == 0
318 error_wrong_id("E_PAR", params, :isr, :isrid, "null")
319 end
320
321 isrinib += $sizeof_ISRINIB
322end
323
324#
325# 非タスクコンテキスト用のスタック領域に関するチェック
326#
327if $cfgData[:DEF_ICS].size > 0
328 params0 = $cfgData[:DEF_ICS][1]
329 istk = PEEK(SYMBOL("_kernel_istk"), $sizeof_void_ptr)
330
331 # istkがターゲット定義の制約に合致しない場合(E_PAR)[NGKI3222]
332 if (istk & ($CHECK_STACK_ALIGN - 1)) != 0
333 error_wrong("E_PAR", params0, :istk, "not aligned")
334 end
335 if $CHECK_STACK_NONNULL && istk == 0
336 error_wrong("E_PAR", params0, :istk, "null")
337 end
338end
339
340#
341# カーネルメモリプール領域に関するチェック
342#
343if $cfgData[:DEF_MPK].size > 0
344 params0 = $cfgData[:DEF_MPK][1]
345 mpk = PEEK(SYMBOL("_kernel_mpk"), $sizeof_void_ptr)
346
347 # mpkがターゲット定義の制約に合致しない場合(E_PAR)[NGKI5083]
348 if (mpk & ($CHECK_MPK_ALIGN - 1)) != 0
349 error_wrong("E_PAR", params0, :mpk, "not aligned")
350 end
351 if $CHECK_MPK_NONNULL && mpk == 0
352 error_wrong("E_PAR", params0, :mpk, "null")
353 end
354end
355
356#
357# 初期化ルーチンに関するチェック
358#
359inirtnb = SYMBOL("_kernel_inirtnb_table")
360$cfgData[:ATT_INI].each do |_, params|
361 inirtn = PEEK(inirtnb + $offsetof_INIRTNB_inirtn, $sizeof_INIRTN)
362
363 # inirtnがプログラムの先頭番地として正しくない場合(E_PAR)[NGKI3243]
364 if (inirtn & ($CHECK_FUNC_ALIGN - 1)) != 0
365 error_wrong("E_PAR", params, :inirtn, "not aligned")
366 end
367 if $CHECK_FUNC_NONNULL && inirtn == 0
368 error_wrong("E_PAR", params, :inirtn, "null")
369 end
370
371 inirtnb += $sizeof_INIRTNB
372end
373
374#
375# 終了処理ルーチンに関するチェック
376#
377terrtnb = SYMBOL("_kernel_terrtnb_table")
378$cfgData[:ATT_TER].each do |_, params|
379 terrtn = PEEK(terrtnb + $offsetof_TERRTNB_terrtn, $sizeof_TERRTN)
380
381 # terrtnがプログラムの先頭番地として正しくない場合(E_PAR)[NGKI3250]
382 if (terrtn & ($CHECK_FUNC_ALIGN - 1)) != 0
383 error_wrong("E_PAR", params, :terrtn, "not aligned")
384 end
385 if $CHECK_FUNC_NONNULL && terrtn == 0
386 error_wrong("E_PAR", params, :terrtn, "null")
387 end
388
389 terrtnb += $sizeof_TERRTNB
390end
Note: See TracBrowser for help on using the repository browser.