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

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

initial

File size: 18.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.8 2007/03/23 07:58:33 honda Exp $
55;
56
57; プロセッサ依存モジュール アセンブリ言語部(H8用)
58;     カーネル内
59部で使用する定義
60
61 .CPU 300HA
62 .SECTION P, CODE, ALIGN=2
63
64 .INCLUDE "sys_config_asm.inc"
65 .INCLUDE "cpu_config_asm.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;  H8依存部独自
80;   変数
81 .IMPORT _intnest
82 .IMPORT _iscpulocked
83 .IMPORT _task_intmask
84;   関数
85 .IMPORT _cpu_experr
86
87;
88; NMIを除くすべての割込みを禁止
89;
90DISINT: .DEFINE "orc.b #CCR_DISINT_ALL, ccr"
91
92;
93; すべての割込みを許可
94;
95ENAINT: .DEFINE "andc.b #CCR_ENAINT_ALL, ccr"
96
97
98;
99; タスクディスパッチャ
100;
101;  _dispatch は、割込み外ネストカウンタ = 0,割込み禁止状æ…
102‹
103; で呼び出さなければならない._exit_and_dispatch も,割込みネスト
104; カウンタ = 0・割込み禁止状æ…
105‹ã§å‘¼ã³å‡ºã™ã®ãŒåŽŸå‰‡ã§ã‚るが,カーネル
106; 起動時に対応するため,割込みネストカウンタ = 1で呼び出した場合に
107; も対応している.
108
109 .GLOBAL _dispatch
110_dispatch:
111 push.l er2 ; er2〜6を保存
112 push.l er3
113 push.l er4
114 push.l er5
115 push.l er6
116 mov.l @_runtsk, er0 ; er0 <- runtsk
117 mov.l sp, @(TCB_sp, er0) ; タスクスタックポインタを保存
118 mov.l #dispatch_r, er1 ; 実行再開番地を保存
119 mov.l er1, @(TCB_pc, er0)
120 bra dispatcher
121
122
123; タスクスイッチの結果ここから実行が再開される
124
125dispatch_r:
126 pop.l er6 ; er2〜6を復å…
127ƒ
128 pop.l er5
129 pop.l er4
130 pop.l er3
131 pop.l er2
132 ; タスク例外許可状æ…
133‹ã®ãƒã‚§ãƒƒã‚¯
134 mov.l @_runtsk, er0 ; er0←runtsk
135 mov.b @(TCB_enatex,er0),r1l
136 btst #TCB_enatex_bit,r1l ; TCB.enatex=0->CCR.Z=1
137 beq _dispatch_r_1 ; タスク例外処理禁止状æ…
138‹ãªã‚‰ã‚¸ãƒ£ãƒ³ãƒ—
139
140 ; タスク例外処理要求のチェック
141 mov.w @(TCB_texptn,er0),r1
142 beq _dispatch_r_1 ; 保留例外要因がなければジャンプ
143
144 jmp @_call_texrtn ; タスク例外処理処理ルーチンの呼び出し
145 ;  _call_texrtnからここには戻らず
146 ;  dispatch()の呼び出しå…
147ƒã¸æˆ»ã‚‹
148_dispatch_r_1:
149 rts ; dispatch()の呼び出しå…
150ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
151
152
153
154 .GLOBAL _exit_and_dispatch
155_exit_and_dispatch:
156 ; 割り込み禁止で呼ばれる。
157 mov.b #0, r0l ; 割込みネストカウンタをクリア
158 mov.b r0l, @_intnest
159
160;
161; ディスパッチャ本体
162;
163dispatcher:
164 ; ここには割り込み禁止で来ること
165
166 ; ここでruntskにschedtskを代å…
167¥ã™ã‚‹ã®ã¯ï¼’つの意味がある。
168 ;  (1) schedtsk != NULLの場合
169 ;     通常のタスク切り替えを行う。
170 ;  (2) schedtsk == NULLの場合
171 ;     runtskにNULLを代å…
172¥ã—ておく。
173 ;     (dispatcher_1以降の割込み待
174ちで割込みがå…
175¥ã‚Šã€ãã®ä¸­ã§
176 ;      iget_tid()がコールされたときに正しくTSK_NONEを返すため
177 ;      には、実行状æ…
178‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„時に、runtskをNULLにして
179 ;      いる必
180要がある。)
181
182 mov.l @_schedtsk, er0 ; er0 <- schedtsk
183 mov.l er0, @_runtsk
184 beq dispatcher_1 ; schedtskが無ければジャンプ
185 mov.l @(TCB_sp, er0), sp
186 mov.l @(TCB_pc, er0), er0 ; 実行再開番地を復帰
187 jmp @er0
188
189 ;
190 ; 実行すべきタスクがない場合の割込み待
191ち
192 ;
193 ; ここで割込みモードに切り換えるのは,ここで発生する割込み処理
194 ; にどのスタックを使うかという問題の解決と,割込みハンドラ内
195で
196 ; のタスクディスパッチの防止という二つの意味がある.
197dispatcher_1:
198
199 mov.l #STACKTOP, sp ; スタックを割り込みスタックに切替え
200 mov.b #1, r0l ; 割込みネストカウンタを1にする
201 mov.b r0l, @_intnest
202
203 ; r1l:割込み許可時にccrに設定する値
204 ;    割込みハンドラ内
205ではchg_ipmが使用できないので、
206 ;    task_intmaskは1回読み込んでおけば、OK
207 .AIFDEF SUPPORT_CHG_IPM
208 mov.b @_task_intmask, r1l
209 .AELSE ; SUPPORT_CHG_IPM
210 mov.b #CCR_ENAINT_ALL, r1l
211 .AENDI ; SUPPORT_CHG_IPM
212
213 .AIFDEF EXCLUSIVE_BUS
214 ; 下記の説明を参ç…
215§
216 mov.l H8BRCR, er2
217 .AENDI ; EXCLUSIVE_BUS
218
219 ; CPUロックフラグをクリア
220 mov.w #0, r3
221 mov.w r3, @_iscpulocked
222
223dispatcher_2_enable_interrupt:
224 .AIFDEF EXCLUSIVE_BUS
225 ; sleepしている間にバス権要求が競合しないようにバス権の
226 ; 外部への解放を禁止する。
227 ; ハードウェア・マニュアル「6.4.4 ソフトウェア・スタンバイ・
228 ; モードへの遷移」参ç…
229§
230 bclr H8BRCR_BRLE_BIT, @er2
231 .AENDI ; EXCLUSIVE_BUS
232
233 ; ldc命令直後は割込み禁止であり、割込み要求があっても
234 ; 次の命令が実行される。
235 ; (割込みから戻ってきてsleepするケースはない)
236 ldc.b r1l, ccr ; 割り込み許可
237 sleep ; 割込み待
238ち
239 DISINT ; 割り込み禁止
240
241 .AIFDEF EXCLUSIVE_BUS
242 bset H8BRCR_BRLE_BIT, @er2
243 .AENDI ; EXCLUSIVE_BUS
244
245 mov.w @_reqflg, r0 ; reqflgのチェック
246 ; reqflgはBOOL型 -> int型(16bits)
247 beq dispatcher_2_enable_interrupt
248 mov.w #0,r0
249 mov.w r0, @_reqflg ; reqflgのクリア
250 mov.b r0l, @_intnest ; 割込みネストカウンタをクリア
251 bra dispatcher
252
253
254;
255; 割込みハンドラå…
256¥å£å‡¦ç†
257;  割込み要因に依らず、å…
258±é€šãªéƒ¨åˆ†
259;  (vector.srcのINTHDR_ENTRYからの続き)
260;
261;    以下の状æ…
262‹ã§ã“こにやってくる
263;     ・割込み禁止
264;     ・er0〜er3退避済み
265;     ・er2:C言語ルーチンのå…
266ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
267;     ・r3l:割込み許可時に割込みマスクに設定する値
268
269 .GLOBAL _common_interrupt_process
270_common_interrupt_process:
271 mov.b @_intnest, r0l ; 割込みネストカウンタのチェック
272 bne _interrupt_from_int ; 多重割込みの処理へ
273
274 ;
275 ; 初段の割込みの場合
276 ;
277 mov.b #1, r1l ; 割込みネストカウンタ←1
278 mov.b r1l, @_intnest
279 mov.l sp, er0
280 mov.l #STACKTOP, sp ; スタック切替
281 push.l er0 ; タスクスタックポインタの退避
282 ldc.b r3l, ccr ; 割込み許可
283 jsr @er2 ; C言語ルーチン呼び出し
284 DISINT ; 割込み禁止
285 mov.b #0, r0l ; 割込みネストカウンタのクリア
286 mov.b r0l, @_intnest
287 mov.l @sp, sp ; スタック切替
288 mov.w @_reqflg, e0 ; reqflgのチェック
289 beq _ret_to_task_int ; reqflgがFALSEならret_to_task_intに飛ぶ
290 mov.w #0, e0
291 mov.w e0, @_reqflg ; reqflgをクリア
292 bra ret_int ; 出口処理へジャンプ
293
294 ;
295 ; 多重割込みの場合;
296 ;  割込み禁止でここにやってくる
297 ;
298 ;  割込みネストカウンタのインクリメントは以下の理由で
299 ;  省略している
300 ;   ・割込みが2レベルしかない
301 ;   ・CPU例外をサポートしない
302 ;     exc_sense_context()のことを考æ…
303®ã—なくても良い
304 ;
305_interrupt_from_int:
306 ; 割込みネストカウンタのインクリメントは省略
307 ldc.b r3l, ccr ; 割込み許可
308 jsr @er2 ; C言語ルーチン呼び出し
309 DISINT ; 割込み禁止
310 ; 割込みネストカウンタのディクリメントは省略
311
312 ; 本来はここで戻りå…
313ˆãŒã€å‰²è¾¼ã¿å¾…
314ちのsleep命令かどうかのチェッ
315 ; クが必
316要である。(もし、割込みハンドラ内
317でreqflg=TRUEにして
318 ; もディスパッチャが呼ばれない=タスクが実行されない)
319 ; H8の場合、sleep命令の直前にある割込み許可のldc命令の実行直
320 ; 後は割込み禁止であり、割込み要求があったとしても割込みは受
321 ; け付けないで、sleep命令が実行される。そのため、割込みから
322 ; 戻った直後にsleep命令が実行されるケースは考æ…
323®ã—なくて良い。
324
325 ;
326 ; ディスパッチャを呼ばずに、割込みå…
327ƒã«æˆ»ã‚‹å ´åˆ
328 ;
329_ret_to_task_int:
330 pop.l er3 ; レジスタを復å…
331ƒ
332 pop.l er2
333 pop.l er1
334 pop.l er0
335 rte ; 割込みå…
336ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
337
338
339; 出口処理においてスタックポインタが指している番地からCCRレジスタが
340; 積まれている番地までのオフセットの定義
341;
342;  +0:er3
343;  +4:er2
344;  +8:er1
345; +12:er0
346; +16:ccr ←ここをsp相対アクセスする
347
348OFFSET_CCR: .DEFINE "16"
349
350;
351; 割込みハンドラ出口処理
352;
353; 戻りå…
354ˆãŒã‚¿ã‚¹ã‚¯ã§reqflgがセットされている場合のみここにくる。
355; 割込みネストカウンタ = 0,割込み禁止状æ…
356‹,スクラッチレジスタを
357; 保存した状æ…
358‹ã§å‘¼ã³å‡ºã™ã“と。
359
360ret_int:
361 ; enadspのチェック
362 mov.w @_enadsp, r0 ; enadspはBOOL型 -> int型(16bits)
363 beq ret_int_1 ; ディスパッチ禁止ならret_int_1へ
364
365 mov.l @_runtsk, er0 ; er0 <- runtsk
366 mov.l @_schedtsk, er1 ; er1 <- schedtsk
367 cmp.l er0, er1 ; runtsk と schedtsk を比較
368 beq ret_int_1 ; 同じならret_int_1へ
369
370 push.l er4 ; レジスタ退避
371 push.l er5
372 push.l er6
373 mov.l sp, @(TCB_sp, er0) ; タスクスタックポインタを保存
374 mov.l #ret_int_r, er1 ; 実行再開番地を保存
375 mov.l er1, @(TCB_pc, er0)
376 bra dispatcher
377
378 ;
379 ; 割込みの出口でディスパッチャからここに戻ってくる
380 ;
381ret_int_r:
382 pop.l er6 ; レジスタ復å…
383ƒ
384 pop.l er5
385 pop.l er4
386
387 ;
388 ; タスクスイッチしない場合はここから合流する
389 ;
390ret_int_1:
391 ; タスク例外許可状æ…
392‹ã®ãƒã‚§ãƒƒã‚¯
393 mov.l @_runtsk, er0 ; er0←runtsk
394 mov.b @(TCB_enatex,er0),r1l
395 btst #TCB_enatex_bit,r1l ; TCB.enatex=0->CCR.Z=1
396 beq ret_int_2 ; タスク例外禁止状æ…
397‹ãªã‚‰ã‚¸ãƒ£ãƒ³ãƒ—
398
399 ; タスク例外処理要求のチェック
400 mov.w @(TCB_texptn,er0),r1
401 beq ret_int_2 ; 保留例外要因がなければジャンプ
402 jsr @_call_texrtn ; タスク例外処理ルーチン起動
403
404ret_int_2:
405 ; CPUロックフラグをクリア
406 mov.w #0, r0
407 mov.w r0, @_iscpulocked
408
409 .AIFDEF SUPPORT_CHG_IPM
410 ; スタックに積んであるccr(戻りå…
411ˆã®å‰²è¾¼ã¿ãƒžã‚¹ã‚¯ï¼‰ã‚’
412 ; task_intmaskにする。(下記参ç…
413§ï¼‰
414 mov.b @(OFFSET_CCR, sp), r0l
415 mov.b @_task_intmask, r1l
416 and.b #CCR_ENAINT_ALL, r0l
417 or.b r1l, r0l
418 mov.b r0l, @(OFFSET_CCR, sp)
419 .AENDI ;SUPPORT_CHG_IPM
420 ; レジスタを復å…
421ƒ
422 pop.l er3 ;  +0:er3
423 pop.l er2 ;  +4:er2
424 pop.l er1 ;  +8:er1
425 pop.l er0 ; +12:er0
426 ; +16:ccr ←ここを書き換える
427 rte ; 割込みå…
428ƒã«ãƒªã‚¿ãƒ¼ãƒ³
429
430;
431; タスク起動処理
432;
433;    CPUロック状æ…
434‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ã€‚
435;
436;    タスク実行開始直後はタスク例外処理禁止状æ…
437‹ã«ãªã£ã¦ã„るので、
438;    _activate_rでは保留例外要因のチェックをする必
439要がない。
440;
441
442 .GLOBAL _activate_r
443_activate_r:
444 ; t_unlock_cpu 相当の処理
445 mov.w #0, r0 ; CPUロックフラグをクリア
446 mov.w r0, @_iscpulocked
447 .AIFDEF SUPPORT_CHG_IPM
448 mov.b @_task_intmask, r0l ; 割込みマスクをtask_intmaskに
449 ldc.b r0l, ccr
450 .AELSE ; SUPPORT_CHG_IPM
451 ENAINT ; 割込み許可
452 .AENDI ;SUPPORT_CHG_IPM
453
454 mov.l #_ext_tsk, er0
455 push.l er0 ; タスクからの戻り番地を設定
456
457 ; ここで割込みが発生してタスクスイッチが起こったとしても、
458 ; ここに戻くるときには、runtskの値はå…
459ƒã«æˆ»ã£ã¦ã„る。
460
461 mov.l @_runtsk, er2
462 mov.l @(TCB_tinib, er2), er2
463 mov.l @(TINIB_task, er2), er1 ; タスク起動番地を設定
464
465 ; 拡張情
466報(タスクへの引数)を設定
467 mov.l @(TINIB_exinf, er2), er0
468 jmp @er1
469
470;
471; 微少時間待
472ち
473; void sil_dly_nse_long(UW dlytim)
474;
475;   注意事項
476:
477;    標準ではdlytimはUINT型だが16ビットしかないので、
478;    UW型に変更している。
479;
480 .GLOBAL _sil_dly_nse_long
481_sil_dly_nse_long:
482 sub.l #SIL_DLY_TIM1, er0
483 ble sil_dly_nse_2
484 ; dlytim < SIL_DLY_TIM1 ならループ終了
485sil_dly_nse_1:
486 sub.l #SIL_DLY_TIM2, er0
487 bgt sil_dly_nse_1
488 ; dlytim > SIL_DLY_TIM2 ならループ続行
489sil_dly_nse_2:
490 rts
491
492
493;**************************************************************
494; 以下、å…
495±é€šéƒ¨ã¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ã¯å«ã¾ã‚Œãªã„独自の部分
496;**************************************************************
497
498;
499; no_reg_exception()
500; CPU例外として登録されていない例外が発生すると呼び出される。
501; 例外が発生した時点のPC,ER0〜7を出力してカーネル
502; を停止する。
503 .GLOBAL _no_reg_exception
504_no_reg_exception:
505
506 ; er0〜6を保存
507 push.l er6 ;   +0:er0
508 push.l er5 ;   +4:er1
509 push.l er4 ;   +8:er2
510 push.l er3 ;  +12:er3
511 push.l er2 ;  +16:er4
512 push.l er1 ;  +20:er5
513 push.l er0 ;  +24:er6
514 ;  +25:crr
515 ;  +26:pc
516 ;  +28〜:割込み前に使用されていたスタック領域
517
518 mov.l sp, er0 ; 引数設定
519 ; SPは+28で、発生時点の値
520 jsr @_cpu_experr ; cpu_experr()の呼び出し
521
522
523 .END
524
Note: See TracBrowser for help on using the repository browser.