source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/tlcs900-toshiba/cpu_support.app@ 26

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

initial

File size: 16.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) 2006-2010 by Witz Corporation, JAPAN
7;
8; The above copyright holders grant permission gratis to use,
9; duplicate, modify, or redistribute (hereafter called use) this
10; software (including the one made by modifying this software),
11; provided that the following four conditions (1) through (4) are
12; satisfied.
13;
14; (1) When this software is used in the form of source code, the above
15; copyright notice, this use conditions, and the disclaimer shown
16; below must be retained in the source code without modification.
17;
18; (2) When this software is redistributed in the forms usable for the
19; development of other software, such as in library form, the above
20; copyright notice, this use conditions, and the disclaimer shown
21; below must be shown without modification in the document provided
22; with the redistributed software, such as the user manual.
23;
24; (3) When this software is redistributed in the forms unusable for the
25; development of other software, such as the case when the software
26; is embedded in a piece of equipment, either of the following two
27; conditions must be satisfied:
28;
29; (a) The above copyright notice, this use conditions, and the
30; disclaimer shown below must be shown without modification in
31; the document provided with the redistributed software, such as
32; the user manual.
33;
34; (b) How the software is to be redistributed must be reported to the
35; TOPPERS Project according to the procedure described
36; separately.
37;
38; (4) The above copyright holders and the TOPPERS Project are exempt
39; from responsibility for any type of damage directly or indirectly
40; caused from the use of this software and are indemnified by any
41; users or end users of this software from any and all causes of
42; action whatsoever.
43;
44; THIS SOFTWARE IS PROVIDED "AS IS." THE ABOVE COPYRIGHT HOLDERS AND
45; THE TOPPERS PROJECT DISCLAIM ANY EXPRESS OR IMPLIED WARRANTIES,
46; INCLUDING, BUT NOT LIMITED TO, ITS APPLICABILITY TO A PARTICULAR
47; PURPOSE. IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS AND THE
48; TOPPERS PROJECT BE LIABLE FOR ANY TYPE OF DAMAGE DIRECTLY OR
49; INDIRECTLY CAUSED FROM THE USE OF THIS SOFTWARE.
50;
51; 上記著作権者
52は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
53; ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
54; 再é…
55å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
56; (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
57; 表示,この利用条件および下記の無保証規定が,そのままの形でソース
58; コード中に含まれていること.
59; (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
60; できる形で再é…
61å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
62å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
63マ
64; ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
65; 証規定を掲載すること.
66; (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
67; できない形で再é…
68å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこと.
69; (a) 再é…
70å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
71マニュアルなど)に,上記の著作
72; 権表示,この利用条件および下記の無保証規定を掲載すること.
73; (b) 再é…
74å¸ƒã®å½¢æ…
75‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに報
76; 告すること.
77; (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
78; からも,上記著作権者
79およびTOPPERSプロジェクトをå…
80è²¬ã™ã‚‹ã“と.また,
81; 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
82; く請求からも,上記著作権者
83およびTOPPERSプロジェクトをå…
84è²¬ã™ã‚‹ã“と.
85;
86; 本ソフトウェアは,無保証で提供されているものである.上記著作権者
87およ
88; びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
89; る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
90; により直接的または間接的に生じたいかなる損害に関しても,その責任を負
91; わない.
92;
93; @(#) $Id: cpu_support.app,v 1.1 2006/04/10 08:19:25 honda Exp $
94;
95
96 $MAXIMUM
97 module cpu_support_app
98
99;
100; プロセッサ依存モジュール アセンブリ言語部(TLCS-900L1用)
101;
102
103#define SUPPORT_CHG_IPM
104#include "jsp_rename.h"
105#include "cpu_rename.h"
106#include "sys_rename.h"
107#include "offset.inc"
108
109; 外部参ç…
110§ã‚·ãƒ³ãƒœãƒ«å®šç¾©
111 extern large __StackTop
112 extern large _reqflg
113 extern large _enadsp
114 extern large _intcnt
115 extern large _runtsk
116 extern large _schedtsk
117 extern large _call_texrtn
118 extern large _task_intmask
119
120
121f_code section code large align=1,1
122
123;
124; タスクディスパッチャ
125;
126; dispatch は,タスクコンテキスト状æ…
127‹ãƒ»å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
128‹ã§å‘¼ã³å‡ºã•ãªã‘
129; ればならない.exit_and_dispatch も,タスクコンテキスト状æ…
130‹ãƒ»å‰²è¾¼
131; み禁止状æ…
132‹ã§å‘¼ã³å‡ºã™ã®ãŒåŽŸå‰‡ã§ã‚るが,カーネル起動時に対応するため,
133; 割込みコンテキスト状æ…
134‹ã§å‘¼ã³å‡ºã—た場合にも対応している.
135; 呼び出し条件: SRのIFF=7 (割込み禁止状æ…
136‹),
137; intcnt = 0(タスクコンテキスト), タスクスタック
138;
139 public _dispatch
140
141_dispatch:
142 push xiz ; 関数呼出で保護が必
143要なレジスタの保存
144 ld xwa, (_runtsk) ; 動作中タスクのTCBを取得
145 ld (xwa+TCB_sp), xsp ;
146 lda xhl, dispatch_r ;
147 ld (xwa+TCB_pc), xhl ;
148 jr dispatcher ;
149
150;
151; 呼び出し条件: SRのIFF=7 (割込み禁止状æ…
152‹),
153; intcnt = 0(タスクコンテキスト), タスクスタック
154;
155; xwa にはruntsk のアドレスが格納されている
156;
157dispatch_r:
158 pop xiz ;
159 ld bc, (xwa+TCB_enatex) ;
160 bit TCB_enatex_bit, bc ;
161 jr z, dispatch_r_1 ; enatex が FALSE ならリターン
162 cpw (xwa+TCB_texptn), 0 ; タスク例外要因がある場合
163 jp nz, _call_texrtn ;
164 ; call_texrtnから直接dispatch 呼び出しå…
165ƒã¸æˆ»ã‚‹.
166dispatch_r_1: ; タスク例外を実行しない場合
167 ret ; dispatch 呼び出しå…
168ƒã¸æˆ»ã‚‹.
169
170;
171; タスク起動時処理
172;
173; ここでは, CPUロック解除状æ…
174‹ã«ã—, タスクを起動する.
175;
176; 呼び出し条件: SRのIFF=7 (割込み禁止状æ…
177‹),
178; intcnt = 0(タスクコンテキスト), タスクスタック
179;
180 public _activate_r
181
182_activate_r:
183 pop xhl ; タスクの起動番地をwhl に設定
184#ifdef SUPPORT_CHG_IPM /* t_unlock_cpu 相当の処理 */
185 push sr ; 割込みマスクに task_intmask を設定
186 ld wa, (_task_intmask) ;
187 andw (xsp), ~0x7000 ;
188 or (xsp), wa ;
189 pop sr ;
190#else /* SUPPORT_CHG_IPM */
191 ei 0 ; 割込み許可
192#endif /* SUPPORT_CHG_IPM */
193 jp xhl
194
195;
196; dispatcher呼び出し条件:
197; ・すべてのタスクのコンテキストは保存されている.
198; ・SRのIFF=7 (割込み禁止状æ…
199‹)
200; ・コンテキストはタスクコンテキスト(intcnt=0)
201; dispatcher 呼出時のスタック:
202; dispatch からきた場合: タスクスタック
203; exit_and_dispatch からきた場合:
204; exit_task からきた場合はタスクスタック
205; カーネル起動時は割込みスタック
206; ret_int からきた場合: タスクスタック
207; dispatcher_2 での割込み待
208ちからきた場合: 割込みスタック
209;
210 public _exit_and_dispatch
211
212_exit_and_dispatch:
213 ldw (_intcnt), 0 ; ネストカウンタクリア(タスクコンテキスト)
214dispatcher:
215 ld xwa, (_schedtsk) ; schedtsk を runtsk に設定
216 ld (_runtsk), xwa ;
217 or xwa, xwa ; 実行するタスクが無ければアイドルループへ
218 jr z, pre_idle_loop ;
219 ld xsp, (xwa+TCB_sp) ; タスクスタックポインタを復帰
220 ld xhl, (xwa+TCB_pc) ;
221 jp xhl ; 実行再開番地へジャンプ
222;
223; 実行すべきタスクが現れるまで待
224つ処理
225;
226pre_idle_loop:
227 ld xsp, __StackTop ; 割込み用のスタックへ切替え
228 incw 1, (_intcnt) ; 非タスクコンテキスト
229;
230; ここで非タスクコンテキスト,割込みスタックに切り換えたのは,
231; ここで発生する割込み処理にどのスタックを使うかという問題の解決と,
232; 割込みハンドラ内
233でのディスパッチ防止という2つの意味がある.
234;
235idle_loop:
236#ifdef SUPPORT_CHG_IPM /* t_unlock_cpu 相当の処理 */
237 push sr ; 割込みマスクに task_intmask を設定
238 ld wa, (_task_intmask) ;
239 andw (xsp), ~0x7000 ;
240 or (xsp), wa ;
241 pop sr ;
242#else /* SUPPORT_CHG_IPM */
243 ei 0 ; 割込み許可
244#endif /* SUPPORT_CHG_IPM */
245
246 halt ; IDLE2状æ…
247‹ã¸é·ç§»
248 nop ; 上記haltをコメント(nopのみ)にすると
249 nop ; 低消費動作を行わないアイドルループとなる.
250 nop ;
251 nop ;
252 ei 7 ; 割込み禁止
253 cpw (_reqflg), 0 ; reqflg が FALSE であれば
254 jr z, idle_loop ; idle_loop へ
255 ldw (_reqflg), 0 ; reqflg <--- FALSE
256 decw 1, (_intcnt) ; タスクコンテキストに戻す
257 jr dispatcher ; dispatcher へ戻る
258
259;
260; 遅
261延ディスパッチ処理
262;
263; 呼び出し条件: SRのIFF=7 (割込み禁止状æ…
264‹),
265; intcnt = 0(タスクコンテキスト), タスクスタック
266; reqflg = TRUE
267; INTNESTレジスタ = 1
268;
269ret_int:
270 ldw (_reqflg), 0 ; reqflg <--- FALSE
271 ld de, 0 ;
272 ldc intnest, de ; ディスパッチしたらintnest は0
273 push xiz ; 関数呼出で保護が必
274要なレジスタの保存
275 ld xwa, (_runtsk) ; runtsk を取得
276 cpw (_enadsp), 0 ; enadsp が FALSE なら
277 jr z, ret_int_r ; ret_int_r へ
278 cp xwa, (_schedtsk) ; runtsk とschedtsk が同じなら
279 jr z, ret_int_r ; ret_int_r へ
280 or xwa, xwa ; runtsk = NULL なら
281 jr z, dispatcher ; 保存せずdispather へ
282 ld (xwa+TCB_sp), xsp ;
283 lda xhl, ret_int_r ;
284 ld (xwa+TCB_pc), xhl ;
285 jr dispatcher ;
286
287;
288; 呼び出し条件: SRのIFF=7 (割込み禁止状æ…
289‹),
290; intcnt = 0(タスクコンテキスト), タスクスタック
291; INTNESTレジスタ = 0
292;
293; xwa にはruntsk のアドレスが格納されている
294;
295ret_int_r:
296 pop xiz
297#ifdef SUPPORT_CHG_IPM /* スタックにあるSR のIFF を操作 */
298 ld de, (_task_intmask) ;
299 andw (xsp+24), ~0x7000 ;
300 or (xsp+24), de ;
301#endif /* SUPPORT_CHG_IPM */
302 ld bc, (xwa+TCB_enatex) ;
303 bit TCB_enatex_bit, bc ;
304 jr z, nest_ctrl_r ; enatex が FALSE ならリターン
305 cpw (xwa+TCB_texptn), 0 ; タスク例外要因がある場合
306 call nz, _call_texrtn ;
307nest_ctrl_r:
308 ld de, 1 ;
309 ldc intnest, de ; reti用に擬似的にintnest は1
310 jr interrupt_r
311
312;
313; 割込み/CPU例外のå…
314±é€šå‡¦ç†
315;
316; 呼出し条件:
317; ・SRのIFF=7.
318; ・スタックは多重割り込みなら割込みスタック, そうでなければ
319; タスクスタック
320; ・XHL には割込み/CPU例外ハンドラのアドレスが格納されている.
321; ・AW には本割込みの優å…
322ˆåº¦ãŒè¨­å®šã•ã‚ŒãŸ SR が格納されている.
323;
324; レジスタがスタック上にどのように保存されているかを以下に示す.
325; この図では上が低位, 下が高位のアドレスで, スタックは下から
326; 上方向に向かって積み上げられるものとする.
327;
328; --------------------------------------
329; | CPU例外ハンドラの引数 |
330; | CPU例外情
331å ±(4byte) |
332; | |
333; | |
334; --------------------------------------
335; | XSP(4byte) | タスクスタックポインタ.
336; | ※初段のみ | 初段の割込みのみ保持される.
337; | |
338; | |
339; --------------------------------------
340; | XIY(4byte) |
341; | |
342; | |
343; | |
344; --------------------------------------
345; | XIX(4byte) |
346; | |
347; | |
348; | |
349; --------------------------------------
350; | XDE(4byte) |
351; | |
352; | |
353; | |
354; --------------------------------------
355; | XBC(4byte) |
356; | |
357; | |
358; | |
359; -------------------------------------- <-- 割込みå…
360¥ã‚Šå£å‡¦ç†ã§å‡¦ç†ã•ã‚Œã‚‹ï¼Ž
361; | XHL(4byte) |
362; | |
363; | |
364; | |
365; --------------------------------------
366; | XAW(4byte) |
367; | |
368; | |
369; | |
370; -------------------------------------- <-- 割込み発生時にハードウェア
371; | SR(2byte) | にて処理される. p_excinfは
372; | | ここを指すように演算する.
373; --------------------------------------
374; | PC(4byte) |
375; | |
376; | |
377; | |
378; --------------------------------------
379;
380; ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
381; TRUE になった時に,ret_int へ分岐する.
382;
383; 多重割込みかどうかは割込みネストカウンタの値で判定する.
384; intcnt != 0 ならば多重割込みであると判定する.
385; なお,ハードウェア仕様上,割込み発生から割込み禁止を行うまでの間に
386; 多重割込みが発生すると,多重割込みであることをソフトウェアで検知で
387; きないため,最初に発生した割込み処理を実行しないままタスクディス
388; パッチする可能性がある.この多重割込みを検知するためにハードウェア
389; INTNEST レジスタを利用する.
390;
391; reqflg はCPUロック状æ…
392‹ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹. そうでないと,
393; reqflg チェック後に起動された割込みハンドラ内
394で
395; ディスパッチが要求された場合に,ディスパッチされない.
396;
397 public _interrupt
398
399_interrupt:
400 push xbc ; スクラッチレジスタの残りを保存
401 push xde ;
402 push xix ;
403 push xiy ;
404
405 ld xbc, xsp ; CPU例外情
406報引数に使用するためここで取得
407 cpw (_intcnt), 0 ;
408 jr nz, from_int ;
409 ld xsp, __StackTop ; 初段の割込みの場合スタックを切り替え
410 push xbc ; タスクSPの保持
411from_int: ;
412 incw 1, (_intcnt) ; 割込みネストカウントをインクリメント
413
414 add xbc, 24 ; CPU例外情
415報引数生成
416 push xbc ; 割込み処理では未使用
417 push wa ;
418 pop sr ; 本割込みより優å…
419ˆåº¦ã®é«˜ã„割込み許可
420 call xhl ; 割込みハンドラ/CPU例外処理を呼び出す
421 ei 7 ; 割込み禁止
422 pop xbc ; スタック数合わせ(CPU例外情
423報引数)
424
425 decw 1, (_intcnt) ; 割込みネストカウントをデクリメント
426 jr nz, from_int_r ;
427 pop xbc ; 初段の割込みの場合タスクSPの復帰
428 ld xsp, xbc ;
429 ldc de, intnest ; 割込み発生から割込み禁止までの間に多重割込みが
430 djnz de, from_int_r ; 発生している場合はディスパッチしない
431 cpw (_reqflg), 0 ; reqflg が TRUE であれば
432 jp nz, ret_int ; ret_int へ
433from_int_r: ;
434interrupt_r: ;
435 pop xiy ;スクラッチレジスタを復帰
436 pop xix ;
437 pop xde ;
438 pop xbc ;
439 pop xhl ;
440 pop xwa ;
441 reti ;
442
443;
444; 未使用割込みの処理
445;
446 public unused_interrupt
447
448unused_interrupt:
449 reti
450
451
452 end
453
454
Note: See TracBrowser for help on using the repository browser.