source: azure_iot_hub/trunk/asp3_dcre/arch/rx630_gcc/prc_kernel.trb@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

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