source: ssp_qb_r5f100le_cs/trunk/arch/rl78_ca78k0r/prc_support.asm@ 95

Last change on this file since 95 was 95, checked in by nmir-saito, 9 years ago

ファイルの mime-type 変更

  • Property svn:mime-type set to text/plain; charset=shift_jis
File size: 8.5 KB
Line 
1;
2; TOPPERS/SSP Kernel
3; Smallest Set Profile Kernel
4;
5; Copyright (C) 2014 by Naoki Saito
6; Nagoya Municipal Industrial Research Institute, JAPAN
7;
8; 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
9; ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
10; 再配布(以下,利用と呼ぶ)することを無償で許諾する.
11; (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
12; 表示,この利用条件および下記の無保証規定が,そのままの形でソース
13; コード中に含まれていること.
14; (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
15; できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
16; ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
17; 証規定を掲載すること.
18; (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
19; できない形で再配布する場合には,次のいずれかの条件を満たすこと.
20; (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
21; 権表示,この利用条件および下記の無保証規定を掲載すること.
22; (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
23; 告すること.
24; (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
25; からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
26; 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
27; く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28;
29; 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
30; びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
31; る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
32; により直接的または間接的に生じたいかなる損害に関しても,その責任を負
33; わない.
34;
35;
36
37;
38; カーネル実装のプロセッサ依存部分
39;
40
41;
42; マクロ定義のインクルード
43;
44$INCLUDE(prc_support_def.inc)
45
46;
47; グローバルシンボル
48;
49 ; コンパイラが使用する saddr領域のレジスタ
50 extrn _@RTARG0,_@RTARG2,_@RTARG4,_@RTARG6,_@SEGAX,_@SEGDE
51 extrn _@NRARG0,_@NRARG1,_@NRARG2,_@NRARG3
52 extrn _@NRAT00,_@NRAT02,_@NRAT04,_@NRAT06
53 ; kernel_cfg.c
54 extrn __kernel_istkpt ; スタックポインタの初期値
55 ; prc_config.c
56 extrn _t_lock_cpu ; CPUロック状態への移行
57 extrn __kernel_intnest ; 割込みのネストカウンタ
58 extrn __kernel_lock_flag ; CPUロックフラグ
59 ; task.c
60 extrn __kernel_dispatcher ; ディスパッチャ
61 extrn __kernel_reqflg ; ディスパッチ要求フラグ
62 extrn __kernel_disdsp ; ディスパッチ禁止状態
63 extrn __kernel_search_schedtsk ; 最高優先度のサーチ
64 extrn __kernel_run_task ; タスクの開始
65 ; startup.c
66 extrn __kernel_exit_kernel ; カーネルの終了処理
67
68 ; prc_support.asm
69 public __kernel_start_dispatch ; ディスパッチの開始処理
70 public __kernel_call_exit_kernel ; 終了処理のコール
71 public __kernel_interrupt_entry ; 割込みの入口処理(共通部)
72 public __kernel_int_return ; レジスタを復帰して割込み発生元へリターン
73 public _unused_interrupt ; 未使用割込みの処理
74
75;
76; コンパイラで使用するsaddr領域のレジスタを保存
77;
78restore_saddr_regs macro
79$if (ALLOC_REGVAR_TO_SADDR) ; -qr オプションを使用する場合
80 pop ax ; レジスタ復帰
81 movw _@NRAT06, ax ;
82 pop ax ;
83 movw _@NRAT04, ax ;
84 pop ax ;
85 movw _@NRAT02, ax ;
86 pop ax ;
87 movw _@NRAT00, ax ;
88 pop ax ;
89 movw _@NRARG3, ax ;
90 pop ax ;
91 movw _@NRARG2, ax ;
92 pop ax ;
93 movw _@NRARG1, ax ;
94 pop ax ;
95 movw _@NRARG0, ax ;
96$endif
97 pop ax ; レジスタ復帰
98 movw _@SEGDE, ax ;
99 pop ax ;
100 movw _@SEGAX, ax ;
101 pop ax ;
102 movw _@RTARG6, ax ;
103 pop ax ;
104 movw _@RTARG4, ax ;
105 pop ax ;
106 movw _@RTARG2, ax ;
107 pop ax ;
108 movw _@RTARG0, ax ;
109 endm
110
111;
112; スタックポインタを初期化
113;
114reset_sp macro
115 movw de, #__kernel_istkpt
116 mov es, #00H
117 movw ax, es:[de]
118 movw sp, ax
119 endm
120
121;
122; PSW の ISP1 = 1, ISP0 = 1 にして割込みのマスクを解除する
123;
124clear_pswisp_mask macro
125 mov a, psw
126 and a, #0f9h
127 or a, #06h ; PSW.ISP{1,0}=(1,1)
128 mov psw, a
129 endm
130
131@@CODE CSEG BASE
132
133;
134; カーネルの動作開始に必要とされる後始末を行うための関数
135; sta_ker(startup.c) から呼び出される.
136;
137__kernel_start_dispatch:
138 ;
139 ; CPUロック状態と全割込みロック状態とを区別する必要がある場合,
140 ; CPUロック状態にし,全割込みロック相当の状態を解除する.
141 ;
142 call !!_t_lock_cpu
143$_IF (TMIN_INTPRI_EQU_MINUS4)
144 clear_pswisp_mask
145$ELSE
146 ei
147$ENDIF
148 ;
149 ; スタックポインタを初期化する
150 ; sta_ker から start_dispatch の関数コールによるスタック消費分を
151 ; クリアするため,スタックポインタを初期化する.
152 ;
153 reset_sp
154
155 ;
156 ; dispatcher (task.c) へジャンプする
157 ; 関数コールにしないのはスタックを節約するため.
158 ;
159 ; dispatcher (kernel/task.c) の呼び出し
160 br !!__kernel_dispatcher
161
162
163;
164; 終了処理の呼び出し
165; スタックポインタを初期化し,exit_kernel を呼び出す.
166;
167 __kernel_call_exit_kernel:
168 reset_sp
169 br __kernel_exit_kernel
170
171
172@@BASE CSEG BASE
173
174;
175; 割込み/CPU例外の出入口処理(共通部)
176; カーネル管理の割込みまたはCPU例外の場合にレジスタ保存後,呼び出される.
177;
178; 前提条件
179; ・PSWレジスタのIEビット=0, ISPは受付けた割込みのISP.
180; ・ハンドラのアドレスが bc に格納されている.
181; ・CPU例外ハンドラの入口から来た場合,スタックポインタの
182; 先頭番地(p_excinf)が ax に格納されており,
183; これはCPU例外ハンドラの引数(p_excinf)としてそのまま渡される.
184;
185; レジスタがスタック上にどのように保存されているかを以下に示す.
186; 図は並び順のみを表現したものであり,サイズを考慮していないことに注意する.
187; 正確にはデータシートを参照のこと.
188; この図では上が低位, 下が高位のアドレスで, スタックは図の下側から
189; 上方向に向かって積み上げられるものとする.
190;
191; ※1 saddr領域のワークエリアはコンパイラオプション -qr を指定する場合に
192; 保存が必要であり,通常は保存しない.保存する場合はアセンブラオプション
193; にて「ALLOC_REGVAR_TO_SADDR」を定義すること.
194;
195; ※2 CPU例外の入口を経由した場合のみ保存される
196;
197;
198; ---------------<-- p_excinf(※)
199; | saddr領域 |
200; |ワーク用エリア|
201; | (16byte)※1 |
202; ---------------<-- p_excinf
203; | saddr領域 |
204; |セグメント情報|
205; | 格納用エリア |
206; | (4byte) |
207; ---------------
208; | saddr領域 |
209; | ランタイム |
210; | 引数エリア |
211; | (8byte) |
212; ---------------
213; | ES,CS(2byte) |
214; ---------------
215; | HL(2byte) |
216; ---------------
217; | DE(2byte) |
218; ---------------
219; | BC(2byte) |
220; ---------------
221; | AX(2byte) |
222; ---------------
223; | PC(2byte) |
224; ---------------
225; | PSW(1byte) |
226; ---------------
227;
228; ハンドラからリターンした後は, 多重割込みでなく, かつ,
229; reqflg が TRUE,かつ,disdsp が FALSE の時に,interrupt_dispatch へ分岐する.
230;
231; 多重割込みかどうかは割込みネストカウンタの値で判定する.
232; intnest > 0 ならば多重割込みであると判定する.
233;
234
235__kernel_interrupt_entry:
236 inc !__kernel_intnest ; ネストカウンタをインクリメント
237 ei ; 割込み許可(IPLは受け付けられた割込みのレベル)
238 call bc ; 割込みハンドラ呼び出し
239 di ; 割込み禁止
240 dec !__kernel_intnest ; ネストカウンタをデクリメント
241 bnz $__kernel_int_return ; 戻り先が非タスクコンテキスト(非ゼロ)なら単にリターン
242 movw ax,!__kernel_reqflg ; ディスパッチ要求があるかどうか
243 cmpw ax, #0
244 bz $__kernel_int_return ; なければ,単にリターン
245 movw ax, #0
246 movw !__kernel_reqflg, ax ; reqflg = FALSE に戻しておく
247 movw ax, !__kernel_disdsp ; ディスパッチ禁止かどうか
248 cmpw ax, #0
249 bnz $__kernel_int_return ; 禁止なら,単にリターン
250
251;
252; 割込みの出口処理(ディスパッチ付き)
253; CPU ロック相当の状態に移行し,新規タスクを開始する
254;
255; 前提条件:
256; PSWレジスタのIEフラグ = 0 (割込み禁止)
257; PSWレジスタのISP{1,0} = 受け付けた割込みの割込みレベル
258;
259__kernel_interrupt_dispatch:
260 call !!_t_lock_cpu
261$_IF (TMIN_INTPRI_EQU_MINUS4)
262 clear_pswisp_mask
263$ELSE
264 ei
265$ENDIF
266 call !!__kernel_search_schedtsk
267 movw ax, bc
268 call !!__kernel_run_task
269
270 ; run_task からのリターン後の状態: CPUロック状態
271 ; __kernel_int_return の reti で PSW の IE, ISP は
272 ; 割込み発生前の状態に戻るため,lock_flag だけ元に戻す.
273 movw ax, #0
274 movw !__kernel_lock_flag, ax ; lock_flag をクリア
275
276;
277; レジスタ復帰して割込みからリターン
278;
279__kernel_int_return:
280 restore_saddr_regs ; saddr領域のレジスタ復帰
281 pop ax ; ES, CS の復帰
282 mov cs, a ;
283 mov a, x ;
284 mov es, a ;
285 pop hl ; レジスタを復帰
286 pop de
287 pop bc
288 pop ax
289 reti
290
291;
292; 無限ループ(念のため)
293;
294_loop:
295 br $_loop
296
297;
298; 未使用割込み
299;
300_unused_interrupt:
301 reti
302
303 end
Note: See TracBrowser for help on using the repository browser.