source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/arch/rx630_gcc/prc_kernel.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: 10.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# パス2の生成スクリプトのコア依存部(RX63x用)
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#
162IncludeTrb("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)} */ ")
178end
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
198EOS
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
210EOS
211 $kernelCfgAsm.add
212 end
213end
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
226EOS
227$kernelCfgAsm.add
228
229$kernelCfgAsm.add(<<EOS)
230 .global _kernel_exception
231EOS
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
243EOS
244 $kernelCfgAsm.add
245 end
246end
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
255EOS
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:
271EOS
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)} ")
282end
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
305EOS
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} ")
315end
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
348end
Note: See TracBrowser for help on using the repository browser.