source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/h8s-renesas/cpu_support.src@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 20.7 KB
Line 
1;
2; TOPPERS/JSP Kernel
3; Toyohashi Open Platform for Embedded Real-Time Systems/
4; Just Standard Profile Kernel
5;
6; Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory
7; Toyohashi Univ. of Technology, JAPAN
8; Copyright (C) 2001-2007 by Industrial Technology Institute,
9; Miyagi Prefectural Government, JAPAN
10; Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering
11; Tomakomai National College of Technology, JAPAN
12;
13; 上記著作権者
14は,以下の (1)〜(4) の条件か,Free Software Foundation
15; によってå…
16¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
17; 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
18; を改変したものを含む.以下同じ)を使用・複製・改変・再é…
19å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
20; 利用と呼ぶ)することを無償で許諾する.
21; (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
22; 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
23; スコード中に含まれていること.
24; (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
25; 用できる形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
27å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
28; 者
29マニュアルなど)に,上記の著作権表示,この利用条件および下記
30; の無保証規定を掲載すること.
31; (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
32; 用できない形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
34; と.
35; (a) 再é…
36å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
37マニュアルなど)に,上記の著
38; 作権表示,この利用条件および下記の無保証規定を掲載すること.
39; (b) 再é…
40å¸ƒã®å½¢æ…
41‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
42; 報告すること.
43; (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
44; 害からも,上記著作権者
45およびTOPPERSプロジェクトをå…
46è²¬ã™ã‚‹ã“と.
47;
48; 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50; よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
51; 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
52; 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
53;
54; @(#) $Id: cpu_support.src,v 1.2 2007/03/23 07:59:26 honda Exp $
55;
56
57; プロセッサ依存モジュール アセンブリ言語部(H8S用)
58;     カーネル内
59部で使用する定義
60
61 .CPU 2000A
62 .SECTION P, CODE, ALIGN=2
63
64 .INCLUDE "sys_config.inc"
65 .INCLUDE "cpu_config.inc"
66 .INCLUDE "offset.inc"
67
68;  å…
69±é€šéƒ¨ã¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹
70;   変数
71 .IMPORT _runtsk
72 .IMPORT _schedtsk
73 .IMPORT _reqflg
74 .IMPORT _enadsp
75;   関数
76 .IMPORT _ext_tsk
77 .IMPORT _call_texrtn
78
79;  H8S依存部独自
80;   変数
81 .IMPORT _intnest
82 .IMPORT _iscpulocked
83 .IMPORT _task_intmask
84;   関数
85 .IMPORT _cpu_experr
86
87;
88; 割込み禁止/許可
89;  exrレジスタのトレースビットTは保存していない
90;
91
92;
93; 割込み禁止(カーネル管理外の割込みを除く)
94;
95DISINT: .DEFINE "ldc.b #MAX_IPM, exr"
96
97;
98; すべての割込みを許可
99;
100ENAINT: .DEFINE "ldc.b #EXR_ENAINT_ALL, exr"
101
102
103;
104; タスクディスパッチャ
105;
106;  _dispatch は、割込み外ネストカウンタ = 0,割込み禁止状æ…
107‹
108; で呼び出さなければならない._exit_and_dispatch も,割込みネスト
109; カウンタ = 0・割込み禁止状æ…
110‹ã§å‘¼ã³å‡ºã™ã®ãŒåŽŸå‰‡ã§ã‚るが,カーネル
111; 起動時に対応するため,割込みネストカウンタ = 1で呼び出した場合に
112; も対応している.
113
114 .GLOBAL _exit_and_dispatch
115_exit_and_dispatch:
116 ; 割り込み禁止で呼ばれる。
117 mov.b #0, r0l ; 割込みネストカウンタをクリア
118 mov.b r0l, @_intnest
119 bra dispatcher
120
121 ;
122 ; サービスコール内
123から以下の条件で呼ばれる。
124 ;  ・CPUロック状æ…
125‹
126 ;  ・er0,er1を保存
127 ;
128 .GLOBAL _dispatch
129_dispatch:
130 push.l er2 ; er2〜6を保存
131 push.l er3
132 push.l er4
133 push.l er5
134 push.l er6
135 mov.l @_runtsk, er0 ; er0 <- runtsk
136 mov.l sp, @(TCB_sp, er0) ; タスクスタックポインタを保存
137 mov.l #dispatch_r, er1 ; 実行再開番地を保存
138 mov.l er1, @(TCB_pc, er0)
139
140;
141; ディスパッチャ本体
142;
143dispatcher:
144 ; ここには割り込み禁止で来ること
145
146 ; ここでruntskにschedtskを代å…
147¥ã™ã‚‹ã®ã¯ï¼’つの意味がある。
148 ;  (1) schedtsk != NULLの場合
149 ;     通常のタスク切り替えを行う。
150 ;  (2) schedtsk == NULLの場合
151 ;     runtskにNULLを代å…
152¥ã—ておく。
153 ;     (dispatcher_1以降の割込み待
154ちで割込みがå…
155¥ã‚Šã€ãã®ä¸­ã§
156 ;      iget_tid()がコールされたときに正しくTSK_NONEを返すため
157 ;      には、実行状æ…
158‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„時に、runtskをNULLにして
159 ;      おく必
160要がある。)
161
162 mov.l @_schedtsk, er0 ; er0 <- schedtsk
163 mov.l er0, @_runtsk ; schedtsk があるか?
164 beq dispatcher_1 ; 無ければジャンプ
165 mov.l @(TCB_sp, er0), sp ; スタックポインタを復å…
166ƒ
167 mov.l @(TCB_pc, er0), er0 ; 実行再開番地に分岐
168 jmp @er0
169
170 ;
171 ; 実行すべきタスクがない場合の割込み待
172ち
173 ;
174 ; ここで非タスクコンテキストと同じ状æ…
175‹ã«åˆ‡ã‚Šæ›ãˆã‚‹ã®ã¯ï¼Œã“こ
176 ; で発生する割込み処理にどのスタックを使うかという問題の解決
177 ; と,割込みハンドラ内
178でのタスクディスパッチの防止という二つ
179 ; の意味がある.
180dispatcher_1:
181
182 mov.l #STACKTOP, sp ; スタックを割込みスタックに切替え
183 mov.b #1, r0l ; 割込みネストカウンタを1にする
184 mov.b r0l, @_intnest
185
186 ; CPUロックフラグをクリア
187 mov.w #0, r3
188 mov.w r3, @_iscpulocked
189
190dispatcher_2_enable_interrupt:
191
192 ; 割込み許可
193 .AIFDEF SUPPORT_CHG_IPM
194 ; ldc.w @dips, exr命令は、メモリから2バイト読み出し、下位
195 ; 1バイトは捨てられる。.wを付けないと"307 (E) ILLEGAL
196 ; ADDRESSING MODE OR OBJECT CODE SIZE"になる。
197 ldc.w @_task_intmask, exr
198 .AELSE ; SUPPORT_CHG_IPM
199 ldc.b #EXR_ENAINT_ALL, exr
200 .AENDI ; SUPPORT_CHG_IPM
201
202 ; ldc命令直後は割込み禁止であり、割込み要求があっても
203 ; 次の命令が実行される。
204 ; (割込みから戻ってきてsleepするケースはない)
205
206 sleep ; 割込み待
207ち
208 DISINT ; 割り込み禁止
209 mov.w @_reqflg, r0 ; reqflgのチェック
210 ; reqflgはBOOL型 -> int型(16bits)
211 beq dispatcher_2_enable_interrupt
212 mov.w #0,r0
213 mov.w r0, @_reqflg ; reqflgのクリア
214 mov.b r0l, @_intnest ; 割込みネストカウンタをクリア
215 bra dispatcher
216
217
218
219;
220; タスクスイッチの結果ここから実行が再開される
221;
222dispatch_r:
223 pop.l er6 ; er2〜6を復å…
224ƒ
225 pop.l er5
226 pop.l er4
227 pop.l er3
228 pop.l er2
229 ; タスク例外許可状æ…
230‹ã®ãƒã‚§ãƒƒã‚¯
231 mov.l @_runtsk, er0 ; er0←runtsk
232 mov.b @(TCB_enatex,er0),r1l
233 btst #TCB_enatex_bit,r1l ; TCB.enatex=0->CCR.Z=1
234 beq _dispatch_r_1 ; タスク例外処理禁止状æ…
235‹ãªã‚‰ã‚¸ãƒ£ãƒ³ãƒ—
236
237 ; タスク例外処理要求のチェック
238 ; TEXPTNはunsigned int型=16ビット
239 mov.w @(TCB_texptn,er0),r1
240 beq _dispatch_r_1 ; 保留例外要因がなければジャンプ
241
242 jmp @_call_texrtn ; タスク例外処理処理ルーチンの呼び出し
243 ;  _call_texrtnからここには戻らず
244 ;  dispatch()の呼び出しå…
245ƒã¸æˆ»ã‚‹
246_dispatch_r_1:
247 rts ; dispatch()の呼び出しå…
248ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
249 ;  CPUロック解除は呼び出しå…
250ƒã§è¡Œã†ã€‚
251
252
253
254;
255; 割込みの出口処理でスタックポインタが指している番地からEXRレジスタが
256; 積まれている番地までのオフセットの定義
257;
258;  +0:er3
259;  +4:er2
260;  +8:er1
261; +12:er0
262; +16:exr ←ここをsp相対アクセスする
263
264OFFSET_EXR: .DEFINE "16"
265
266
267
268;
269; 割込みハンドラå…
270¥å£å‡¦ç†
271;  割込み要因に依らず、å…
272±é€šãªéƒ¨åˆ†
273;  (vector.srcのINTHDR_ENTRYからの続き)
274;
275;    以下の状æ…
276‹ã§ã“こにやってくる
277;     ・割込み許可(割込みプライオリティレベルはexrに設定済み)
278;     ・er0:退避済み
279;     ・er0:C言語ルーチンのå…
280ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
281;    
282;    コーリングコンベンションを考えるとer3の退避は不要だが、
283;    テンポラリが少ないと、ソースコードの可読性が悪くなるため
284;    er3も退避している。
285;    
286
287 .GLOBAL _common_interrupt_process
288_common_interrupt_process:
289 push.l er1 ; er1〜er3の退避
290 push.l er2
291 push.l er3
292 stc.b exr, r1l ; exrのコピー
293
294 ; デバッグ環境によっては、Tビットのクリアが必
295要
296 .AIFDEF USE_DEBUGGER
297 and.b #EXR_I_MASK, r1l
298 .AENDI ; USE_DEBUGGER
299
300 DISINT ; 割込み禁止
301 mov.b @_intnest, r3l ; 割込みネストカウンタのインクリメント
302 inc.b r3l;
303 mov.b r3l, @_intnest
304 cmp.b #1, r3l ; 割込み発生時のコンテキストの判別
305 bne _interrupt_from_int ; 多重割込みの処理へ
306
307 ;
308 ; 初段の割込みの場合
309 ;
310 mov.l sp, er3 ; スタック切替
311 mov.l #STACKTOP, sp
312 ldc.b r1l, exr ; 割込み許可
313 jsr @er0 ; C言語ルーチン呼び出し
314 DISINT ; 割込み禁止
315 ; スタック切替
316 ;  er3はC言語ルーチンを呼び出しても破壊されない。
317 mov.l er3, sp
318 mov.b #0, r0l ; 割込みネストカウンタのクリア
319 mov.b r0l, @_intnest
320 mov.w @_reqflg, e0 ; reqflgのチェック
321 beq _ret_to_task_int ; reqflgがFALSEなら_ret_to_task_intに飛ぶ
322
323 ;
324 ; 戻りå…
325ˆãŒå‰²è¾¼ã¿ã®å…
326¥å£å‡¦ç†ã‹å¦ã‹ã®åˆ¤å®š
327 ;   
328 ;   H8Sの割込み制御モード2では割込み受付け直後に割込み禁止
329 ;   になっていないため、å…
330¥å£å‡¦ç†ã®é€”中で割込みがå…
331¥ã‚‹å¯èƒ½æ€§ãŒ
332 ;   ある。
333 ;   その場合はreqflg=TRUEのまま、初段の割込み処理に戻る。
334 ;   もし、ここでreqflgをクリアしてしまうと、初段の割込みの
335 ;   出口処理でディスパッチャ呼び出し(またはタスク例外処理)を
336 ;   スキップしてしまう危険がある。
337 ;   
338 ;   判定にはスタックに積まれたexrレジスタの値(Iビット)を
339 ;   用いる。
340 ;   
341
342 mov.b @(OFFSET_EXR, sp), r0l ; r01 = スタック上のEXR
343
344 ; スタックに積まれたexrレジスタの値もビット6-3に1がå…
345¥ã£ã¦ã„るので
346 ; クリアしておく。
347 and.b #EXR_I_MASK, r0l
348
349 .AIFDEF SUPPORT_CHG_IPM
350 mov.b @_task_intmask, r1l
351 cmp.b r0l, r1l
352 .AELSE ; SUPPORT_CHG_IPM
353 cmp.b #EXR_ENAINT_ALL, r0l
354 .AENDI ; SUPPORT_CHG_IPM
355
356 bne _ret_to_task_int ; 割込み発生場所が、割込みのå…
357¥å£å‡¦ç†
358
359 mov.w #0, e0 ; reqflgをクリア
360 mov.w e0, @_reqflg
361 bra ret_int ; 出口処理へジャンプ
362
363
364 ;
365 ; 多重割込みの場合;
366 ;  以下の状æ…
367‹ã§ã“こにやってくる
368 ;   ・割込み禁止
369 ;   ・er0:C言語ルーチンのå…
370ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
371 ;   ・r3l:割込みネストカウンタ
372 ;
373_interrupt_from_int:
374 ldc.b r1l, exr ; 割込み許可
375 jsr @er0 ; C言語ルーチン呼び出し
376 DISINT ; 割込み禁止
377
378 ; 割込みネストカウンタのディクリメント
379 ;  r3lはC言語ルーチンを呼び出しても破壊されない。
380 dec.b r3l
381 mov.b r3l, @_intnest
382
383 ; 本来はここで戻りå…
384ˆãŒã€å‰²è¾¼ã¿å¾…
385ちのsleep命令かどうかのチェッ
386 ; クが必
387要である。(もし、割込みハンドラ内
388でreqflg=TRUEにして
389 ; もディスパッチャが呼ばれない=タスクが実行されない)
390 ; H8Sの場合、sleep命令の直前にある割込み許可のldc命令の実行直
391 ; 後は割込み禁止であり、割込み要求があったとしても割込みは受
392 ; け付けないで、sleep命令が実行される。そのため、割込みから
393 ; 戻った直後にsleep命令が実行されるケースは考æ…
394®ã—なくて良い。
395
396 ;
397 ; ディスパッチャを呼ばずに、割込みå…
398ƒã«æˆ»ã‚‹å ´åˆ
399 ;
400_ret_to_task_int:
401 pop.l er3 ; レジスタを復å…
402ƒ
403 pop.l er2
404 pop.l er1
405 pop.l er0
406 rte ; 割込みå…
407ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
408
409
410;
411; 割込みハンドラ出口処理
412;
413; 戻りå…
414ˆãŒã‚¿ã‚¹ã‚¯ã§reqflgがセットされている場合のみここにくる。
415; 割込みネストカウンタ = 0,割込み禁止状æ…
416‹,スクラッチレジスタを
417; 保存した状æ…
418‹ã§å‘¼ã³å‡ºã™ã“と。
419
420ret_int:
421 ; enadspのチェック
422 mov.w @_enadsp, r0 ; enadspはBOOL型 -> int型(16bits)
423 beq ret_int_1 ; ディスパッチ禁止ならret_int_1へ
424
425 mov.l @_runtsk, er0 ; er0 <- runtsk
426 mov.l @_schedtsk, er1 ; er1 <- schedtsk
427 cmp.l er0, er1 ; runtsk と schedtsk を比較
428 beq ret_int_1 ; 同じならret_int_1へ
429
430 push.l er4 ; レジスタ退避
431 push.l er5
432 push.l er6
433 mov.l sp, @(TCB_sp, er0) ; タスクスタックポインタを保存
434 mov.l #ret_int_r, er1 ; 実行再開番地を保存
435 mov.l er1, @(TCB_pc, er0)
436 bra dispatcher
437
438 ;
439 ; 割込みの出口でディスパッチャからここに戻ってくる
440 ;
441ret_int_r:
442 pop.l er6 ; レジスタ復å…
443ƒ
444 pop.l er5
445 pop.l er4
446
447 ;
448 ; タスクスイッチしない場合はここから合流する
449 ;
450ret_int_1:
451 ; タスク例外許可状æ…
452‹ã®ãƒã‚§ãƒƒã‚¯
453 mov.l @_runtsk, er0 ; er0←runtsk
454 mov.b @(TCB_enatex,er0),r1l
455 btst #TCB_enatex_bit,r1l ; TCB.enatex=0->CCR.Z=1
456 beq ret_int_2 ; タスク例外禁止状æ…
457‹ãªã‚‰ã‚¸ãƒ£ãƒ³ãƒ—
458
459 ; タスク例外処理要求のチェック
460 mov.w @(TCB_texptn,er0),r1 ; TEXPTNはunsigned int型=16ビット
461 beq ret_int_2 ; 保留例外要因がなければジャンプ
462 jsr @_call_texrtn ; タスク例外処理ルーチン起動
463
464ret_int_2:
465 ;  
466 ; ディスパッチャやタスク例外処理を経由すると
467 ; iscpulockedがセットされるので、ここでクリアする。
468 ; (CPUロックフラグ)
469 ;  
470 mov.w #0, r0
471 mov.w r0, @_iscpulocked
472
473 .AIFDEF SUPPORT_CHG_IPM
474 ; スタックに積んであるexr(戻りå…
475ˆã®å‰²è¾¼ã¿ãƒžã‚¹ã‚¯ï¼‰ã‚’
476 ; task_intmaskにする。(下記参ç…
477§ï¼‰
478 mov.b @_task_intmask, r1l
479 mov.b r1l, @(OFFSET_EXR, sp)
480 .AENDI ;SUPPORT_CHG_IPM
481 ; レジスタを復å…
482ƒ
483 pop.l er3 ;  +0:er3
484 pop.l er2 ;  +4:er2
485 pop.l er1 ;  +8:er1
486 pop.l er0 ; +12:er0
487 ; +16:exr ←ここを書き換える
488 rte ; 割込みå…
489ƒã«ãƒªã‚¿ãƒ¼ãƒ³
490
491;
492; タスク起動処理
493;
494;    CPUロックで呼び出される。
495;
496;    タスク実行開始直後はタスク例外処理禁止状æ…
497‹ã«ãªã£ã¦ã„るので、
498;    _activate_rでは保留例外要因のチェックをする必
499要がない。
500;
501
502 .GLOBAL _activate_r
503_activate_r:
504 ; t_unlock_cpu 相当の処理
505 mov.w #0, r0 ; CPUロックフラグをクリア
506 mov.w r0, @_iscpulocked
507 ; 割込み許可
508 .AIFDEF SUPPORT_CHG_IPM
509 mov.b @_task_intmask, r0l ; 割込みマスクをtask_intmaskに
510 ldc.b r0l, exr
511 .AELSE ; SUPPORT_CHG_IPM
512 ENAINT ; 割込み許可
513 .AENDI ;SUPPORT_CHG_IPM
514
515 mov.l #_ext_tsk, er0
516 push.l er0 ; タスクからの戻り番地を設定
517
518 ; ここで割込みが発生してタスクスイッチが起こったとしても、
519 ; ここに戻くるときには、runtskの値はå…
520ƒã«æˆ»ã£ã¦ã„る。
521
522 mov.l @_runtsk, er2
523 mov.l @(TCB_tinib, er2), er2
524 mov.l @(TINIB_task, er2), er1 ; タスク起動番地を設定
525
526 ; 拡張情
527報(タスクへの引数)を設定
528 mov.l @(TINIB_exinf, er2), er0
529 jmp @er1
530
531;
532; 微少時間待
533ち
534; void sil_dly_nse_long(UW dlytim)
535;
536;   注意事項
537:
538;    標準ではdlytimはUINT型だが16ビットしかないので、
539;    UW型に変更している。
540;
541 .GLOBAL _sil_dly_nse_long
542_sil_dly_nse_long:
543 sub.l #SIL_DLY_TIM1, er0
544 ble sil_dly_nse_2
545 ; dlytim < SIL_DLY_TIM1 ならループ終了
546sil_dly_nse_1:
547 sub.l #SIL_DLY_TIM2, er0
548 bgt sil_dly_nse_1
549 ; dlytim > SIL_DLY_TIM2 ならループ続行
550sil_dly_nse_2:
551 rts
552
553
554;**************************************************************
555; 以下、å…
556±é€šéƒ¨ã¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ã¯å«ã¾ã‚Œãªã„独自の部分
557;**************************************************************
558
559;
560; no_reg_exception()
561; CPU例外として登録されていない例外が発生すると呼び出される。
562; 例外が発生した時点のPC,ER0〜7を出力してカーネル
563; を停止する。
564 .GLOBAL _no_reg_exception
565_no_reg_exception:
566
567 ; er0〜6を保存
568 push.l er6 ;   +0:er0
569 push.l er5 ;   +4:er1
570 push.l er4 ;   +8:er2
571 push.l er3 ;  +12:er3
572 push.l er2 ;  +16:er4
573 push.l er1 ;  +20:er5
574 push.l er0 ;  +24:er6
575 ;  +28:exr
576 ;  +29:リザーブ
577 ;  +30:crr
578 ;  +31:pc
579 ;  +34〜:割込み前に使用されていたスタック領域
580
581 mov.l sp, er0 ; 引数設定
582 ; SPは+34で、発生時点の値
583 jsr @_cpu_experr ; cpu_experr()の呼び出し
584
585
586 .END
587
Note: See TracBrowser for help on using the repository browser.