source: uKadecot/trunk/ssp/extension/alarm.c

Last change on this file was 108, checked in by coas-nagasima, 9 years ago

MIMEプロパティの変更

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 6.0 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2011 by Meika Sugimoto
6 * Copyright (C) 2015 by Naoki Saito
7 * Nagoya Municipal Industrial Research Institute, JAPAN
8 *
9 * 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
11 * 再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
13 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース
14 * コード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
16 * できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
17 * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
18 * 証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
20 * できない形で再配布する場合には,次のいずれかの条件を満たすこと.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
22 * 権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
24 * 告すること.
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
26 * からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
27 * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
28 * く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29 *
30 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
31 * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
32 * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
33 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負
34 * わない.
35 *
36 */
37
38/*
39 * アラームハンドラ機能
40 */
41
42#include "alarm.h"
43#include "check.h"
44#include "time_event.h"
45
46/*
47 * トレースログマクロのデフォルト定義
48 */
49
50#ifndef LOG_ALM_ENTER
51#define LOG_ALM_ENTER(almidx)
52#endif /* LOG_ALM_ENTER */
53
54#ifndef LOG_ALM_LEAVE
55#define LOG_ALM_LEAVE(almidx)
56#endif /* LOG_ALM_LEAVE */
57
58#ifndef LOG_STA_ALM_ENTER
59#define LOG_STA_ALM_ENTER(almid, almtim)
60#endif /* LOG_STA_ALM_ENTER */
61
62#ifndef LOG_STA_ALM_LEAVE
63#define LOG_STA_ALM_LEAVE(ercd)
64#endif /* LOG_STA_ALM_LEAVE */
65
66#ifndef LOG_ISTA_ALM_ENTER
67#define LOG_ISTA_ALM_ENTER(almid, almtim)
68#endif /* LOG_ISTA_ALM_ENTER */
69
70#ifndef LOG_ISTA_ALM_LEAVE
71#define LOG_ISTA_ALM_LEAVE(ercd)
72#endif /* LOG_ISTA_ALM_LEAVE */
73
74#ifndef LOG_STP_ALM_ENTER
75#define LOG_STP_ALM_ENTER(almid)
76#endif /* LOG_STP_ALM_ENTER */
77
78#ifndef LOG_STP_ALM_LEAVE
79#define LOG_STP_ALM_LEAVE(ercd)
80#endif /* LOG_STP_ALM_LEAVE */
81
82#ifndef LOG_ISTP_ALM_ENTER
83#define LOG_ISTP_ALM_ENTER(almid)
84#endif /* LOG_ISTP_ALM_ENTER */
85
86#ifndef LOG_ISTP_ALM_LEAVE
87#define LOG_ISTP_ALM_LEAVE(ercd)
88#endif /* LOG_ISTP_ALM_LEAVE */
89
90
91/* 周期ハンドラIDをタイムイベントIDに変換 */
92#define ALM_EVTID(almid) ((ID)(INDEX_ALM(almid) + almevtid_offset))
93#define INDEX_ALM(almid) ((uint_t)((almid) - TMIN_ALMID))
94
95/* アラームハンドラの個数 */
96#define tnum_alm ((uint_t)(tmax_almid - TMIN_ALMID + 1))
97
98/* アラームの動作状態を表すビットマップ */
99#define ALMACT_BIT(index) (1U << (index))
100
101
102/* アラームハンドラ実行タイムイベント */
103void call_almhdr(uintptr_t almidx);
104
105
106/*
107 * アラームハンドラ機能の初期化
108 */
109
110#ifdef TOPPERS_almcal
111
112void
113initialize_alarm(void)
114{
115 /* 全てのアラームを停止状態にする */
116 almcb_almact = 0U;
117}
118
119#endif /* TOPPERS_almcal */
120
121/*
122 * アラームの開始
123 */
124
125#ifdef TOPPERS_sta_alm
126
127ER
128sta_alm(ID almid , RELTIM almtim)
129{
130 ER ercd;
131 uint_t index = INDEX_ALM(almid);
132
133 LOG_STA_ALM_ENTER(almid, almtim);
134 CHECK_TSKCTX_UNL();
135 CHECK_ALMID(almid);
136
137 t_lock_cpu();
138
139 if((almcb_almact & ALMACT_BIT(index)) != 0U) {
140 time_event_dequeue(ALM_EVTID(almid));
141 }
142 else {
143 almcb_almact |= ALMACT_BIT(index);
144 }
145
146 time_event_enqueue(ALM_EVTID(almid) ,
147 current_time + (EVTTIM)almtim , (CBACK)call_almhdr , index);
148
149 ercd = E_OK;
150 t_unlock_cpu();
151
152 error_exit:
153 LOG_STA_ALM_LEAVE(ercd);
154 return ercd;
155}
156
157#endif /* TOPPERS_sta_alm */
158
159/*
160 * アラームの開始(非タスクコンテキスト用)
161 */
162
163#ifdef TOPPERS_ista_alm
164
165ER
166ista_alm(ID almid , RELTIM almtim)
167{
168 ER ercd;
169 uint_t index = INDEX_ALM(almid);
170
171 LOG_ISTA_ALM_ENTER(almid, almtim);
172 CHECK_INTCTX_UNL();
173 CHECK_ALMID(almid);
174
175 i_lock_cpu();
176
177 if((almcb_almact & ALMACT_BIT(index)) != 0U) {
178 time_event_dequeue(ALM_EVTID(almid));
179 }
180 else {
181 almcb_almact |= ALMACT_BIT(index);
182 }
183
184 time_event_enqueue(ALM_EVTID(almid) ,
185 current_time + (EVTTIM)almtim , (CBACK)call_almhdr , index);
186
187 ercd = E_OK;
188 i_unlock_cpu();
189
190 error_exit:
191 LOG_ISTA_ALM_LEAVE(ercd);
192 return ercd;
193}
194
195#endif /* TOPPERS_ista_alm */
196
197/*
198 * アラームの停止
199 */
200
201#ifdef TOPPERS_stp_alm
202
203ER
204stp_alm(ID almid)
205{
206 ER ercd;
207 uint_t index = INDEX_ALM(almid);
208
209 LOG_STP_ALM_ENTER(almid);
210 CHECK_TSKCTX_UNL();
211 CHECK_ALMID(almid);
212
213 t_lock_cpu();
214
215 if((almcb_almact & ALMACT_BIT(index)) != 0U) {
216 almcb_almact &= ~ALMACT_BIT(index);
217 time_event_dequeue(ALM_EVTID(almid));
218 }
219 ercd = E_OK;
220 t_unlock_cpu();
221
222 error_exit:
223 LOG_STP_ALM_LEAVE(ercd);
224 return ercd;
225}
226
227#endif /* TOPPERS_stp_alm */
228
229/*
230 * アラームの停止(非タスクコンテキスト用)
231 */
232
233#ifdef TOPPERS_istp_alm
234
235ER
236istp_alm(ID almid)
237{
238 ER ercd;
239 uint_t index = INDEX_ALM(almid);
240
241 LOG_ISTP_ALM_ENTER(almid);
242 CHECK_INTCTX_UNL();
243 CHECK_ALMID(almid);
244
245 i_lock_cpu();
246
247 if((almcb_almact & ALMACT_BIT(index)) != 0U) {
248 almcb_almact &= ~ALMACT_BIT(index);
249 time_event_dequeue(ALM_EVTID(almid));
250 }
251 ercd = E_OK;
252 i_unlock_cpu();
253
254 error_exit:
255 LOG_ISTP_ALM_LEAVE(ercd);
256 return ercd;
257}
258
259#endif /* TOPPERS_istp_alm */
260
261/*
262 * アラームハンドラ起動ルーチン
263 */
264
265#ifdef TOPPERS_almcal
266
267void
268call_almhdr(uintptr_t almidx)
269{
270 /* アラームハンドラを停止状態にする */
271 almcb_almact &= ~ALMACT_BIT(almidx);
272
273 i_unlock_cpu();
274
275 /* アラームハンドラの実行 */
276 LOG_ALM_ENTER(almidx);
277 (*alminib_almhdr[almidx])(alminib_exinf[almidx]);
278 LOG_ALM_LEAVE(almidx);
279
280 if (!i_sense_lock()) {
281 i_lock_cpu();
282 }
283}
284
285#endif /* TOPPERS_almcal */
286
Note: See TracBrowser for help on using the repository browser.