source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/kernel/kernel_check.trb@ 337

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

ASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 12.4 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# 上記著作権者は,以下の(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 !$lmaList.nil?
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 # タイムイベントハンドラの先頭番地のチェック[NGKI3693]
102 if nfymode == $TNFY_HANDLER
103 tmehdr = nfyhdr
104 params1 = params.dup
105 params1[:tmehdr] = par2
106 if (tmehdr & ($CHECK_FUNC_ALIGN - 1)) != 0
107 error_wrong_id("E_PAR", params1, :tmehdr, objid, "not aligned")
108 end
109 if $CHECK_FUNC_NONNULL && tmehdr == 0
110 error_wrong_id("E_PAR", params1, :tmehdr, objid, "null")
111 end
112 end
113
114 # イベント通知処理の変数の番地とオブジェクトIDのチェック
115 if nfymode1 == $TNFY_SETVAR || nfymode1 == $TNFY_INCVAR
116 # 変数の設定/インクリメントによるタイムイベントの通知
117 p_var = exinf
118 params1 = params.dup
119 params1[:p_var] = par1
120
121 # 変数の番地のチェック[NGKI3699][NGKI3897]
122 if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
123 error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
124 end
125 if $CHECK_INTPTR_NONNULL && p_var == 0
126 error_wrong_id("E_PAR", params1, :p_var, objid, "null")
127 end
128 elsif (nfymode1 == $TNFY_ACTTSK || nfymode1 == $TNFY_WUPTSK)
129 # タスクの起動/起床によるタイムイベントの通知
130 tskid = exinf
131 params1 = params.dup
132 params1[:tskid] = par1
133
134 # タスクIDのチェック[NGKI3704]
135 if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
136 error_illegal_id("E_ID", params1, :tskid, objid)
137 end
138 elsif nfymode1 == $TNFY_SIGSEM
139 # セマフォの資源の返却によるタイムイベントの通知
140 semid = exinf
141 params1 = params.dup
142 params1[:semid] = par1
143
144 # セマフォIDのチェック[NGKI3707]
145 if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
146 error_illegal_id("E_ID", params1, :semid, objid)
147 end
148 elsif nfymode1 == $TNFY_SETFLG
149 # イベントフラグのセットによるタイムイベントの通知
150 flgid = exinf
151 params1 = params.dup
152 params1[:flgid] = par1
153
154 # イベントフラグIDのチェック[NGKI3710]
155 if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
156 error_illegal_id("E_ID", params1, :flgid, objid)
157 end
158 elsif nfymode1 == $TNFY_SNDDTQ
159 # データキューへの送信によるタイムイベントの通知
160 dtqid = exinf
161 params1 = params.dup
162 params1[:dtqid] = par1
163
164 # データキューIDのチェック[NGKI3713]
165 if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
166 error_illegal_id("E_ID", params1, :dtqid, objid)
167 end
168 end
169
170 # エラー通知処理の変数の番地とオブジェクトIDのチェック
171 if (nfymode2 == $TENFY_SETVAR || nfymode2 == $TENFY_INCVAR)
172 # 変数の設定/インクリメントによるエラーの通知
173 p_var = PEEK(SYMBOL(funcname + "_p_evar"), $sizeof_intptr_t)
174 params1 = params.dup
175 params1[:p_var] = epar1
176
177 # 変数の番地のチェック[NGKI3701][NGKI3897]
178 if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
179 error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
180 end
181 if $CHECK_INTPTR_NONNULL && p_var == 0
182 error_wrong_id("E_PAR", params1, :p_var, objid, "null")
183 end
184 elsif nfymode2 == $TENFY_ACTTSK || nfymode2 == $TENFY_WUPTSK
185 # タスクの起動/起床によるエラーの通知
186 tskid = PEEK(SYMBOL(funcname + "_etskid"), $sizeof_ID)
187 params1 = params.dup
188 params1[:tskid] = epar1
189
190 # タスクIDのチェック[NGKI3704]
191 if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
192 error_illegal_id("E_ID", params1, :tskid, objid)
193 end
194 elsif nfymode2 == $TENFY_SIGSEM
195 # セマフォの資源の返却によるエラーの通知
196 semid = PEEK(SYMBOL(funcname + "_esemid"), $sizeof_ID)
197 params1 = params.dup
198 params1[:semid] = epar1
199
200 # セマフォIDのチェック[NGKI3707]
201 if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
202 error_illegal_id("E_ID", params1, :semid, objid)
203 end
204 elsif nfymode2 == $TENFY_SETFLG
205 # イベントフラグのセットによるエラーの通知
206 flgid = PEEK(SYMBOL(funcname + "_eflgid"), $sizeof_ID)
207 params1 = params.dup
208 params1[:flgid] = epar1
209
210 # イベントフラグIDのチェック[NGKI3710]
211 if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
212 error_illegal_id("E_ID", params1, :flgid, objid)
213 end
214 elsif nfymode2 == $TENFY_SNDDTQ
215 # データキューへの送信によるエラーの通知
216 dtqid = PEEK(SYMBOL(funcname + "_edtqid"), $sizeof_ID)
217 params1 = params.dup
218 params1[:dtqid] = epar1
219
220 # データキューIDのチェック[NGKI3715]
221 if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
222 error_illegal_id("E_ID", params1, :dtqid, objid)
223 end
224 end
225end
226
227#
228# タスクに関するチェック
229#
230tinib = SYMBOL("_kernel_tinib_table")
231$cfgData[:CRE_TSK].sort.each do |key, params|
232 task = PEEK(tinib + $offsetof_TINIB_task, $sizeof_TASK)
233
234 # タスクの先頭番地のチェック[NGKI1033]
235 if (task & ($CHECK_FUNC_ALIGN - 1)) != 0
236 error_wrong_id("E_PAR", params, :task, :tskid, "not aligned")
237 end
238 if $CHECK_FUNC_NONNULL && task == 0
239 error_wrong_id("E_PAR", params, :task, :tskid, "null")
240 end
241
242 # タスクのスタック領域の先頭番地のチェック[NGKI1056]
243 if $USE_TSKINICTXB
244 stk = GetStackTskinictxb(key, params, tinib)
245 else
246 stk = PEEK(tinib + $offsetof_TINIB_stk, $sizeof_void_ptr)
247 end
248 if (stk & ($CHECK_STACK_ALIGN - 1)) != 0
249 error_wrong_id("E_PAR", params, :stk, :tskid, "not aligned")
250 end
251 if $CHECK_STACK_NONNULL && stk == 0
252 error_wrong_id("E_PAR", params, :stk, :tskid, "null")
253 end
254
255 tinib += $sizeof_TINIB
256end
257
258#
259# 固定長メモリプールに関するチェック
260#
261mpfinib = SYMBOL("_kernel_mpfinib_table")
262$cfgData[:CRE_MPF].sort.each do |key, params|
263 mpf = PEEK(mpfinib + $offsetof_MPFINIB_mpf, $sizeof_void_ptr)
264
265 # 固定長メモリプール領域の先頭番地のチェック[NGKI2249]
266 if (mpf & ($CHECK_MPF_ALIGN - 1)) != 0
267 error_wrong_id("E_PAR", params, :mpf, :mpfid, "not aligned")
268 end
269 if $CHECK_MPF_NONNULL && mpf == 0
270 error_wrong_id("E_PAR", params, :mpf, :mpfid, "null")
271 end
272
273 mpfinib += $sizeof_MPFINIB
274end
275
276#
277# 周期通知に関するチェック
278#
279cycinib = SYMBOL("_kernel_cycinib_table")
280$cfgData[:CRE_CYC].sort.each do |key, params|
281 exinf = PEEK(cycinib + $offsetof_CYCINIB_exinf, $sizeof_intptr_t)
282 nfyhdr = PEEK(cycinib + $offsetof_CYCINIB_nfyhdr, $sizeof_NFYHDR)
283
284 # 通知情報のチェック
285 checkNotifyHandler(key, params, :cycid, exinf, nfyhdr)
286
287 cycinib += $sizeof_CYCINIB
288end
289
290#
291# アラーム通知に関するチェック
292#
293alminib = SYMBOL("_kernel_alminib_table")
294$cfgData[:CRE_ALM].sort.each do |key, params|
295 exinf = PEEK(alminib + $offsetof_ALMINIB_exinf, $sizeof_intptr_t)
296 nfyhdr = PEEK(alminib + $offsetof_ALMINIB_nfyhdr, $sizeof_NFYHDR)
297
298 # 通知情報のチェック
299 checkNotifyHandler(key, params, :almid, exinf, nfyhdr)
300
301 alminib += $sizeof_ALMINIB
302end
303
304#
305# 割込みサービスルーチンに関するチェック
306#
307isrinib = SYMBOL("_kernel_isrinib_table")
308$cfgData[:CRE_ISR].sort.each do |key, params|
309 isr = PEEK(isrinib + $offsetof_ISRINIB_isr, $sizeof_ISR)
310
311 # 割込みサービスルーチンの先頭番地のチェック[NGKI3004]
312 if (isr & ($CHECK_FUNC_ALIGN - 1)) != 0
313 error_wrong_id("E_PAR", params, :isr, :isrid, "not aligned")
314 end
315 if $CHECK_FUNC_NONNULL && isr == 0
316 error_wrong_id("E_PAR", params, :isr, :isrid, "null")
317 end
318
319 isrinib += $sizeof_ISRINIB
320end
321
322#
323# 非タスクコンテキスト用のスタック領域に関するチェック
324#
325istkAddr = SYMBOL("_kernel_istk")
326if !istkAddr.nil?
327 istk = PEEK(istkAddr, $sizeof_void_ptr)
328
329 # 非タスクコンテキスト用のスタック領域の先頭番地のチェック[NGKI3222]
330 if (istk & ($CHECK_STACK_ALIGN - 1)) != 0
331 error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "not aligned")
332 end
333 if $CHECK_STACK_NONNULL && istk == 0
334 error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "null")
335 end
336end
337
338#
339# カーネルが割り付けるメモリ領域に関するチェック
340#
341kmmAddr = SYMBOL("_kernel_kmm")
342if !kmmAddr.nil?
343 kmm = PEEK(kmmAddr, $sizeof_void_ptr)
344
345 # カーネルが割り付けるメモリ領域の先頭番地のチェック
346 if (kmm & ($CHECK_MB_ALIGN - 1)) != 0
347 error_wrong("E_PAR", $cfgData[:DEF_KMM][1], :kmm, "not aligned")
348 end
349end
Note: See TracBrowser for help on using the repository browser.