source: asp3_wo_tecs/trunk/kernel/kernel_check.trb@ 305

Last change on this file since 305 was 305, checked in by ertl-honda, 7 years ago

3.0.0のリリース版に追従

File size: 11.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 588 2016-02-05 12:54:58Z 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 end
82 end
83end
84
85#
86# 通知情
87報のチェック関数
88#
89$tmax_tskid = PEEK(SYMBOL("_kernel_tmax_tskid"), $sizeof_ID)
90$tmax_semid = PEEK(SYMBOL("_kernel_tmax_semid"), $sizeof_ID)
91$tmax_flgid = PEEK(SYMBOL("_kernel_tmax_flgid"), $sizeof_ID)
92$tmax_dtqid = PEEK(SYMBOL("_kernel_tmax_dtqid"), $sizeof_ID)
93
94def checkNotifyHandler(key, params, objid, exinf, nfyhdr)
95 # パラメータを変数に格納
96 nfymode = params[:nfymode]
97 nfymode1 = nfymode & 0x0f
98 nfymode2 = nfymode & ~0x0f
99 par1 = params[:par1]
100 par2 = params[:par2]
101 funcname = "_kernel_nfyhdr_#{params[objid]}"
102
103 # 通知処理のパラメータ数による補正処理
104 if nfymode1 == $TNFY_SETVAR || nfymode1 == $TNFY_SETFLG \
105 || nfymode1 == $TNFY_SNDDTQ
106 # 通知処理のパラメータが2つの場合
107 epar1 = params[:par3]
108 epar2 = params[:par4]
109 else
110 # 通知処理のパラメータが1つの場合
111 epar1 = params[:par2]
112 epar2 = params[:par3]
113 end
114
115 # タイムイベントハンドラのå…
116ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ï¼»NGKI3693ï¼½
117 if nfymode == $TNFY_HANDLER
118 tmehdr = nfyhdr
119 params1 = params.dup
120 params1[:tmehdr] = par2
121 if (tmehdr & ($CHECK_FUNC_ALIGN - 1)) != 0
122 error_wrong_id("E_PAR", params1, :tmehdr, objid, "not aligned")
123 end
124 if $CHECK_FUNC_NONNULL == 1 && tmehdr == 0
125 error_wrong_id("E_PAR", params1, :tmehdr, objid, "null")
126 end
127 end
128
129 # イベント通知処理の変数の番地とオブジェクトIDのチェック
130 if nfymode1 == $TNFY_SETVAR || nfymode1 == $TNFY_INCVAR
131 # 変数の設定/インクリメントによるタイムイベントの通知
132 p_var = exinf
133 params1 = params.dup
134 params1[:p_var] = par1
135
136 # 変数の番地のチェック[NGKI3699][NGKI3897]
137 if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
138 error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
139 end
140 if $CHECK_INTPTR_NONNULL == 1 && p_var == 0
141 error_wrong_id("E_PAR", params1, :p_var, objid, "null")
142 end
143 elsif (nfymode1 == $TNFY_ACTTSK || nfymode1 == $TNFY_WUPTSK)
144 # タスクの起動/起床によるタイムイベントの通知
145 tskid = exinf
146 params1 = params.dup
147 params1[:tskid] = par1
148
149 # タスクIDのチェック[NGKI3704]
150 if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
151 error_illegal_id("E_ID", params1, :tskid, objid)
152 end
153 elsif nfymode1 == $TNFY_SIGSEM
154 # セマフォの資源の返却によるタイムイベントの通知
155 semid = exinf
156 params1 = params.dup
157 params1[:semid] = par1
158
159 # セマフォIDのチェック[NGKI3707]
160 if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
161 error_illegal_id("E_ID", params1, :semid, objid)
162 end
163 elsif nfymode1 == $TNFY_SETFLG
164 # イベントフラグのセットによるタイムイベントの通知
165 flgid = exinf
166 params1 = params.dup
167 params1[:flgid] = par1
168
169 # イベントフラグIDのチェック[NGKI3710]
170 if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
171 error_illegal_id("E_ID", params1, :flgid, objid)
172 end
173 elsif nfymode1 == $TNFY_SNDDTQ
174 # データキューへの送信によるタイムイベントの通知
175 dtqid = exinf
176 params1 = params.dup
177 params1[:dtqid] = par1
178
179 # データキューIDのチェック[NGKI3713]
180 if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
181 error_illegal_id("E_ID", params1, :dtqid, objid)
182 end
183 end
184
185 # エラー通知処理の変数の番地とオブジェクトIDのチェック
186 if (nfymode2 == $TENFY_SETVAR || nfymode2 == $TENFY_INCVAR)
187 # 変数の設定/インクリメントによるエラーの通知
188 p_var = PEEK(SYMBOL(funcname + "_p_evar"), $sizeof_intptr_t)
189 params1 = params.dup
190 params1[:p_var] = epar1
191
192 # 変数の番地のチェック[NGKI3701][NGKI3897]
193 if (p_var & ($CHECK_INTPTR_ALIGN - 1)) != 0
194 error_wrong_id("E_PAR", params1, :p_var, objid, "not aligned")
195 end
196 if $CHECK_INTPTR_NONNULL == 1 && p_var == 0
197 error_wrong_id("E_PAR", params1, :p_var, objid, "null")
198 end
199 elsif nfymode2 == $TENFY_ACTTSK || nfymode2 == $TENFY_WUPTSK
200 # タスクの起動/起床によるエラーの通知
201 tskid = PEEK(SYMBOL(funcname + "_etskid"), $sizeof_ID)
202 params1 = params.dup
203 params1[:tskid] = epar1
204
205 # タスクIDのチェック[NGKI3704]
206 if !($TMIN_TSKID <= tskid && tskid <= $tmax_tskid)
207 error_illegal_id("E_ID", params1, :tskid, objid)
208 end
209 elsif nfymode2 == $TENFY_SIGSEM
210 # セマフォの資源の返却によるエラーの通知
211 semid = PEEK(SYMBOL(funcname + "_esemid"), $sizeof_ID)
212 params1 = params.dup
213 params1[:semid] = epar1
214
215 # セマフォIDのチェック[NGKI3707]
216 if !($TMIN_SEMID <= semid && semid <= $tmax_semid)
217 error_illegal_id("E_ID", params1, :semid, objid)
218 end
219 elsif nfymode2 == $TENFY_SETFLG
220 # イベントフラグのセットによるエラーの通知
221 flgid = PEEK(SYMBOL(funcname + "_eflgid"), $sizeof_ID)
222 params1 = params.dup
223 params1[:flgid] = epar1
224
225 # イベントフラグIDのチェック[NGKI3710]
226 if !($TMIN_FLGID <= flgid && flgid <= $tmax_flgid)
227 error_illegal_id("E_ID", params1, :flgid, objid)
228 end
229 elsif nfymode2 == $TENFY_SNDDTQ
230 # データキューへの送信によるエラーの通知
231 dtqid = PEEK(SYMBOL(funcname + "_edtqid"), $sizeof_ID)
232 params1 = params.dup
233 params1[:dtqid] = epar1
234
235 # データキューIDのチェック[NGKI3715]
236 if !($TMIN_DTQID <= dtqid && dtqid <= $tmax_dtqid)
237 error_illegal_id("E_ID", params1, :dtqid, objid)
238 end
239 end
240end
241
242#
243# タスクに関するチェック
244#
245tinib = SYMBOL("_kernel_tinib_table")
246$cfgData[:CRE_TSK].each do |key, params|
247 # タスクのå…
248ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ï¼»NGKI1033ï¼½
249 task = PEEK(tinib + $offsetof_TINIB_task, $sizeof_FP)
250 if (task & ($CHECK_FUNC_ALIGN - 1)) != 0
251 error_wrong_id("E_PAR", params, :task, :tskid, "not aligned")
252 end
253 if $CHECK_FUNC_NONNULL == 1 && task == 0
254 error_wrong_id("E_PAR", params, :task, :tskid, "null")
255 end
256
257 # タスクのスタック領域のå…
258ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ï¼»NGKI1056ï¼½
259 if $USE_TSKINICTXB == 1
260 stk = GetStackTskinictxb(key, params)
261 else
262 stk = PEEK(tinib + $offsetof_TINIB_stk, $sizeof_void_ptr)
263 end
264 if (stk & ($CHECK_STACK_ALIGN - 1)) != 0
265 error_wrong_id("E_PAR", params, :stk, :tskid, "not aligned")
266 end
267 if $CHECK_STACK_NONNULL == 1 && stk == 0
268 error_wrong_id("E_PAR", params, :stk, :tskid, "null")
269 end
270
271 tinib += $sizeof_TINIB
272end
273
274#
275# 固定長メモリプールに関するチェック
276#
277mpfinib = SYMBOL("_kernel_mpfinib_table")
278$cfgData[:CRE_MPF].each do |key, params|
279 mpf = PEEK(mpfinib + $offsetof_MPFINIB_mpf, $sizeof_void_ptr)
280
281 # 固定長メモリプール領域のå…
282ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ï¼»NGKI2249ï¼½
283 if (mpf & ($CHECK_MPF_ALIGN - 1)) != 0
284 error_wrong_id("E_PAR", params, :mpf, :mpfid, "not aligned")
285 end
286 if $CHECK_MPF_NONNULL == 1 && mpf == 0
287 error_wrong_id("E_PAR", params, :mpf, :mpfid, "null")
288 end
289
290 mpfinib += $sizeof_MPFINIB
291end
292
293#
294# 周期通知に関するチェック
295#
296cycinib = SYMBOL("_kernel_cycinib_table")
297$cfgData[:CRE_CYC].each do |key, params|
298 exinf = PEEK(cycinib + $offsetof_CYCINIB_exinf, $sizeof_intptr_t)
299 nfyhdr = PEEK(cycinib + $offsetof_CYCINIB_nfyhdr, $sizeof_FP)
300
301 # 通知情
302報のチェック
303 checkNotifyHandler(key, params, :cycid, exinf, nfyhdr)
304
305 cycinib += $sizeof_CYCINIB
306end
307
308#
309# アラーム通知に関するチェック
310#
311alminib = SYMBOL("_kernel_alminib_table")
312$cfgData[:CRE_ALM].each do |key, params|
313 exinf = PEEK(alminib + $offsetof_ALMINIB_exinf, $sizeof_intptr_t)
314 nfyhdr = PEEK(alminib + $offsetof_ALMINIB_nfyhdr, $sizeof_FP)
315
316 # 通知情
317報のチェック
318 checkNotifyHandler(key, params, :almid, exinf, nfyhdr)
319
320 alminib += $sizeof_ALMINIB
321end
322
323#
324# 非タスクコンテキスト用のスタック領域に関するチェック
325#
326istk = PEEK(SYMBOL("_kernel_istk"), $sizeof_void_ptr)
327
328# 非タスクコンテキスト用のスタック領域のå…
329ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ï¼»NGKI3222ï¼½
330if (istk & ($CHECK_STACK_ALIGN - 1)) != 0
331 error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "not aligned")
332end
333if $CHECK_STACK_NONNULL == 1 && istk == 0
334 error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "null")
335end
Note: See TracBrowser for help on using the repository browser.