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: core_kernel.trb 662 2016-02-27 02:33:51Z ertl-hiro $
|
---|
41 | #
|
---|
42 |
|
---|
43 | #
|
---|
44 | # パス2の生成スクリプトのコア依存部(RX用)
|
---|
45 | #
|
---|
46 |
|
---|
47 | #
|
---|
48 | # 割込み番号と割込みハンドラ番号の定義
|
---|
49 | #
|
---|
50 | # RX630では割込み番号と割込みハンドラ番号が1対1で対応する.
|
---|
51 | #
|
---|
52 | $INTNO_VALID = [ 16, 21, 23, *(27..59), 62, *(64..79), 90, 91, 92, 93, 98, 102, *(106..112), 114, *(122..167), *(170..203), *(214..253) ]
|
---|
53 | $INHNO_VALID = $INTNO_VALID
|
---|
54 |
|
---|
55 | #
|
---|
56 | # 例外番号の定義
|
---|
57 | #
|
---|
58 | # 固定ベクタテーブルのベクタテーブルアドレスの小さい順番に例外番号を割振る.
|
---|
59 | # (予約領域も含む)
|
---|
60 | #
|
---|
61 |
|
---|
62 | $EXCNO_VALID = [ 20, 23, 25, 30 ]
|
---|
63 |
|
---|
64 | #
|
---|
65 | # INT割込みの番号
|
---|
66 | #
|
---|
67 |
|
---|
68 | $INTNO_INT = [ *(64..79) ]
|
---|
69 |
|
---|
70 | #
|
---|
71 | # 割込み番号,割込みハンドラ番号,例外番号の範囲
|
---|
72 | #
|
---|
73 | # (予約領域も含む)
|
---|
74 | #
|
---|
75 |
|
---|
76 | $INTNO_RANGE = [ *(0..255) ]
|
---|
77 | $INHNO_RANGE = $INTNO_RANGE
|
---|
78 | $EXCNO_RANGE = [ *(0..31) ]
|
---|
79 |
|
---|
80 | #
|
---|
81 | # ATT_ISRで使用できる割込み番号とそれに対応する割込みハンドラ番号
|
---|
82 | #
|
---|
83 |
|
---|
84 | $INTNO_ATTISR_VALID = $INTNO_VALID
|
---|
85 | $INHNO_ATTISR_VALID = $INHNO_VALID
|
---|
86 |
|
---|
87 |
|
---|
88 | #
|
---|
89 | # DEF_INT/DEF_EXCで使用できる割込みハンドラ番号/CPU例外ハンドラ番号
|
---|
90 | #
|
---|
91 |
|
---|
92 | $INHNO_DEFINH_VALID = $INHNO_VALID
|
---|
93 | $EXCNO_DEFEXC_VALID = $EXCNO_VALID
|
---|
94 |
|
---|
95 |
|
---|
96 | #
|
---|
97 | # CFG_INTで使用できる割込み番号と割込み優先度
|
---|
98 | #
|
---|
99 |
|
---|
100 | $INTNO_CFGINT_VALID = $INHNO_VALID
|
---|
101 | $INTPRI_CFGINT_VALID = [ *(-7..-1) ]
|
---|
102 |
|
---|
103 |
|
---|
104 | #
|
---|
105 | # ターゲット非依存部に含まれる標準の割込み管理機能/例外管理機能の初期化処理を使用する
|
---|
106 | #
|
---|
107 |
|
---|
108 | $OMIT_INITIALIZE_INTERRUPT = false
|
---|
109 | $OMIT_INITIALIZE_EXCEPTION = false
|
---|
110 |
|
---|
111 |
|
---|
112 | #
|
---|
113 | # スタックサイズのチェック方法指定
|
---|
114 | #
|
---|
115 |
|
---|
116 | $CHECK_STKSZ_ALIGN = 4
|
---|
117 |
|
---|
118 |
|
---|
119 | #
|
---|
120 | # タスクスタックサイズの最小値
|
---|
121 | #
|
---|
122 | # タスク起動時に4byte,
|
---|
123 | # 割込み入口処理にて48byte, CPU例外入口処理にて84byte,
|
---|
124 | # であるため, 最小値は88byteとする.
|
---|
125 | #
|
---|
126 |
|
---|
127 | $TARGET_MIN_STKSZ = 88
|
---|
128 |
|
---|
129 | #
|
---|
130 | # 定数定義
|
---|
131 | #
|
---|
132 |
|
---|
133 | $TA_POSEDGE = $TA_EDGE
|
---|
134 |
|
---|
135 | #
|
---|
136 | # ターゲット定義の割込み要求ライン属性
|
---|
137 | #
|
---|
138 | $TARGET_INTATR = $TA_POSEDGE|$TA_NEGEDGE|$TA_BOTHEDGE|$TA_LOWLEVEL
|
---|
139 |
|
---|
140 | #
|
---|
141 | # ターゲット依存の割込みハンドラ属性の定義
|
---|
142 | #
|
---|
143 |
|
---|
144 | $TARGET_INHATR = $TA_NONKERNEL
|
---|
145 |
|
---|
146 |
|
---|
147 | #
|
---|
148 | # カーネル管理外割込みハンドラは固定させないため,
|
---|
149 | # INTNO_FIX_KERNEL
|
---|
150 | # INHNO_FIX_KERNEL
|
---|
151 | # INHNO_FIX_NONKERNEL
|
---|
152 | # INHNO_FIX_NONKERNEL
|
---|
153 | # を定義しない.
|
---|
154 | #
|
---|
155 |
|
---|
156 | $USE_INHINIB_TABLE = true
|
---|
157 | $USE_INTINIB_TABLE = true
|
---|
158 |
|
---|
159 | #
|
---|
160 | # 標準テンプレートファイルのインクルード
|
---|
161 | #
|
---|
162 | IncludeTrb("kernel/kernel.trb")
|
---|
163 |
|
---|
164 | #
|
---|
165 | # 割込み番号から割込み優先度及び属性を取り出すテーブル
|
---|
166 | #
|
---|
167 | $kernelCfgC.comment_header("Interrupt Level and Attribute Table")
|
---|
168 |
|
---|
169 | $kernelCfgC.add("const CFG_INT_INFO _kernel_cfg_int_table[#{$INTNO_RANGE.length}] = {")
|
---|
170 | $INTNO_RANGE.each do |intnoVal|
|
---|
171 | if $cfgData[:CFG_INT].has_key?(intnoVal)
|
---|
172 | $kernelCfgC.append("\t{ #{-$cfgData[:CFG_INT][intnoVal][:intpri].val}, #{$cfgData[:CFG_INT][intnoVal][:intatr]} }")
|
---|
173 | else
|
---|
174 | $kernelCfgC.append("\t{ 0, 0xFFFFFFFF }")
|
---|
175 | end
|
---|
176 | $kernelCfgC.append(",") if intnoVal < ($INTNO_RANGE.length - 1)
|
---|
177 | $kernelCfgC.add("\t/* #{sprintf("%02u", intnoVal)} */ ")
|
---|
178 | end
|
---|
179 | $kernelCfgC.add2("};")
|
---|
180 |
|
---|
181 | $kernelCfgAsm = GenFile.new("kernel_cfg_asm.S")
|
---|
182 |
|
---|
183 | #
|
---|
184 | # 割込みベクタ及び割込みハンドラ定義
|
---|
185 | #
|
---|
186 | $kernelCfgAsm.add(<<EOS)
|
---|
187 | ;
|
---|
188 | ; RX630アーキテクチャ依存出力ファイル
|
---|
189 | ;
|
---|
190 | ; 割込みベクタ及び割込みハンドラ定義
|
---|
191 | ;
|
---|
192 |
|
---|
193 |
|
---|
194 | .section P, CODE
|
---|
195 | .global _kernel_interrupt
|
---|
196 | .global __kernel_default_int_handler
|
---|
197 | .global __kernel_default_exc_handler
|
---|
198 | EOS
|
---|
199 |
|
---|
200 | $INHNO_RANGE.each do |inhnoVal|
|
---|
201 | if $cfgData[:DEF_INH].has_key?(inhnoVal)
|
---|
202 | $kernelCfgAsm.add(<<EOS)
|
---|
203 | .global _#{$cfgData[:DEF_INH][inhnoVal][:inthdr]}
|
---|
204 | .global __kernel_#{$cfgData[:DEF_INH][inhnoVal][:inthdr]}_#{inhnoVal}_entry
|
---|
205 | __kernel_#{$cfgData[:DEF_INH][inhnoVal][:inthdr]}_#{inhnoVal}_entry:
|
---|
206 | pushm r1-r5
|
---|
207 | mov.l \##{inhnoVal}, r1
|
---|
208 | mov.l \#_#{$cfgData[:DEF_INH][inhnoVal][:inthdr]}, r2
|
---|
209 | bra.a _kernel_interrupt
|
---|
210 | EOS
|
---|
211 | $kernelCfgAsm.add
|
---|
212 | end
|
---|
213 | end
|
---|
214 |
|
---|
215 | $kernelCfgAsm.add(<<EOS)
|
---|
216 | .global __kernel_default_int_handler_entry
|
---|
217 | __kernel_default_int_handler_entry:
|
---|
218 | pushm r1-r5
|
---|
219 | mov.l \#0FFFFFFFFH, r1
|
---|
220 | mov.l \#__kernel_default_int_handler, r2
|
---|
221 | bra.a _kernel_interrupt
|
---|
222 |
|
---|
223 | .global __kernel_break_int_handler_entry
|
---|
224 | __kernel_break_int_handler_entry:
|
---|
225 | rts
|
---|
226 | EOS
|
---|
227 | $kernelCfgAsm.add
|
---|
228 |
|
---|
229 | $kernelCfgAsm.add(<<EOS)
|
---|
230 | .global _kernel_exception
|
---|
231 | EOS
|
---|
232 |
|
---|
233 | $EXCNO_VALID.each do |excnoVal|
|
---|
234 | if $cfgData[:DEF_EXC].has_key?(excnoVal)
|
---|
235 | $kernelCfgAsm.add(<<EOS)
|
---|
236 | .global _#{$cfgData[:DEF_EXC][excnoVal][:exchdr]}
|
---|
237 | .global __kernel_#{$cfgData[:DEF_EXC][excnoVal][:exchdr]}_#{excnoVal}_entry
|
---|
238 | __kernel_#{$cfgData[:DEF_EXC][excnoVal][:exchdr]}_#{excnoVal}_entry:
|
---|
239 | pushm r1-r5
|
---|
240 | mov.l \##{excnoVal}, r1
|
---|
241 | mov.l \#_#{$cfgData[:DEF_EXC][excnoVal][:exchdr]}, r2
|
---|
242 | bra.a _kernel_exception
|
---|
243 | EOS
|
---|
244 | $kernelCfgAsm.add
|
---|
245 | end
|
---|
246 | end
|
---|
247 |
|
---|
248 | $kernelCfgAsm.add(<<EOS)
|
---|
249 | .global __kernel_default_exc_handler_entry
|
---|
250 | __kernel_default_exc_handler_entry:
|
---|
251 | pushm r1-r5
|
---|
252 | mov.l \#0FFFFFFFFH, r1
|
---|
253 | mov.l \#__kernel_default_exc_handler, r2
|
---|
254 | bra.a _kernel_exception
|
---|
255 | EOS
|
---|
256 | $kernelCfgAsm.add
|
---|
257 |
|
---|
258 | $kernelCfgAsm.append(<<EOS)
|
---|
259 | ;
|
---|
260 | ; 可変ベクタテーブル
|
---|
261 | ;
|
---|
262 |
|
---|
263 | .global _start
|
---|
264 |
|
---|
265 | .global _vvector_table
|
---|
266 |
|
---|
267 |
|
---|
268 | .section .rvectors, ROMDATA
|
---|
269 |
|
---|
270 | _vvector_table:
|
---|
271 | EOS
|
---|
272 |
|
---|
273 | $INHNO_RANGE.each do |inhnoVal|
|
---|
274 | if $cfgData[:DEF_INH].has_key?(inhnoVal)
|
---|
275 | $kernelCfgAsm.append(" .lword __kernel_#{$cfgData[:DEF_INH][inhnoVal][:inthdr]}_#{inhnoVal}_entry")
|
---|
276 | elsif inhnoVal != 0
|
---|
277 | $kernelCfgAsm.append(" .lword __kernel_default_int_handler_entry")
|
---|
278 | else
|
---|
279 | $kernelCfgAsm.append(" .lword __kernel_break_int_handler_entry")
|
---|
280 | end
|
---|
281 | $kernelCfgAsm.add(" ; #{sprintf("%02d", inhnoVal)} ")
|
---|
282 | end
|
---|
283 |
|
---|
284 | $kernelCfgAsm.add2
|
---|
285 |
|
---|
286 | $kernelCfgAsm.append(<<EOS)
|
---|
287 | ;
|
---|
288 | ; 固定ベクタテーブル
|
---|
289 | ;
|
---|
290 |
|
---|
291 | .global _fvector_table
|
---|
292 |
|
---|
293 | .section .fvectors, ROMDATA
|
---|
294 |
|
---|
295 | _fvector_table:
|
---|
296 | .word 0FFFFFFFFH ; Endian Select Register (little)
|
---|
297 | .space 004H
|
---|
298 | .word 0FFFFFFFFH ; OFS1
|
---|
299 | .word 0FFFFFFFFH ; OFS0
|
---|
300 | .space 010H
|
---|
301 | .word 0FFFFFFFFH ; 制御コード, IDコード1 - 3
|
---|
302 | .word 0FFFFFFFFH ; IDコード4 - 7
|
---|
303 | .word 0FFFFFFFFH ; IDコード8 - 11
|
---|
304 | .word 0FFFFFFFFH ; IDコード12 - 15
|
---|
305 | EOS
|
---|
306 | (12..30).each do |excnoVal|
|
---|
307 | if $cfgData[:DEF_EXC].has_key?(excnoVal)
|
---|
308 | $kernelCfgAsm.append(" .word __kernel_#{$cfgData[:DEF_EXC][excnoVal][:exchdr]}_#{excnoVal}_entry")
|
---|
309 | elsif $EXCNO_VALID.include?(excnoVal)
|
---|
310 | $kernelCfgAsm.append(" .word __kernel_default_exc_handler_entry")
|
---|
311 | else
|
---|
312 | $kernelCfgAsm.append(" .word 0")
|
---|
313 | end
|
---|
314 | $kernelCfgAsm.add(" ; #{excnoVal} ")
|
---|
315 | end
|
---|
316 |
|
---|
317 | $kernelCfgAsm.add(" .word _start ; 31:Reset")
|
---|
318 | $kernelCfgAsm.add2(".end")
|
---|
319 |
|
---|
320 | #
|
---|
321 | # 割込み要求ライン属性に関するターゲット依存のエラーチェック
|
---|
322 | #
|
---|
323 | $cfgData[:CFG_INT].each do |key, params|
|
---|
324 | # IRQ割込み番号かどうかをチェック
|
---|
325 | if $INTNO_INT.include?(key)
|
---|
326 | # TA_POSEDGEとTA_NEGEDGEが同時に設定されている場合
|
---|
327 | if (params[:intatr].val & ($TA_POSEDGE|$TA_NEGEDGE)) == $TA_POSEDGE|$TA_NEGEDGE
|
---|
328 | error_illegal_sym("E_RSATR", params, :intatr, :intno)
|
---|
329 | end
|
---|
330 | # TA_POSEDGEとTA_BOTHEDGEが同時に設定されている場合
|
---|
331 | if (params[:intatr].val & ($TA_POSEDGE|$TA_BOTHEDGE)) == $TA_POSEDGE|$TA_BOTHEDGE
|
---|
332 | error_illegal_sym("E_RSATR", params, :intatr, :intno)
|
---|
333 | end
|
---|
334 | # TA_NEGEDGEとTA_BOTHEDGEが同時に設定されている場合
|
---|
335 | if (params[:intatr].val & ($TA_NEGEDGE|$TA_BOTHEDGE)) == $TA_NEGEDGE|$TA_BOTHEDGE
|
---|
336 | error_illegal_sym("E_RSATR", params, :intatr, :intno)
|
---|
337 | end
|
---|
338 | # TA_POSEDGEとTA_NEGEDGEとTA_BOTHEDGEが同時に設定されている場合
|
---|
339 | if (params[:intatr].val & ($TA_POSEDGE|$TA_NEGEDGE|$TA_BOTHEDGE)) == $TA_POSEDGE|$TA_NEGEDGE|$TA_BOTHEDGE
|
---|
340 | error_illegal_sym("E_RSATR", params, :intatr, :intno)
|
---|
341 | end
|
---|
342 | else
|
---|
343 | # IRQ割込み以外の割込みに対して割込み属性が指定されている場合
|
---|
344 | if (params[:intatr].val & (~($TA_ENAINT|$TA_EDGE))) != 0
|
---|
345 | error_illegal_sym("E_RSATR", params, :intatr, :intno)
|
---|
346 | end
|
---|
347 | end
|
---|
348 | end
|
---|