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

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

initial

File size: 12.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-2003 by Embedded and Real-Time Systems Laboratory
7;* Toyohashi Univ. of Technology, JAPAN
8;* Copyright (C) 2003-2007 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.7 2007/03/23 07:06:35 honda Exp $
55
56
57;
58; プロセッサ依存モジュール アセンブリ言語部(M16C用)
59;
60
61;
62; offset.incはmakeoffset.cとm16coffset.exeコマンドにより
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 sb, fb ; スタックへレジスタ保存
100 mov.w __kernel_runtsk, a0
101 stc isp, TCB_sp[a0] ; スタックポインタをTCBに保存
102 mov.w #(dispatch_r>>16), TCB_pc+2[a0] ; 実行再開番地をTCBに保存
103 mov.w #(dispatch_r & 0ffffh), TCB_pc[a0]
104 jmp.b dispatcher
105;
106; 呼び出し条件: IPL=0, FLGレジスタIビット=0 (CPUロック状æ…
107‹),
108; intnest = 0(タスクコンテキスト), タスクスタック
109;
110; a0 にはruntsk のアドレスが格納されている
111;
112dispatch_r:
113 popm sb,fb ; タスクスタックからレジスタ復帰
114 mov.w TCB_enatex[a0], r0
115 btst TCB_enatex_bit, r0 ; タスク例外処理許可?
116 jz dispatch_r_1 ; 許可でなければ dispatch_r_1 へ
117 mov.w TCB_texptn[a0], r0 ; 保留例外要因があるか?
118 jz dispatch_r_1 ; なければ dispatch_r_1 へ
119 jmp __kernel_call_texrtn ; タスク例外ハンドラへ
120dispatch_r_1: ; タスク例外を実行しない場合
121 rts ; dispatch 呼び出しå…
122ƒã¸æˆ»ã‚‹.
123
124
125;
126; タスク起動時処理
127;
128; ここでは, CPUロック解除状æ…
129‹ã«ã—, タスクを起動する.
130;
131; 呼出条件: FLGレジスタIビット=0 (CPUロック状æ…
132‹), タスクスタック
133; IPL=0, タスクコンテキスト(intnest=0)
134;
135__kernel_activate_r:
136 pop.w a0 ; タスクの起動番地をA1A0に設定
137 pop.w a1
138 ldc #0040h, flg ; 割込み許可, ISP, IPL=0
139 jmpi.a a1a0
140
141;
142; dispatch呼び出し条件:
143; ・すべてのタスクのコンテキストは保存されている.
144; ・FLGレジスタIビット=0 (CPUロック状æ…
145‹)
146; ・コンテキストはタスクコンテキスト(intnest=0)
147;  但し、exit_and_dispatchについてはモニター起動等を考æ…
148®
149;  した上記以外の呼び出し条件の対応を行う
150; dispatcher 呼出時のスタック:
151; __kernel_dispatch からきた場合: タスクスタック
152; exit_and_dispatch からきた場合:
153; exit_task からきた場合はタスクスタック
154; カーネル起動時は割込みスタック
155; ret_int からきた場合: 割込みスタック
156; dispatcher_2 での割込み待
157ちからきた場合: 割込みスタック
158;
159
160__kernel_exit_and_dispatch:
161 fclr i ; 割込み禁止
162 mov.b #0, __kernel_intnest ; ネストカウンタクリア
163dispatcher:
164 mov.w __kernel_schedtsk, a0 ;
165 mov.w a0, __kernel_runtsk ; schedtsk を runtsk に
166 .IF MON == 1
167; タスクモニター機能用分岐
168; 不要の場合は (MON = 0)
169 jsr.a _iana_tsk ; タスク実行情
170報の設定
171 mov.w __kernel_runtsk,a0 ; a0を復帰
172 .ENDIF
173 jz dispatcher_1 ; schedtsk がなければ割込み待
174ち
175 ldc TCB_sp[a0], isp ; タスクスタックポインタを復帰
176 jmpi.a TCB_pc[a0] ; 実行再開番地へジャンプ
177;
178; schdedtskが NULL の場合は、これより下には行かない
179;
180dispatcher_1:
181 ldc #RAMEND, isp ; 割込み用のスタックへ切替え
182 inc.b __kernel_intnest ; 非タスクコンテキスト
183dispatcher_2:
184 fset i ; 割込み待
185ち
186 wait ; wait命令を使用すると
187 nop ; 消費電力を抑えることができる.
188 nop ; コメントをつけたまま(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.w __kernel_runtsk, a0 ; A0 <--- runtsk
215 mov.w __kernel_enadsp, r0 ; enadsp が FALSE なら
216 jz ret_int_r ; ret_int_r へ
217 mov.w __kernel_schedtsk, r0 ; schedtskと
218 cmp.w a0, r0 ; runtsk が同じなら
219 jeq ret_int_r ; ret_int_r へ
220 ;;;; (runtsk == NULL) のチェックは必
221要ないため削除 (07/03/02)
222 stc isp, TCB_sp[a0] ; タスクスタックを保存
223 mov.w #(ret_int_r&0ffffh), TCB_pc[a0] ; 実行再開番地を保存
224 mov.w #(ret_int_r>>16), TCB_pc+2[a0]
225 jmp.b dispatcher
226
227__kernel_break_wait:
228ret_int_r:
229 mov.w TCB_enatex[a0],r0 ; enatex が FALSE ならリターン
230 btst TCB_enatex_bit,r0
231 jz ret_int_r_1
232 mov.w TCB_texptn[a0],r0 ; texptn が 0 ならばリターン
233 jz ret_int_r_1
234 jsr.a __kernel_call_texrtn ; タスク例外処理ルーチンの呼出し
235ret_int_r_1:
236 popm r0,r1,r2,r3,a0,a1,sb,fb ; スタックからレジスタを復帰
237 reit ; タスクへ戻る
238
239
240;
241; 割込み/CPU例外の出å…
242¥å£å‡¦ç†(アセンブリ言語記述部分)
243;
244; 呼出し条件:
245; ・FLGレジスタのIビット=0, IPLは受付けた割込みのIPL.
246; ・スタックは多重割り込みなら割込みスタック, そうでなければ
247; タスクスタック
248; ・a1とa0 には割込み/CPU例外ハンドラのアドレスが格納されている.
249; ・r1 には(タスクor割込み)スタックポインタの値が格納されている.
250; これはそのままCPU例外ハンドラに渡すVP型の変数 p_excinf となる.
251;
252; レジスタがスタック上にどのように保存されているかを以下に示す.
253; この図では上が低位, 下が高位のアドレスで, スタックは下から
254; 上方向に向かって積み上げられるものとする.
255;
256; --------------------------------------
257; | R0(2byte) | <--- p_excinf
258; | |
259; --------------------------------------
260; | R1(2byte) |
261; | |
262; --------------------------------------
263; | R2(2byte) |
264; | |
265; --------------------------------------
266; | R3(2byte) |
267; | |
268; --------------------------------------
269; | A0(2byte) |
270; | |
271; --------------------------------------
272; | A1(2byte) |
273; | |
274; --------------------------------------
275; | SB(2byte) |
276; | |
277; --------------------------------------
278; | FB(2byte) |
279; | |
280; --------------------------------------
281; | PCの下位2バイト |
282; | |
283; --------------------------------------
284; | FLGの下位1バイト |
285; --------------------------------------
286; | FLGの上位4ビット/PCの上位4ビット |
287; --------------------------------------
288;
289; ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
290; TRUE になった時に,ret_int へ分岐する.
291;
292; 多重割込みかどうかは割込みネストカウンタの値で判定する.
293; intnest != 0 ならば多重割込みであると判定する.
294;
295; reqflg はCPUロック状æ…
296‹ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹. そうでないと,
297; reqflg チェック後に起動された割込みハンドラ内
298で
299; ディスパッチが要求された場合に,ディスパッチされない.
300;
301__kernel_interrupt:
302 cmp.b #0, __kernel_intnest ; 多重割り込みかどうか
303 jnz int_from_int ; 0でなければ多重割込み
304int_from_task: ; 初段の割込み
305 ldc #RAMEND, isp ; 割込み用のスタックへ切替える
306 push.w r1 ; スタックポインタを割込みスタックへ保存
307int_from_int: ; 多重割込み
308 inc.b __kernel_intnest ; ネスト回数をインクリメント
309 fset i ; 割込み禁止解除
310 jsri.a a1a0 ; Cルーチン呼び出し
311 fclr i ; 割込み禁止
312 dec.b __kernel_intnest ; ネスト回数をデクリメント
313 jnz int_return ; 多重割り込みならリターン
314int_from_task2: ; 初段の割込み
315 pop.w r1 ; タスクスタックポインタを戻す
316 ldc r1, isp
317 ldipl #0 ; タスクのIPL値をセット(IPL=0)
318 mov.w __kernel_reqflg, r1 ; ディスパッチ要求がないか?
319 jz int_return ; なければ割込み発生å…
320ƒã®ã‚¿ã‚¹ã‚¯ã«æˆ»ã‚‹
321 jmp.b ret_int ; あれば ret_int へジャンプ
322int_return:
323 popm r0,r1,r2,r3,a0,a1,sb,fb ; レジスタ復帰
324 reit ; 割込み前の処理に戻る
325
326;
327; 微少時間待
328ち
329;
330SIL_DLY_TIM1 .equ 625 ; 最小時間(ループ0回)[ns]
331SIL_DLY_TIM2 .equ 250 ; ループ1回あたりの時間[ns]
332
333 .glb $sil_dly_nse
334$sil_dly_nse:
335 sub.w #SIL_DLY_TIM1, r1
336 jgtu L0
337 rts
338L0:
339 sub.w #SIL_DLY_TIM2, r1
340 jgtu L0
341 rts
342
343
344 ; 未使用割込みの処理
345 .glb _unused_interrupt
346_unused_interrupt:
347 reit
348
349 .end
Note: See TracBrowser for help on using the repository browser.