source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/s1c33/cpu_config.c@ 26

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

initial

File size: 8.4 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 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * Copyright (C) 2004 by SEIKO EPSON Corp, JAPAN
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件か,Free Software Foundation
13 * によってå…
14¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
15 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
16 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
25å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
26 * 者
27マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 * の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 * 用できない形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
32 * と.
33 * (a) 再é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
35マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再é…
38å¸ƒã®å½¢æ…
39‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
40 * 報告すること.
41 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
42 * 害からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
49 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
50 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
51 *
52 */
53
54
55/*
56 * プロセッサ依存モジュール(S1C33用)
57 */
58
59#include "jsp_kernel.h"
60#include "check.h"
61#include "task.h"
62#include "itron.h"
63#include "s1c33.h"
64#include "sys_config.h"
65
66/*
67 * CPUロック解除時に復å…
68ƒã™ã‚‹
69 */
70UINT tps_OrgIntLevel;
71
72/*
73 * 割込みネストカウンタ
74 */
75UINT tps_IntNestCnt;
76
77/*
78 * 割込み制御レジスタ 位置特定処理
79 */
80ER get_Offset(INTNO);
81ER get_BitFlag(INTNO);
82
83/*
84 * プロセッサ依存の初期化
85 */
86void
87cpu_initialize()
88{
89 tps_IntNestCnt = 0; /* 割込みネストカウントの初期化 */
90 tps_OrgIntLevel = TPS_INIT_INTLEVEL;
91
92 /*
93 * 割り込み許可フラグを設定し、OS管理下の割り込みをマスクする
94 */
95 set_psr((TPS_CPULOCK_LEV << 8) | S1C33_PSR_FLAG_IE);
96
97}
98
99/*
100 * プロセッサ依存の終了処理
101 */
102void
103cpu_terminate()
104{
105
106}
107
108/*
109 * タスク起動処理
110 */
111void
112activate_r(void)
113{
114 unlock_cpu();
115 Asm("xld.w %r0, ext_tsk"); /* 戻り位置をext_tskに設定 */
116 Asm("pushn %r0");
117 Asm("ld.w %%r6, %0": : "r"(runtsk->tinib->exinf));
118 set_pc(runtsk->tinib->task);
119}
120
121/*
122 * タスクディスパッチャ
123 *
124 * dispatchはタスクコンテキスト・CPUロック状æ…
125‹ã§å‘¼ã³å‡ºã™ã€‚
126 * exit_and_dispatchも同様だが、カーネル起動時に対応するため
127 * 非タスクコンテキスト・CPUロック解除状æ…
128‹ã®å‘¼ã³å‡ºã—にも対応
129 * している。
130 */
131void
132dispatch(void)
133{
134 TCB * task;
135
136 Asm("pushn %r3");
137 task = runtsk;
138 task->tskctxb.sp = get_sp();
139 task->tskctxb.pc = && dispatch_1; /* gcc拡張機能を使用する */
140 Asm("xjp _kernel_exit_and_dispatch");
141dispatch_1:
142 Asm("popn %r3");
143 task = (TCB * volatile) runtsk;
144 if ((task->enatex != FALSE) && (task->texptn != 0)) {
145 Asm("xjp _kernel_calltex"); /* 例外ハンドラ起動 */
146 }
147}
148
149void
150exit_and_dispatch(void)
151{
152 register UW ulPsr;
153
154 lock_cpu(); /* CPUをロックする */
155 runtsk = schedtsk;
156 if (runtsk != NULL) {
157 set_sp(runtsk->tskctxb.sp);
158 set_pc(runtsk->tskctxb.pc);
159 }
160
161 set_sp(STACKTOP); /* 実行可能なタスクがない場合 */
162 ulPsr = get_psr(); /* 割り込みを許可してイベント */
163 ulPsr |= S1C33_PSR_FLAG_IE; /* 発生を待
164つ */
165 set_psr(ulPsr);
166 unlock_cpu();
167
168 while (1) {
169 Asm("halt");
170 }
171}
172
173/*
174 * 割込みハンドラ/CPU例外ハンドラ出口処理
175 */
176void
177ret_int(void)
178{
179 static TCB * task;
180
181 reqflg = FALSE;
182 task = runtsk;
183
184 if (task == NULL) { /* アイドル処理へジャンプする */
185 Asm("xjp _kernel_exit_and_dispatch");
186 }
187
188 if ((enadsp != FALSE) && (task != schedtsk)) {
189#ifndef __c33adv
190 Asm("pushn %r1");
191#endif /* __c33adv */
192 task->tskctxb.sp = get_sp();
193 task->tskctxb.pc = && ret_int_2;/* gcc拡張機能を使用 */
194 /* ディスパッチ処理へジャンプ */
195 Asm("xjp _kernel_exit_and_dispatch");
196ret_int_2:
197#ifndef __c33adv
198 Asm("popn %r1");
199#endif /* __c33adv */
200 }
201 task = (TCB * volatile) runtsk;
202 if ((task->enatex != FALSE) && (task->texptn != 0)) {
203 call_texrtn(); /* 例外ハンドラ起動 */
204 }
205#ifdef __c33adv
206 Asm("pops %sor");
207#else /* __c33adv */
208 Asm("ld.w %alr, %r1");
209 Asm("ld.w %ahr, %r0");
210#endif /* __c33adv */
211
212#if TPS_DAREA_CNT == 4 /* データエリアポインタ数に */
213 Asm("popn %r11"); /* 応じたpop処理を行う */
214#elif TPS_DAREA_CNT == 3
215 Asm("popn %r12");
216#elif TPS_DAREA_CNT == 2
217 Asm("popn %r13");
218#elif TPS_DAREA_CNT == 1
219 Asm("popn %r14");
220#else
221 Asm("popn %r15");
222#endif /* TPS_DAREA */
223
224 Asm("reti"); /* CPUロック状æ…
225‹ã¯å¾©å¸°ã—た */
226 /* タスクのサービスコールから */
227 /* リターンする時に解除される */
228}
229
230
231/*
232 * 割込みレベル変更処理
233 */
234ER
235chg_ilv(ILEVNO ilevno)
236{
237 UW ulPsr;
238 ER ercd;
239
240 LOG_CHG_ILV_ENTER(ilevno)
241 CHECK_TSKCTX_UNL();
242 if(ilevno > TPS_INTLEV_MAX){
243 ercd = E_PAR;
244 } else {
245 ulPsr = get_psr(); /* 現在のPSR値を取得 */
246 ulPsr = (ulPsr & ~S1C33_PSR_MASK_IL) | (ilevno << 8);
247 set_psr(ulPsr); /* PSR値を更新 */
248 ercd = E_OK;
249 }
250exit:
251 LOG_CHG_ILV_LEAVE(ercd) /* Set New IL */
252 return(ercd);
253}
254
255/*
256 * 割込みレベル取得処理
257 */
258ER
259get_ilv(ILEVNO *p_ilevno)
260{
261 UW ulPsr;
262 ER ercd;
263
264 LOG_GET_ILV_ENTER(p_ilevno)
265 CHECK_TSKCTX_UNL();
266 if(p_ilevno == NULL){
267 ercd = E_PAR;
268 } else {
269 ulPsr = get_psr(); /* 現在の割込みレベルを取得 */
270 *p_ilevno = (ulPsr & S1C33_PSR_MASK_IL) >> 8;
271 ercd = E_OK;
272 }
273exit:
274 LOG_GET_ILV_LEAVE(ercd, piLevno)
275 return(ercd);
276}
277
278#ifndef __c33pe
279/*
280 * 割込み発生許可処理
281 */
282ER
283ena_int(INTNO intno)
284{
285 INT iOffset, iBitFlag;
286
287 iOffset = get_Offset(intno); /* レジスタ位置を取得する */
288 iBitFlag = get_BitFlag(intno);
289
290 if(iOffset == E_PAR || iBitFlag == E_PAR){
291 return (E_PAR);
292 }
293 /* 割り込みを許可する */
294 (*(s1c33Intc_t *) S1C33_INTC_BASE).bIntEnable[iOffset] |= (UB)iBitFlag;
295
296 return (E_OK);
297}
298
299/*
300 * 割込み発生禁止処理
301 */
302ER
303dis_int(INTNO intno)
304{
305 INT iOffset, iBitFlag;
306
307 iOffset = get_Offset(intno); /* レジスタ位置を取得する */
308 iBitFlag = get_BitFlag(intno);
309
310 if(iOffset == E_PAR || iBitFlag == E_PAR){
311 return (E_PAR);
312 }
313 /* 割り込みを禁止する */
314 (*(s1c33Intc_t *) S1C33_INTC_BASE).bIntEnable[iOffset] &= ~((UB)iBitFlag);
315
316 return (E_OK);
317}
318
319/*
320 * 割込み発生要因クリア
321 */
322ER
323clr_int(INTNO intno)
324{
325 INT iOffset, iBitFlag;
326
327 iOffset = get_Offset(intno); /* レジスタ位置を取得する */
328 iBitFlag = get_BitFlag(intno);
329
330 if(iOffset == E_PAR || iBitFlag == E_PAR){
331 return (E_PAR);
332 }
333#ifdef __c33adv
334 if(intno > S1C33_INHNO_SERIAL3TX){ /* 許可/禁止レジスタと要因 */
335 iOffset -= 0x0d; /* フラグレジスタのオフセット */
336 } /* 位置が一致しないため */
337#endif /* __c33adv */
338 /* 割り込み要因をクリアする */
339 (*(s1c33Intc_t *) S1C33_INTC_BASE).bIntFactor[iOffset] = ((UB)iBitFlag);
340
341 return (E_OK);
342}
343#else /* __c33pe */
344#error "*_int() are valid for C33 Standard/Advanced macro."
345#endif /* __c33pe */
Note: See TracBrowser for help on using the repository browser.