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

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

mruby版ECNLプロトタイピング・ツールを追加

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