source: azure_iot_hub_f767zi/trunk/asp_baseplatform/arch/arm_m_gcc/common/core_config_v6m.h@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 8.6 KB
RevLine 
[457]1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2015 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
34 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
35 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
36 * の責任を負わない.
37 *
38 * @(#) $Id$
39 */
40
41/*
42 * 割込み処理モデル(ARMv6-M用)
43 *
44 * このインクルードファイルは,core_config.h(または,そこからインク
45 * ルードされるファイル)のみからインクルードされる.他のファイルから
46 * 直接インクルードしてはならない.
47 */
48
49#ifndef TOPPERS_CORE_INTMODEL_V6M_H
50#define TOPPERS_CORE_INTMODEL_V6M_H
51
52/*
53 * ターゲット依存のオブジェクト属性
54 */
55#define TARGET_INHATR TA_NONKERNEL /* ターゲット定義の割込みハンドラ属性 */
56
57/*
58 * 割込み優先度マスクの外部表現と内部表現の変換
59 *
60 * アセンブリ言語のソースファイルからインクルードする場合のために,
61 * CASTを使用
62 * 外部表現 : TMIN_INTPRI ~ 0
63 * 内部表現 : 0 ~ -TMIN_INTPRI
64 */
65#define EXT_IPM(iipm) (CAST(PRI,iipm + TMIN_INTPRI)) /* 内部表現を外部表現に */
66#define INT_IPM(ipm) (CAST(uint8_t, ipm - TMIN_INTPRI)) /* 外部表現を内部表現に */
67
68/*
69 * 割込み優先度マスクをNVICの優先度に変換
70 */
71#define INT_NVIC_PRI(ipm) (((1 << TBITW_IPRI) - CAST(uint8_t, -(ipm))) << (8 - TBITW_IPRI))
72
73/*
74 * TIPM_ENAALL(割込み優先度マスク全解除)の内部表現
75 *
76 */
77#define IIPM_ENAALL (-TMIN_INTPRI)
78
79#ifndef TOPPERS_MACRO_ONLY
80
81/*
82 * 割込み要求禁止フラグの実現のための変数
83 */
84extern uint32_t ief; /* IRQの割込み要求許可フラグの状態 */
85extern uint8_t ief_systick; /* SysTickの割込み要求許可フラグの状態 */
86
87/*
88 * 割込み優先度マスク実現のための変数
89 */
90extern uint8_t iipm; /* 現在の割込み優先度マスクの値 */
91
92/*
93 * 割込み優先度マスク実現のための変数(kernel_cfg.c)
94 */
95extern const uint32_t iipm_enable_irq_tbl[];
96extern const uint8_t iipm_enable_systic_tbl[];
97
98/*
99 * CPUロック状態への移行
100 *
101 */
102Inline void
103x_lock_cpu(void)
104{
105 set_primask();
106 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
107 ARM_MEMORY_CHANGED;
108}
109
110#define t_lock_cpu() x_lock_cpu()
111#define i_lock_cpu() x_lock_cpu()
112
113/*
114 * CPUロック状態の解除
115 *
116 */
117Inline void
118x_unlock_cpu(void)
119{
120 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
121 ARM_MEMORY_CHANGED;
122 clear_primask();
123}
124
125#define t_unlock_cpu() x_unlock_cpu()
126#define i_unlock_cpu() x_unlock_cpu()
127
128/*
129 * CPUロック状態の参照
130 */
131Inline bool_t
132x_sense_lock(void)
133{
134 return(read_primask() == 0x1u);
135}
136
137#define t_sense_lock() x_sense_lock()
138#define i_sense_lock() x_sense_lock()
139
140/*
141 * chg_ipmで有効な割込み優先度の範囲の判定
142 *
143 * TMIN_INTPRIの値によらず,chg_ipmでは,-(1 << TBITW_IPRI)~TIPM_ENAALL(=0)
144 * の範囲に設定できることとする(ターゲット定義の拡張).
145 * 割込み優先度のビット幅(TBITW_IPRI)が 2 の場合は,-4 ~ 0 が指定可能である.
146 *
147 */
148#define VALID_INTPRI_CHGIPM(intpri) \
149 ((-((1 << TBITW_IPRI) - 1) <= (intpri) && (intpri) <= TIPM_ENAALL))
150
151/*
152 * (モデル上の)割込み優先度マスクの設定
153 *
154 */
155Inline void
156x_set_ipm(PRI intpri)
157{
158 uint32_t tmp;
159 iipm = INT_IPM(intpri);
160
161 tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS);
162 if ((iipm_enable_systic_tbl[iipm] & ief_systick) == 0x01) {
163 tmp |= SYSTIC_TICINT;
164 }else{
165 tmp &= ~SYSTIC_TICINT;
166 }
167 sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp);
168
169 /* 一旦全割込み禁止 */
170 sil_wrw_mem((void *)NVIC_CLRENA0, 0xffffffff);
171 sil_wrw_mem((void *)NVIC_SETENA0, (iipm_enable_systic_tbl[iipm] & ief));
172}
173
174#define t_set_ipm(intpri) x_set_ipm(intpri)
175#define i_set_ipm(intpri) x_set_ipm(intpri)
176
177/*
178 * (モデル上の)割込み優先度マスクの参照
179 *
180 */
181Inline PRI
182x_get_ipm(void)
183{
184 return EXT_IPM(iipm);
185}
186
187#define t_get_ipm() x_get_ipm()
188#define i_get_ipm() x_get_ipm()
189
190/*
191 * 割込み要求禁止フラグ
192 */
193
194/*
195 * 割込み属性が設定されているかを判別するための変数(kernel_cfg.c)
196 */
197extern const uint32_t bitpat_cfgint[];
198
199/*
200 * 割込み要求禁止フラグのセット
201 *
202 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
203 * フラグをクリアしようとした場合には,falseを返す.
204 */
205Inline bool_t
206x_disable_int(INTNO intno)
207{
208 uint32_t tmp;
209
210 /*
211 * 割込み属性が設定されていない場合
212 */
213 if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
214 return(false);
215 }
216
217 if (intno == IRQNO_SYSTICK) {
218 tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS);
219 tmp &= ~SYSTIC_TICINT;
220 sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp);
221 ief_systick &= ~0x01;
222 }else {
223 tmp = intno - 16;
224 sil_wrw_mem((void *)(NVIC_CLRENA0), (1 << (tmp & 0x1f)));
225 ief &= ~(1 << (tmp & 0x1f));
226 }
227
228 return(true);
229}
230
231#define t_disable_int(intno) x_disable_int(intno)
232#define i_disable_int(intno) x_disable_int(intno)
233
234/*
235 * 割込み要求禁止フラグの解除
236 *
237 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
238 * フラグをクリアしようとした場合には,falseを返す.
239 */
240Inline bool_t
241x_enable_int(INTNO intno)
242{
243 uint32_t tmp;
244
245 /*
246 * 割込み属性が設定されていない場合
247 */
248 if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
249 return(false);
250 }
251
252 if (intno == IRQNO_SYSTICK) {
253 ief_systick |= 0x01;
254 if ((iipm_enable_systic_tbl[iipm] & ief_systick) == 0x01) {
255 tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS);
256 tmp |= SYSTIC_TICINT;;
257 sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp);
258 }
259 }else {
260 tmp = intno - 16;
261 ief |= (1 << (tmp & 0x1f));
262 if ((iipm_enable_irq_tbl[iipm] & (1 << (tmp & 0x1f))) != 0) {
263 sil_wrw_mem((void *)(NVIC_SETENA0), (1 << (tmp & 0x1f)));
264 }
265 }
266
267 return(true);
268}
269
270#define t_enable_int(intno) x_enable_int(intno)
271#define i_enable_int(intno) x_enable_int(intno)
272
273/*
274 * PendSVCハンドラ(core_support.S)
275 */
276extern void pendsvc_handler(void);
277
278#endif /* TOPPERS_MACRO_ONLY */
279#endif /* TOPPERS_CORE_INTMODEL_V6M_H */
Note: See TracBrowser for help on using the repository browser.