source: ssp_qb_r5f100le_cs/trunk/arch/rl78_ca78k0r/prc_config.c

Last change on this file 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: 9.5 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6 * Toyohashi Univ. of Technology, JAPAN
7 * Copyright (C) 2005,2006 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 * Copyright (C) 2008 by Witz Corporation, JAPAN
10 * Copyright (C) 2010-2014 by Naoki Saito
11 * Nagoya Municipal Industrial Research Institute, JAPAN
12 *
13 * 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
14 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
15 * 再配布(以下,利用と呼ぶ)することを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
17 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース
18 * コード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
20 * できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
21 * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
22 * 証規定を掲載すること.
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
24 * できない形で再配布する場合には,次のいずれかの条件を満たすこと.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
26 * 権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
28 * 告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
30 * からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
31 * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
32 * く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
35 * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
36 * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
37 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負
38 * わない.
39 *
40 */
41
42/*
43 * プロセッサ依存モジュール(RL78)
44 */
45#pragma EI
46#pragma DI
47#include <kernel_impl.h>
48
49/*
50 * 割込み発生回数を保存する変数
51 */
52uint8_t intnest;
53
54
55/*
56 * (1) コンテキストに関する定義
57 */
58
59
60/*
61 * コンテキストの参照
62 */
63bool_t
64sense_context(void)
65{
66 /* ネストカウンタ0より大なら非タスクコンテキスト */
67 return (intnest > 0);
68}
69
70
71/*
72 * (2) システム状態に関する定義
73 */
74
75/*
76 * CPUロックフラグ実現のための変数
77 */
78bool_t lock_flag; /* CPUロックフラグの値を保持する変数 */
79#if TMIN_INTPRI != -4
80uint8_t saved_psw; /* 割込み優先度レベルを保存する変数 */
81#endif
82
83/*
84 * CPU ロック状態への移行
85 * この関数は,CPU ロック状態のときに呼びだされないことを前提とする.
86 */
87void
88t_lock_cpu(void)
89{
90#if TMIN_INTPRI == -4
91 DI();
92#else
93 /* タスクでは割込み優先度マスクの値は 0 のはずなので保存する必要がない */
94 set_psw(PSW_SET_ISP(get_psw(), ISP_LOCK));
95#endif
96 lock_flag = true;
97}
98
99void
100i_lock_cpu(void)
101{
102#if TMIN_INTPRI == -4
103 DI();
104#else
105 uint8_t psw;
106
107 /*
108 * get_psw() の返り値を直接 saved_isp に保存せず,一時変数
109 * psw へ保存するのは,get_psw() の呼びだし直後に割込みが発生し,
110 * 起動された割込み処理で saved_isp が変更される可能性があるため.
111 */
112 psw = get_psw();
113 if (TIPM_LOCK < ISP2IPM(PSW2ISP(psw))) {
114 set_psw(PSW_SET_ISP(psw, ISP_LOCK));
115 }
116 saved_psw = psw;
117#endif
118 lock_flag = true;
119}
120
121/*
122 * CPUロック状態の解除
123 * この関数は,CPU ロック状態のときにのみ呼びだされることを前提とする.
124 */
125void
126t_unlock_cpu(void)
127{
128 lock_flag = false;
129#if TMIN_INTPRI == -4
130 EI();
131#else
132 /* タスク実行時は割込みマスク全解除状態のはずなので,全解除にしておく */
133 set_psw(PSW_SET_ISP(get_psw(), ISP_ENAALL));
134#endif
135}
136
137void
138i_unlock_cpu(void)
139{
140 lock_flag = false;
141#if TMIN_INTPRI == -4
142 EI();
143#else
144 set_psw(PSW_SET_ISP(get_psw(), PSW2ISP(saved_psw)));
145#endif
146}
147
148/*
149 * CPUロック状態の参照
150 */
151bool_t
152x_sense_lock(void)
153{
154 return lock_flag;
155}
156
157/*
158 * 割込み優先度マスク(IPM) の設定
159 * 指定した割込み優先度(-1, -2, ..., TMIN_INTPRI) を元に
160 * プロセッサの割込み優先度レベル (IPL) を設定する.
161 */
162void
163x_set_ipm(PRI intpri)
164{
165 set_psw(PSW_SET_ISP(get_psw(), IPM2ISP(intpri)));
166}
167
168PRI
169x_get_ipm(void)
170{
171 return (ISP2IPM(PSW2ISP(get_psw())));
172}
173
174
175
176/*
177 * (7) dispacher での割込み待ち
178 */
179void
180idle_loop(void)
181{
182 t_unlock_cpu();
183 t_lock_cpu();
184}
185
186
187/*
188 * プロセッサ依存の初期化
189 */
190void
191prc_initialize(void)
192{
193}
194
195/*
196 * プロセッサ依存の終了処理
197 */
198void
199prc_terminate(void)
200{
201 /* 特に必要な処理はない */
202}
203
204/*
205 * 割込み要求禁止フラグのセット
206 */
207bool_t
208x_disable_int(INTNO intno)
209{
210 volatile uint8_t *reg_addr;
211
212 /* レベル定義が0である場合はCFG_INTされていない */
213 if(intpri_table[intno] == 0U)
214 {
215 return (false);
216 }
217 // 割込みマスク・フラグ・レジスタの該当ビットを1にセット
218 if(intno < 32) {
219 reg_addr = (volatile uint8_t *)TADR_MK0L;
220 reg_addr += (intno/8);
221 }
222 else {
223 reg_addr = (volatile uint8_t *)TADR_MK2L;
224 reg_addr += ((intno-32) / 8);
225 }
226 *reg_addr |= (uint8_t)(1 << (intno % 8));
227
228 return(true);
229}
230
231/*
232 * 割込み要求禁止フラグのクリア
233 */
234bool_t
235x_enable_int(INTNO intno)
236{
237 volatile uint8_t *reg_addr;
238
239 /* レベル定義が0である場合はCFG_INTされていない */
240 if(intpri_table[intno] == 0u)
241 {
242 return (false);
243 }
244 // 割込みマスク・フラグ・レジスタの該当ビットを0にセット
245 if(intno < 32) {
246 reg_addr = (volatile uint8_t *)TADR_MK0L;
247 reg_addr += (intno/8);
248 }
249 else {
250 reg_addr = (volatile uint8_t *)TADR_MK2L;
251 reg_addr += ((intno-32) / 8);
252 }
253 *reg_addr &= (uint8_t)~(1 << (intno % 8));
254
255 return(true);
256}
257
258/*
259 * 割込み要求のクリア
260 */
261void
262x_clear_int(INTNO intno)
263{
264 volatile uint8_t *reg_addr;
265
266 // 割込み要求フラグ・レジスタの該当ビットを0にセット
267 if(intno < 32) {
268 reg_addr = (volatile uint8_t *)TADR_IF0L;
269 reg_addr += (intno/8);
270 }
271 else {
272 reg_addr = (volatile uint8_t *)TADR_IF2L;
273 reg_addr += ((intno-32) / 8);
274 }
275 *reg_addr &= (uint8_t)~(1 << (intno % 8));
276}
277
278/*
279 * 割込み要求のチェック
280 */
281bool_t
282x_probe_int(INTNO intno)
283{
284 volatile uint8_t *reg_addr;
285
286 // 割込み要求フラグ・レジスタの該当ビットが 1 なら true
287 if(intno < 32) {
288 reg_addr = (volatile uint8_t *)TADR_IF0L;
289 reg_addr += (intno/8);
290 }
291 else {
292 reg_addr = (volatile uint8_t *)TADR_IF2L;
293 reg_addr += ((intno-32) / 8);
294 }
295
296 return((*reg_addr & (uint8_t)(1 << (intno % 8))) != 0);
297}
298
299/*
300 * 割込み要求ラインの属性の設定
301 */
302void
303x_config_int(INTNO intno, ATR intatr, PRI intpri)
304{
305 volatile uint8_t *reg_addr;
306 uint8_t portno;
307
308 assert(VALID_INTNO_CFGINT(intno));
309 assert(TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI);
310
311 /*
312 * 割込みのマスク
313 *
314 * 割込みを受け付けたまま,レベルトリガ/エッジトリガの設定や,割
315 * 込み優先度の設定を行うのは危険なため,割込み属性にかかわらず,
316 * 一旦マスクする.
317 */
318 (void) x_disable_int(intno);
319
320 /*
321 * 優先度の設定
322 */
323 // 優先順位指定フラグ・レジスタの該当ビットに値をセット
324 if(intno < 32) {
325 reg_addr = (volatile uint8_t *)TADR_PR00L;
326 reg_addr += (intno/8);
327 }
328 else {
329 reg_addr = (volatile uint8_t *)TADR_PR02L;
330 reg_addr += ((intno-32) / 8);
331 }
332 // 優先順位レベルの設定(低位ビット)
333 if((IPM2ILVL(intpri) & 0x01) != 0) {
334 *reg_addr |= (uint8_t)(1 << (intno % 8));
335 }
336 else {
337 *reg_addr &= (uint8_t)~(1 << (intno % 8));
338 }
339 // 優先順位レベルの設定(高位ビット)
340 if((IPM2ILVL(intpri) & 0x02) != 0) {
341 *(reg_addr+4) |= (uint8_t)(1 << (intno % 8));
342 }
343 else {
344 *(reg_addr+4) &= (uint8_t)~(1 << (intno % 8));
345 }
346
347 /*
348 * トリガの設定
349 */
350 if(intno <= 7) {
351 reg_addr = (volatile uint8_t *)TADR_EGP0; // EGP0
352 portno = (uint8_t)(intno - 2);
353 }
354 else {
355 reg_addr = (volatile uint8_t *)TADR_EGP1; // EGP1
356 portno = (uint8_t)(intno - 29);
357 }
358
359 /* INT端子の場合は割込み検知方法を設定する */
360 if((intatr & TA_POSEDGE) != 0U)
361 {
362 // 外部割込み立ち上がりエッジ許可レジスタの該当ビットを1にセット
363 *reg_addr |= (uint8_t)(1 << (portno % 8));
364 // 外部割込み立ち下がりエッジ許可レジスタの該当ビットを0にセット
365 *(reg_addr+1) &= (uint8_t)~(1 << (portno % 8));
366 }
367 else if((intatr & TA_NEGEDGE) != 0U)
368 {
369 // 外部割込み立ち上がりエッジ許可レジスタの該当ビットを0にセット
370 *reg_addr &= (uint8_t)~(1 << (portno % 8));
371 // 外部割込み立ち下がりエッジ許可レジスタの該当ビットを1にセット
372 *(reg_addr+1) |= (uint8_t)(1 << (portno % 8));
373 }
374 else if((intatr & TA_BOTHEDGE) != 0U)
375 {
376 // 外部割込み立ち上がりエッジ許可レジスタの該当ビットを1にセット
377 *reg_addr |= (uint8_t)(1 << (portno % 8));
378 // 外部割込み立ち下がりエッジ許可レジスタの該当ビットを1にセット
379 *(reg_addr+1) |= (uint8_t)(1 << (portno % 8));
380 }
381 else { // どちらでもない場合はエッジ検出を禁止
382 // 外部割込み立ち上がりエッジ許可レジスタの該当ビットを0にセット
383 *reg_addr &= (uint8_t)~(1 << (portno % 8));
384 // 外部割込み立ち下がりエッジ許可レジスタの該当ビットを0にセット
385 *(reg_addr+1) &= (uint8_t)~(1 << (portno % 8));
386 }
387
388 /*
389 * 割込みのマスク解除(優先度設定)
390 */
391 if ((intatr & TA_ENAINT) != 0U) {
392 (void) x_enable_int(intno);
393 }
394}
395
396/*
397 * NMIを除くすべての割込みの禁止
398 */
399uint8_t
400TOPPERS_disint(void)
401{
402 volatile uint8_t TOPPERS_psw;
403
404 TOPPERS_psw = get_psw();
405 DI();
406 return(TOPPERS_psw);
407}
408
409/*
410 * 割込み優先度マスク(内部表現)の現在値の設定
411 */
412void
413TOPPERS_enaint(uint8_t TOPPERS_psw)
414{
415 if(TOPPERS_psw & PSW_IE_MASK)
416 {
417 EI();
418 }
419}
420
421
Note: See TracBrowser for help on using the repository browser.