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

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

initial

File size: 13.1 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-2003 by Embedded and Real-Time Systems Laboratory
7;* Toyohashi Univ. of Technology, JAPAN
8;* Copyright (C) 2003-2005 by Naoki Saito
9;* Nagoya Municipal Industrial Research Institute, JAPAN
10;* Copyright (C) 2003-2004 by Ryosuke Takeuchi
11;* Platform Development Center RICOH COMPANY,LTD. 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.a30,v 1.4 2005/11/24 12:41:23 honda Exp $
55
56
57;
58; プロセッサ依存モジュール アセンブリ言語部(M32C用)
59;
60
61;
62; offset.inc はTCBのå…
63ˆé ­ã‹ã‚‰ãƒ¡ãƒ³ãƒã¾ã§ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆå®šç¾©ãƒ•ã‚¡ã‚¤ãƒ«
64;
65 .include offset.inc
66
67 .glb __kernel_runtsk
68 .glb __kernel_schedtsk
69 .glb __kernel_reqflg
70 .glb __kernel_enadsp
71
72 .glb __kernel_dispatch
73 .glb __kernel_exit_and_dispatch
74 .glb __kernel_activate_r
75 .glb __kernel_call_texrtn
76 .glb __kernel_interrupt
77 .glb __kernel_intnest
78
79 .glb _iana_tsk
80 .glb __kernel_break_wait
81
82 .section program, code, align
83;
84; タスクディスパッチャ
85;
86; dispatch は,タスクコンテキスト状æ…
87‹ãƒ»å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
88‹ã§å‘¼ã³å‡ºã•ãªã‘
89; ればならない.exit_and_dispatch も,タスクコンテキスト状æ…
90‹ãƒ»å‰²è¾¼
91; み禁止状æ…
92‹ã§å‘¼ã³å‡ºã™ã®ãŒåŽŸå‰‡ã§ã‚るが,カーネル起動時に対応するため,
93; 割込みモードで呼び出した場合にも対応している.
94; 呼び出し条件: IPL=0, FLGレジスタIビット=0 (CPUロック状æ…
95‹),
96; intnest = 0(タスクコンテキスト), タスクスタック
97;
98__kernel_dispatch:
99 pushm r0,r1,r2,r3,a0,a1,sb,fb ; スタックへレジスタ保存
100 mov.l __kernel_runtsk, a0
101 stc isp, TCB_sp[a0] ; スタックポインタをTCBに保存
102 mov.l #dispatch_r, TCB_pc[a0] ; 実行再開番地をTCBに保存
103 jmp.b dispatcher
104;
105; 呼び出し条件: IPL=0, FLGレジスタIビット=0 (CPUロック状æ…
106‹),
107; intnest = 0(タスクコンテキスト), タスクスタック
108;
109; a0 にはruntsk のアドレスが格納されている
110;
111dispatch_r:
112 mov.b TCB_enatex[a0], r0l
113 btst TCB_enatex_bit, r0l ; タスク例外処理許可?
114 jz dispatch_r_1 ; 許可でなければ dispatch_r_1 へ
115 mov.w TCB_texptn[a0], r0 ; 保留例外要因があるか?
116 jz dispatch_r_1 ; なければ dispatch_r_1 へ
117 jsr.a __kernel_call_texrtn ; タスク例外ハンドラへ
118dispatch_r_1: ; タスク例外を実行しない場合
119 popm r0,r1,r2,r3,a0,a1,sb,fb ; タスクスタックからレジスタ復帰
120 rts ; dispatch 呼び出しå…
121ƒã¸æˆ»ã‚‹.
122
123
124;
125; タスク起動時処理
126;
127; ここでは, CPUロック解除状æ…
128‹ã«ã—, タスクを起動する.
129;
130; 呼出条件: FLGレジスタIビット=0 (CPUロック状æ…
131‹), タスクスタック
132; IPL=0, タスクコンテキスト(intnest=0)
133;
134__kernel_activate_r:
135 pop.w r0
136 pop.w r2
137 mov.l r2r0, a0 ; タスクの起動番地をA0に設定
138 ldc #0040h, flg ; 割込み許可, ISP, IPL=0
139 jmpi.a a0
140
141;
142; dispatch呼び出し条件:
143; ・すべてのタスクのコンテキストは保存されている.
144; ・FLGレジスタIビット=0 (CPUロック状æ…
145‹)
146; ・コンテキストはカーネル起動時を除きタスクコンテキスト(intnest=0)
147; 起動時は非タスクコンテキスト(intnest=1)で, その場合にも対応.
148; dispatcher 呼出時のスタック:
149; __kernel_dispatch からきた場合: タスクスタック
150; exit_and_dispatch からきた場合:
151; exit_task からきた場合はタスクスタック
152; カーネル起動時は割込みスタック
153; ret_int からきた場合: 割込みスタック
154; dispatcher_2 での割込み待
155ちからきた場合: 割込みスタック
156;
157
158__kernel_exit_and_dispatch:
159 fclr i ; 割込み禁止
160 mov.b #0, __kernel_intnest ; ネストカウンタクリア
161dispatcher:
162 mov.l __kernel_schedtsk, a0 ;
163 mov.l a0, __kernel_runtsk ; schedtsk を runtsk に
164 .IF MON == 1
165; タスクモニター機能用分岐
166; 不要の場合は (MON = 0)
167 jsr.a _iana_tsk ; タスク実行情
168報の設定
169 mov.l __kernel_runtsk,a0 ; a0を復帰
170 .ENDIF
171 jz dispatcher_1 ; schedtsk がなければ割込み待
172ち
173 ldc TCB_sp[a0], isp ; タスクスタックポインタを復帰
174 jmpi.a TCB_pc[a0] ; 実行再開番地へジャンプ
175;
176; schdedtskが NULL の場合は、これより下には行かない
177;
178dispatcher_1:
179 ldc #RAMEND, isp ; 割込み用のスタックへ切替え
180 inc.b __kernel_intnest ; 非タスクコンテキスト
181dispatcher_2:
182 fset i ; 割込み待
183ち
184 .IF USE_KD3083 != 1 ; KD3083を使用するときはwait命令を使わない
185 wait
186 .ENDIF
187 nop
188 nop
189 nop
190 nop
191;
192; ここで非タスクコンテキスト,割込みスタックに切り換えたのは,
193; ここで発生する割込み処理にどのスタックを使うかという問題の解決と,
194; 割込みハンドラ内
195でのディスパッチ防止という2つの意味がある.
196;
197 fclr i ; 割込み禁止
198 mov.w __kernel_reqflg, r0 ; reqflg が FALSE なら
199 jz dispatcher_2 ; dispatcher_2 へ
200 mov.w #0, __kernel_reqflg ; reqflgがTRUEならFALSEにする
201 dec.b __kernel_intnest ; タスクコンテキストに戻す
202 jmp.b dispatcher ; dispatcher へ戻る
203
204
205;
206; 割込みハンドラ/CPU例外ハンドラ出口処理
207;
208; 呼出し条件:
209; ・FLGレジスタのIビット=0, IPL=0, タスクコンテキスト(intnest=0)
210; ・使用スタックはタスクスタック, reqflg = TRUE
211;
212ret_int:
213 mov.w #0, __kernel_reqflg ; reqflg <--- FALSE
214 mov.l __kernel_runtsk, a0 ; すぐ ret_int_r にジャンプする場合があるのでここでセット
215 mov.w __kernel_enadsp, r0 ; enadsp が FALSE なら
216 jz ret_int_r ; ret_int_r へ
217 mov.l __kernel_schedtsk, a1 ; schedtskと
218 cmp.l a0, a1 ; runtsk が同じなら
219 jeq ret_int_r ; ret_int_r へ
220 mov.l a0, r2r0 ; runtsk = NULL なら
221 jz dispatcher ; 保存せずdispatherへ
222 stc isp, TCB_sp[a0] ; タスクスタックを保存
223 mov.l #ret_int_r, TCB_pc[a0] ; 実行再開番地を保存
224 jmp.b dispatcher
225
226__kernel_break_wait:
227ret_int_r:
228 mov.b TCB_enatex[a0],r0l ; enatex が FALSE ならリターン
229 btst TCB_enatex_bit,r0l
230 jz ret_int_r_1
231 mov.w TCB_texptn[a0],r0 ; texptn が 0 ならばリターン
232 jz ret_int_r_1
233 jsr.a __kernel_call_texrtn ; タスク例外処理ルーチンの呼出し
234ret_int_r_1:
235 popm r0,r1,r2,r3,a0,a1,sb,fb ; スタックからレジスタを復帰
236 reit ; タスクへ戻る
237
238
239;
240; 割込み/CPU例外の出å…
241¥å£å‡¦ç†(アセンブリ言語記述部分)
242;
243; 呼出し条件:
244; ・FLGレジスタのIビット=0, IPLは受付けた割込みのIPL.
245; ・スタックは多重割り込みなら割込みスタック, そうでなければ
246; タスクスタック
247; ・a0 には割込み/CPU例外ハンドラのアドレスが格納されている.
248; ・r3r1 には(タスクor割込み)スタックポインタの値が格納されている.
249; これはそのままCPU例外ハンドラに渡すVP型の変数 p_excinf となる.
250; ポインタ変数はデフォルトでfarポインタなのでVP型は4バイトサイズの
251; ポインタとなり, 引数をスタックで渡すことになる.
252;
253; レジスタがスタック上にどのように保存されているかを以下に示す.
254; この図では上が低位, 下が高位のアドレスで, スタックは下から
255; 上方向に向かって積み上げられるものとする.
256;
257; --------------------------
258; | R0(2byte) | <----- p_excinf
259; -------------------------
260; | R1(2byte) |
261; -------------------------
262; | R2(2byte) |
263; -------------------------
264; | R3(2byte) |
265; -------------------------
266; | A0(4byte) |
267; | |
268; -------------------------
269; | A1(4byte) |
270; | |
271; -------------------------
272; | SB(4byte) |
273; | |
274; -------------------------
275; | FB(4byte) |
276; | |
277; -------------------------
278; | PC(4byte) |
279; | |
280; -------------------------
281; | FLG(2byte) |
282; -------------------------
283;
284; ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
285; TRUE になった時に,ret_int へ分岐する.
286;
287; 多重割込みかどうかは割込みネストカウンタの値で判定する.
288; intnest != 0 ならば多重割込みであると判定する.
289;
290; reqflg はCPUロック状æ…
291‹ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹. そうでないと,
292; reqflg チェック後に起動された割込みハンドラ内
293で
294; ディスパッチが要求された場合に,ディスパッチされない.
295;
296__kernel_interrupt:
297 cmp.b #0, __kernel_intnest ; 多重割り込みかどうか
298 jnz int_from_int ; 0でなければ多重割込み
299int_from_task: ; 初段の割込み
300 ldc #RAMEND, isp ; 割込み用のスタックへ切替える
301int_from_int: ; 多重割込み
302 inc.b __kernel_intnest ; ネスト回数をインクリメント
303 push.w r3 ; スタックポインタを割込みスタックへ保存
304 push.w r1 ; (割込み時は保存の必
305要ないが, 例外時とルーチンå…
306±æœ‰ã®ãŸã‚)
307 fset i ; 割込み禁止解除
308 jsri.a a0 ; Cルーチン呼び出し
309 fclr i ; 割込み禁止
310 pop.w r1 ; スタックポインタを復帰
311 pop.w r3 ; (割込み時は復帰の必
312要ないが, 例外時とルーチンå…
313±æœ‰ã®ãŸã‚)
314 dec.b __kernel_intnest ; ネスト回数をデクリメント
315 jnz int_return ; 多重割り込みならリターン
316int_from_task2: ; 初段の割込み
317 ldc r3r1, isp ; タスクのスタックに戻す
318 ldipl #0 ; タスクのIPL値をセット(IPL=0)
319 mov.w __kernel_reqflg, r1 ; ディスパッチ要求がないか?
320 jz int_return ; なければ割込み発生å…
321ƒã®ã‚¿ã‚¹ã‚¯ã«æˆ»ã‚‹
322 jmp.b ret_int ; あれば ret_int へジャンプ
323int_return:
324 popm r0,r1,r2,r3,a0,a1,sb,fb ; レジスタ復帰
325 reit ; 割込み前の処理に戻る
326
327;
328; 微少時間待
329ち
330;
331SIL_DLY_TIM1 .equ 264 ; 最小時間(ループ0回)[ns]
332SIL_DLY_TIM2 .equ 66 ; ループ1回あたりの時間[ns]
333
334 .glb $sil_dly_nse
335$sil_dly_nse:
336 sub.w #SIL_DLY_TIM1, r0
337 jgtu L0
338 rts
339L0:
340 sub.w #SIL_DLY_TIM2, r0
341 jgtu L0
342 rts
343
344
345 ; 未使用割込みの処理
346 .glb _unused_interrupt
347_unused_interrupt:
348 reit
349
350 .end
Note: See TracBrowser for help on using the repository browser.