source: ssp_armv6_m_gcc/tags/1.3.0/arch/armv6_m_gcc/prc_config.c@ 86

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

add separate package of SSP kernel for ARMv6-M

File size: 6.5 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 * Copyright (C) 2010 by Meika Sugimoto
8 * Copyright (C) 2013 by Naoki Saito
9 * Nagoya Municipal Industrial Research Institute, JAPAN
10 *
11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * @(#) $Id: prc_config.c 1304 2008-08-27 07:28:36Z ertl-honda $
41 */
42
43/*
44 * プロセッサ依存モジュール(ARM-M用)
45 */
46
47#include "kernel_impl.h"
48#include "check.h"
49#include "task.h"
50
51#include <t_syslog.h>
52
53/* 割込みネスト数の管理 */
54uint8_t intnest;
55
56/*
57 * ベクタテーブル(kernel_cfg.c)
58 */
59extern const FP vector_table[];
60
61/*
62 * システム例外・割込みの(例外番号 4〜15)
63 * 割込み優先度設定レジスタへのアクセスのための配列
64 */
65static const unsigned int nvic_sys_pri_reg[] = {
66 0,
67 NVIC_SYS_PRI1,
68 NVIC_SYS_PRI2,
69 NVIC_SYS_PRI3
70};
71
72/*
73 * 例外と割込みの割込み優先度をセット
74 *
75 * excnoはARM-Mで定められている Exception Number を指定.
76 */
77void
78set_exc_int_priority(uint32_t excno, uint8_t pri){
79 uint32_t tmp, reg;
80
81 /*
82 * 割込み優先度設定レジスタの決定
83 */
84 if ((EXCNO_MPU <= excno) && (excno <= IRQNO_SYSTICK)) {
85 /*
86 * Exception Number 4(Memory Management)から
87 * Exception Number 15(SysTick)までの割込み優先度はシステム優先度
88 * レジスタにより設定.
89 */
90 reg = nvic_sys_pri_reg[excno >> 2];
91 }
92 else if ((TMIN_INTNO < excno) && (excno <= TMAX_INTNO)){
93 /*
94 * IRQ割込みなら
95 */
96 reg = NVIC_PRI0 + (((excno - (TMIN_INTNO + 1)) >> 2) * 4);
97 }
98 else {
99 return ;
100 }
101
102 tmp = sil_rew_mem((void *)reg);
103 tmp &= ~(0xFF << (8 * (excno & 0x03)));
104 tmp |= (pri << (8 - TBITW_IPRI)) << (8 * (excno & 0x03));
105 sil_wrw_mem((void *)reg, tmp);
106}
107
108/*
109 * 例外の許可
110 *
111 * Memory Management, Bus Fault, Usage Fault は禁止・許可が買おう
112 */
113void
114enable_exc(EXCNO excno)
115{
116 uint32_t tmp;
117
118 switch (excno) {
119 case EXCNO_MPU:
120 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
121 tmp |= NVIC_SYS_HND_CTRL_MEM;
122 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
123 break;
124 case EXCNO_BUS:
125 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
126 tmp |= NVIC_SYS_HND_CTRL_BUS;
127 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
128 break;
129 case EXCNO_USAGE:
130 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
131 tmp |= NVIC_SYS_HND_CTRL_USAGE;
132 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
133 break;
134 }
135}
136
137/*
138 * 例外の禁止
139 */
140void
141disable_exc(EXCNO excno)
142{
143 uint32_t tmp;
144
145 switch (excno) {
146 case EXCNO_MPU:
147 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
148 tmp &= ~NVIC_SYS_HND_CTRL_MEM;
149 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
150 break;
151 case EXCNO_BUS:
152 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
153 tmp &= ~NVIC_SYS_HND_CTRL_BUS;
154 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
155 break;
156 case EXCNO_USAGE:
157 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
158 tmp &= ~NVIC_SYS_HND_CTRL_USAGE;
159 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
160 break;
161 }
162}
163
164
165/*
166 * プロセッサ依存の初期化
167 */
168void
169prc_initialize(void)
170{
171
172 /* 割込みネスト数の初期化 */
173 intnest = 0u;
174
175 /*
176 * ベクタテーブルを設定
177 */
178 sil_wrw_mem((void*)NVIC_VECTTBL, (uint32_t)vector_table);
179
180 /*
181 * SVCハンドラの優先度を設定
182 */
183// set_exc_int_priority(EXCNO_SVCALL, -4);
184
185 /*
186 * SVCハンドラを有効に
187 */
188// x_enable_int(EXCNO_SVCALL);
189}
190
191/*
192 * プロセッサ依存の終了処理
193 */
194void NoReturn
195prc_terminate(void)
196{
197 while(1)
198 ;
199}
200
201/*
202 * 割込み要求ライン属性の設定
203 */
204void
205x_config_int(INTNO intno, ATR intatr, PRI intpri)
206{
207 //assert(VALID_INTNO_CFGINT(intno));
208 //assert(TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI);
209
210 /*
211 * 一旦割込みを禁止する
212 */
213 (void)x_disable_int(intno);
214 x_clear_int(intno);
215
216 /*
217 * 割込み優先度をセット
218 */
219 set_exc_int_priority(intno, intpri);
220
221 /*
222 * 割込み要求マスク解除(必要な場合)
223 * 同時に割込み優先度もセットされる
224 */
225 if ((intatr & TA_ENAINT) != 0U) {
226 (void) x_enable_int(intno);
227 }
228}
229
230
231#ifndef OMIT_DEFAULT_EXC_HANDLER
232/*
233 * Trapa以外の例外で登録されていない例外が発生すると呼び出される
234 */
235void
236default_exc_handler(void *p_excinf)
237{
238 uint32_t pc = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_PC);
239 uint32_t xpsr = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_XPSR);
240 uint32_t excno = get_ipsr() & IPSR_ISR_NUMBER;
241
242 syslog(LOG_EMERG, "\nUnregistered Exception occurs.");
243 syslog(LOG_EMERG, "Excno = %08x PC = %08x XPSR = %08x, p_excinf = %08X",
244 excno, pc, xpsr, p_excinf);
245
246 target_exit();
247}
248#endif /* OMIT_DEFAULT_EXC_HANDLER */
249
250#ifndef OMIT_DEFAULT_INT_HANDLER
251/*
252 * 未登録の割込みが発生した場合に呼び出される
253 */
254void
255default_int_handler(void *p_excinf)
256{
257 uint32_t pc = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_PC);
258 uint32_t xpsr = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_XPSR);
259 uint32_t excno = get_ipsr() & IPSR_ISR_NUMBER;
260
261 syslog(LOG_EMERG, "\nUnregistered Interrupt occurs.");
262 syslog(LOG_EMERG, "Excno = %08x PC = %08x XPSR = %08x, p_excinf = %08X",
263 excno, pc, xpsr, p_excinf);
264
265 target_exit();
266}
267#endif /* OMIT_DEFAULT_INT_HANDLER */
Note: See TracBrowser for help on using the repository browser.