source: rubycfg_asp/trunk/asp_dcre/kernel/kernel_check.trb@ 315

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

SVNプロパティを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby; charset=UTF-8
File size: 7.7 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: kernel_check.trb 662 2016-02-27 02:33:51Z ertl-hiro $
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$tmax_mbxid = $TMIN_MBXID + $cfgData[:CRE_MBX].size - 1
80
81#
82# タスクに関するチェック
83#
84tinib = SYMBOL("_kernel_tinib_table")
85$cfgData[:CRE_TSK].sort.each do |key, params|
86 task = PEEK(tinib + $offsetof_TINIB_task, $sizeof_TASK)
87
88 # タスクの先頭番地のチェック[NGKI1033]
89 if (task & ($CHECK_FUNC_ALIGN - 1)) != 0
90 error_wrong_id("E_PAR", params, :task, :tskid, "not aligned")
91 end
92 if $CHECK_FUNC_NONNULL && task == 0
93 error_wrong_id("E_PAR", params, :task, :tskid, "null")
94 end
95
96 # タスクのスタック領域の先頭番地のチェック[NGKI1056]
97 if $USE_TSKINICTXB
98 stk = GetStackTskinictxb(key, params, tinib)
99 else
100 stk = PEEK(tinib + $offsetof_TINIB_stk, $sizeof_void_ptr)
101 end
102 if (stk & ($CHECK_STACK_ALIGN - 1)) != 0
103 error_wrong_id("E_PAR", params, :stk, :tskid, "not aligned")
104 end
105 if $CHECK_STACK_NONNULL && stk == 0
106 error_wrong_id("E_PAR", params, :stk, :tskid, "null")
107 end
108
109 tinib += $sizeof_TINIB
110end
111
112#
113# 固定長メモリプールに関するチェック
114#
115mpfinib = SYMBOL("_kernel_mpfinib_table")
116$cfgData[:CRE_MPF].sort.each do |key, params|
117 mpf = PEEK(mpfinib + $offsetof_MPFINIB_mpf, $sizeof_void_ptr)
118
119 # 固定長メモリプール領域の先頭番地のチェック[NGKI2249]
120 if (mpf & ($CHECK_MPF_ALIGN - 1)) != 0
121 error_wrong_id("E_PAR", params, :mpf, :mpfid, "not aligned")
122 end
123 if $CHECK_MPF_NONNULL && mpf == 0
124 error_wrong_id("E_PAR", params, :mpf, :mpfid, "null")
125 end
126
127 mpfinib += $sizeof_MPFINIB
128end
129
130#
131# 周期通知に関するチェック
132#
133cycinib = SYMBOL("_kernel_cycinib_table")
134$cfgData[:CRE_CYC].sort.each do |key, params|
135 exinf = PEEK(cycinib + $offsetof_CYCINIB_exinf, $sizeof_intptr_t)
136 cychdr = PEEK(cycinib + $offsetof_CYCINIB_cychdr, $sizeof_CYCHDR)
137
138 # ハンドラの先頭番地のチェック[NGKI3135]
139 if (cychdr && ($CHECK_FUNC_ALIGN - 1)) != 0
140 error_wrong_id("E_PAR", params, :cychdr, :cycid, "not aligned")
141 end
142 if $CHECK_FUNC_NONNULL && :cychdr == 0
143 error_wrong_id("E_PAR", params, :cychdr, :cycid, "null")
144 end
145
146 cycinib += $sizeof_CYCINIB
147end
148
149#
150# アラーム通知に関するチェック
151#
152alminib = SYMBOL("_kernel_alminib_table")
153$cfgData[:CRE_ALM].sort.each do |key, params|
154 exinf = PEEK(alminib + $offsetof_ALMINIB_exinf, $sizeof_intptr_t)
155 almhdr = PEEK(alminib + $offsetof_ALMINIB_almhdr, $sizeof_ALMHDR)
156
157 # ハンドラの先頭番地のチェック[NGKI3135]
158 if (almhdr && ($CHECK_FUNC_ALIGN - 1)) != 0
159 error_wrong_id("E_PAR", params, :almhdr, :almid, "not aligned")
160 end
161 if $CHECK_FUNC_NONNULL && params[:almhdr] == 0
162 error_wrong_id("E_PAR", params, :almhdr, :almid, "null")
163 end
164
165 alminib += $sizeof_ALMINIB
166end
167
168#
169# 割込みサービスルーチンに関するチェック
170#
171isrinib = SYMBOL("_kernel_sisrinib_table")
172$cfgData[:ATT_ISR].sort.each do |key, params|
173 isr = PEEK(isrinib + $offsetof_ISRINIB_isr, $sizeof_ISR)
174
175 # 割込みサービスルーチンの先頭番地のチェック[NGKI3004]
176 if (isr & ($CHECK_FUNC_ALIGN - 1)) != 0
177 error_wrong_id("E_PAR", params, :isr, :isrid, "not aligned")
178 end
179 if $CHECK_FUNC_NONNULL && isr == 0
180 error_wrong_id("E_PAR", params, :isr, :isrid, "null")
181 end
182
183 isrinib += $sizeof_ISRINIB
184end
185
186#
187# 非タスクコンテキスト用のスタック領域に関するチェック
188#
189istkAddr = SYMBOL("_kernel_istk")
190if !istkAddr.nil?
191 istk = PEEK(istkAddr, $sizeof_void_ptr)
192
193 # 非タスクコンテキスト用のスタック領域の先頭番地のチェック[NGKI3222]
194 if (istk & ($CHECK_STACK_ALIGN - 1)) != 0
195 error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "not aligned")
196 end
197 if $CHECK_STACK_NONNULL && istk == 0
198 error_wrong("E_PAR", $cfgData[:DEF_ICS][1], :istk, "null")
199 end
200end
201
202#
203# カーネルが割り付けるメモリ領域に関するチェック
204#
205kmmAddr = SYMBOL("_kernel_kmm")
206if !kmmAddr.nil?
207 kmm = PEEK(kmmAddr, $sizeof_void_ptr)
208
209 # カーネルが割り付けるメモリ領域の先頭番地のチェック
210 if (kmm & ($CHECK_MB_ALIGN - 1)) != 0
211 error_wrong("E_PAR", $cfgData[:DEF_KMM][1], :kmm, "not aligned")
212 end
213end
Note: See TracBrowser for help on using the repository browser.