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

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

initial

File size: 9.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-2004 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2001-2007 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
10 * Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering
11 * Tomakomai National College of Technology, JAPAN
12 * Copyright (C) 2003-2004 by Katsuhiro Amano
13 *
14 * 上記著作権者
15は,以下の (1)〜(4) の条件か,Free Software Foundation
16 * によってå…
17¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
18 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
19 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
20å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
21 * 利用と呼ぶ)することを無償で許諾する.
22 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
23 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
24 * スコード中に含まれていること.
25 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
26 * 用できる形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
29 * 者
30マニュアルなど)に,上記の著作権表示,この利用条件および下記
31 * の無保証規定を掲載すること.
32 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
33 * 用できない形で再é…
34å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
35 * と.
36 * (a) 再é…
37å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
38マニュアルなど)に,上記の著
39 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
40 * (b) 再é…
41å¸ƒã®å½¢æ…
42‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
43 * 報告すること.
44 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
45 * 害からも,上記著作権者
46およびTOPPERSプロジェクトをå…
47è²¬ã™ã‚‹ã“と.
48 *
49 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
50お
51 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
52 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
53 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
54 *
55 * @(#) $Id: cpu_config.c,v 1.7 2007/03/23 07:58:33 honda Exp $
56 */
57
58/*
59 * プロセッサ依存モジュール(H8用)
60 *   カーネル内
61部で使用する定義
62 *    C言語関数の実体
63 */
64
65#include "jsp_kernel.h"
66#include "check.h"
67#include "task.h"
68#include "sil.h"
69#include <hw_serial.h> /* SCI_putchar_pol() */
70
71#ifdef SUPPORT_CHG_IPM
72/*
73 * タスクコンテキストでの割込みマスク
74 */
75volatile UB task_intmask = 0;
76#endif /* SUPPORT_CHG_IPM */
77
78/*
79 * 非タスクコンテキストでの割込みマスク
80 */
81volatile UB int_intmask = 0;
82
83/*
84 * 割込みネストカウンタ
85 */
86volatile UB intnest = 0;
87
88/*
89 * CPUロック状æ…
90‹ã‚’表すフラグ
91 */
92volatile BOOL iscpulocked = TRUE;
93
94/*
95 * タイマのプライオリティレベル設定用のデータ
96 * 本来はhw_timer.hに記述するべきだが、そうすると
97 * hw_timer.hをインクルードしたファイルですべて実体化されて
98 *   メモリ領域を占有してしまうため、実体はここに記述する。
99 */
100const IRC TIMER_IRC = {(UB*)SYSTEM_TIMER_IPR,
101 SYSTEM_TIMER_IP_BIT,
102 SYSTEM_TIMER_IPM
103};
104
105/*
106 * SYSCRの初期値
107 * $CPUディレクトリで定義する内
108容
109 *  ビット7 SSBY=0:sleep命令でスリープモードへ移行
110 *  ビット3 UE=1:CCR.UIを割込みマスクビットとして利用
111 *  ビット1 1:リザーブビット
112 *  ビット0 RAME=1:内
113蔵RAM有効
114 * $SYSディレクトリでSYSCR_SYSとして定義する内
115容
116 *  ビット6-4 STS:スタンバイ・タイマ・セレクト
117 *  ビット2 NMIEG:NMIエッジ
118 */
119#define SYSCR_INI (H8SYSCR_UE | BIT1 | H8SYSCR_RAME | SYSCR_SYS)
120
121/*
122 * プロセッサ依存の初期化
123 */
124void
125cpu_initialize(void)
126{
127 /*
128 * 以下の3つはスタートアップルーチンで初期化が済んでいる。
129 *   ・割込みネストカウンタ intnest
130 *   ・非タスクコンテキストの割込みマスク int_intmask
131 *   ・タスクコンテキストの割込みマスク task_intmask
132 *     (chg_ipmをサポートする場合)
133 */
134
135 /*
136 * SYSCRの設定
137 */
138 sil_wrb_mem((VP)H8SYSCR, (VB)SYSCR_INI);
139
140 /* 未完成 */
141 /* sleep命令で遷移する省電力状æ…
142‹ã®è¨­å®š */
143
144 /* 低レベル出力用シリアルポートの初期化 */
145 SCI_initialize(SCI_LOW_PORTID);
146}
147
148/*
149 * プロセッサ依存の終了処理
150 */
151void
152cpu_terminate(void)
153{
154}
155
156#ifdef SUPPORT_CHG_IPM
157/*
158 * 割込みマスクの変更
159 *
160 * IPMに設定できる値としてIPM_LEVEL0、IPM_LEVEL1がマクロ定義されている。
161 *
162 *
163 * IPM_LEVEL0:レベル0 すべての割込みを受け付ける
164 * IPM_LEVEL1:レベル1 NMIおよびプライオリティレベル1の割込みのみを
165 *            受け付ける
166 *
167 * chg_ipm を使って IPM をレベル2(NMI 以外のすべての割込みを禁止)に
168 * 変更することはできない.NMI 以外のすべての割込みを禁止したい場合
169 * には,loc_cpu によりCPUロック状æ…
170‹ã«ã™ã‚Œã°ã‚ˆã„.
171 * IPM が 0 以外の時にも,タスクディスパッチは保留されない.IPM は,
172 * タスクディスパッチによって,新しく実行状æ…
173‹ã«ãªã£ãŸã‚¿ã‚¹ã‚¯ã¸å¼•ãç¶™ãŒ
174 * れる.そのため,タスクが実行中に,別のタスクによって IPM が変更さ
175 * れる場合がある.JSPカーネルでは,IPM の変更はタスク例外処理ルーチ
176 * ンによっても起こるのが,これによって扱いが難しくなる状況は少ないと
177 * 思われる.
178 * IPM の値によってタスクディスパッチを禁止したい場合には,dis_dspを
179 * 併用すればよい.
180 */
181SYSCALL ER
182chg_ipm(IPM ipm)
183{
184 ER ercd = E_OK;
185
186 LOG_CHG_IPM_ENTER(ipm);
187 CHECK_TSKCTX_UNL();
188 CHECK_PAR( (ipm == IPM_LEVEL0) || (ipm == IPM_LEVEL1) || (ipm == IPM_LEVEL2));
189
190 t_lock_cpu();
191 task_intmask = ipm;
192 t_unlock_cpu();
193
194 exit:
195 LOG_CHG_IPM_LEAVE(ercd)
196 return(ercd);
197}
198
199/*
200 * 割込みマスクの参ç…
201§
202 */
203SYSCALL ER
204get_ipm(IPM *p_ipm)
205{
206 ER ercd = E_OK;
207
208 LOG_GET_IPM_ENTER(p_ipm);
209 CHECK_TSKCTX_UNL();
210
211 t_lock_cpu();
212 *p_ipm = task_intmask;
213 t_unlock_cpu();
214
215 exit:
216 LOG_GET_IPM_LEAVE(ercd, *p_ipm);
217 return(ercd);
218}
219
220#endif /* SUPPORT_CHG_IPM */
221
222/*
223 * 微少時間待
224ち
225 *   注意事項
226:
227 *    標準ではdlytimはUINT型だが16ビットしかないので、
228 *    UW型に変更している。
229 *    sil_dly_nse()は内
230部でsil_dly_nse2()を呼び出す。
231 */
232void sil_dly_nse(UINT dlytim) {
233 sil_dly_nse_long((UW)dlytim);
234}
235
236/*****以下、å…
237±é€šéƒ¨ã¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«å«ã¾ã‚Œãªã„部分*********/
238
239/*
240 * 登録されていない割り込みのデフォルト処理
241 */
242
243/*
244 * スタックのå…
245ˆé ­ã‹ã‚‰å„レジスタのまでのオフセット
246 *
247 *  スタック構造
248 *   +0:er0
249 *   +4:er1
250 *   +8:er2
251 *  +12:er3
252 *  +16:er4
253 *  +20:er5
254 *  +24:er6
255 *  +28:crr
256 *  +29:pc
257 *  +32〜:割込み前に使用されていたスタック領域
258 */
259
260/*
261 * 割込み発生直前のスタックポインタまでのオフセット
262 */
263#define OFFSET_SP 32
264
265/*
266 * 登録されていない割り込みが発生すると呼び出される
267 */
268void
269cpu_experr(EXCSTACK *sp)
270{
271 UW sp2, pc, ccr, tmp;
272
273 sp2 = (UW)sp + OFFSET_SP;
274 tmp = sp->pc;
275 ccr = (tmp >> 24U) & 0xff; /* 上位1バイト */
276 pc = tmp & 0x00ffffffUL; /* 下位3バイト */
277
278 /*
279 * %x(整数型)では2バイトしか表示できないので
280 * %p(ポインタ型)を用いて4バイト表示している。
281 */
282 syslog(LOG_EMERG, "Unexpected interrupt.");
283 syslog(LOG_EMERG, "PC = 0x%08p SP = 0x%08p CCR = 0x%02x",
284 (VP)pc, (VP)sp2, (INT)ccr);
285 syslog(LOG_EMERG, "ER0 = 0x%08p ER1 = 0x%08p ER2 = 0x%08p ER3 = 0x%08p",
286 (VP)(sp->er0), (VP)(sp->er1), (VP)(sp->er2), (VP)(sp->er3));
287 syslog(LOG_EMERG, "ER4 = 0x%08p ER5 = 0x%08p ER6 = 0x%08p",
288 (VP)(sp->er4), (VP)(sp->er5), (VP)(sp->er6));
289 while(1)
290 ;
291}
292
293/*
294 * ターゲットシステムの文字出力
295 *
296 * システムの低レベルの文字出力ルーチン.
297 */
298void
299cpu_putc(char c)
300{
301 if (c == '\n') {
302 SCI_putchar_pol('\r');
303 }
304 SCI_putchar_pol((UB)c);
305}
Note: See TracBrowser for help on using the repository browser.