source: rtos_arduino/trunk/asp_1.9.2/kernel/alarm.c@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 7.9 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * @(#) $Id: alarm.c 2133 2011-06-26 03:14:51Z ertl-hiro $
56 */
57
58/*
59 * アラームハンドラ機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "alarm.h"
65
66/*
67 * トレースログマクロのデフォルト定義
68 */
69#ifndef LOG_ALM_ENTER
70#define LOG_ALM_ENTER(p_almcb)
71#endif /* LOG_ALM_ENTER */
72
73#ifndef LOG_ALM_LEAVE
74#define LOG_ALM_LEAVE(p_almcb)
75#endif /* LOG_ALM_LEAVE */
76
77#ifndef LOG_STA_ALM_ENTER
78#define LOG_STA_ALM_ENTER(almid, almtim)
79#endif /* LOG_STA_ALM_ENTER */
80
81#ifndef LOG_STA_ALM_LEAVE
82#define LOG_STA_ALM_LEAVE(ercd)
83#endif /* LOG_STA_ALM_LEAVE */
84
85#ifndef LOG_ISTA_ALM_ENTER
86#define LOG_ISTA_ALM_ENTER(almid, almtim)
87#endif /* LOG_ISTA_ALM_ENTER */
88
89#ifndef LOG_ISTA_ALM_LEAVE
90#define LOG_ISTA_ALM_LEAVE(ercd)
91#endif /* LOG_ISTA_ALM_LEAVE */
92
93#ifndef LOG_STP_ALM_ENTER
94#define LOG_STP_ALM_ENTER(almid)
95#endif /* LOG_STP_ALM_ENTER */
96
97#ifndef LOG_STP_ALM_LEAVE
98#define LOG_STP_ALM_LEAVE(ercd)
99#endif /* LOG_STP_ALM_LEAVE */
100
101#ifndef LOG_ISTP_ALM_ENTER
102#define LOG_ISTP_ALM_ENTER(almid)
103#endif /* LOG_ISTP_ALM_ENTER */
104
105#ifndef LOG_ISTP_ALM_LEAVE
106#define LOG_ISTP_ALM_LEAVE(ercd)
107#endif /* LOG_ISTP_ALM_LEAVE */
108
109#ifndef LOG_REF_ALM_ENTER
110#define LOG_REF_ALM_ENTER(almid, pk_ralm)
111#endif /* LOG_REF_ALM_ENTER */
112
113#ifndef LOG_REF_ALM_LEAVE
114#define LOG_REF_ALM_LEAVE(ercd, pk_ralm)
115#endif /* LOG_REF_ALM_LEAVE */
116
117/*
118 * アラームハンドラの数
119 */
120#define tnum_alm ((uint_t)(tmax_almid - TMIN_ALMID + 1))
121
122/*
123 * アラームハンドラIDからアラームハンドラ管理ブロックを取り出すためのマクロ
124 */
125#define INDEX_ALM(almid) ((uint_t)((almid) - TMIN_ALMID))
126#define get_almcb(almid) (&(almcb_table[INDEX_ALM(almid)]))
127
128/*
129 * アラームハンドラ機能の初期化
130 */
131#ifdef TOPPERS_almini
132
133void
134initialize_alarm(void)
135{
136 uint_t i;
137 ALMCB *p_almcb;
138
139 for (i = 0; i < tnum_alm; i++) {
140 p_almcb = &(almcb_table[i]);
141 p_almcb->p_alminib = &(alminib_table[i]);
142 p_almcb->almsta = false;
143 }
144}
145
146#endif /* TOPPERS_almini */
147
148/*
149 * アラームハンドラの動作開始
150 */
151#ifdef TOPPERS_sta_alm
152
153ER
154sta_alm(ID almid, RELTIM almtim)
155{
156 ALMCB *p_almcb;
157 ER ercd;
158
159 LOG_STA_ALM_ENTER(almid, almtim);
160 CHECK_TSKCTX_UNL();
161 CHECK_ALMID(almid);
162 CHECK_PAR(almtim <= TMAX_RELTIM);
163 p_almcb = get_almcb(almid);
164
165 t_lock_cpu();
166 if (p_almcb->almsta) {
167 tmevtb_dequeue(&(p_almcb->tmevtb));
168 }
169 else {
170 p_almcb->almsta = true;
171 }
172 tmevtb_enqueue(&(p_almcb->tmevtb), almtim,
173 (CBACK) call_almhdr, (void *) p_almcb);
174 ercd = E_OK;
175 t_unlock_cpu();
176
177 error_exit:
178 LOG_STA_ALM_LEAVE(ercd);
179 return(ercd);
180}
181
182#endif /* TOPPERS_sta_alm */
183
184/*
185 * アラームハンドラの動作開始(非タスクコンテキスト用)
186 */
187#ifdef TOPPERS_ista_alm
188
189ER
190ista_alm(ID almid, RELTIM almtim)
191{
192 ALMCB *p_almcb;
193 ER ercd;
194
195 LOG_ISTA_ALM_ENTER(almid, almtim);
196 CHECK_INTCTX_UNL();
197 CHECK_ALMID(almid);
198 CHECK_PAR(almtim <= TMAX_RELTIM);
199 p_almcb = get_almcb(almid);
200
201 i_lock_cpu();
202 if (p_almcb->almsta) {
203 tmevtb_dequeue(&(p_almcb->tmevtb));
204 }
205 else {
206 p_almcb->almsta = true;
207 }
208 tmevtb_enqueue(&(p_almcb->tmevtb), almtim,
209 (CBACK) call_almhdr, (void *) p_almcb);
210 ercd = E_OK;
211 i_unlock_cpu();
212
213 error_exit:
214 LOG_ISTA_ALM_LEAVE(ercd);
215 return(ercd);
216}
217
218#endif /* TOPPERS_ista_alm */
219
220/*
221 * アラームハンドラの動作停止
222 */
223#ifdef TOPPERS_stp_alm
224
225ER
226stp_alm(ID almid)
227{
228 ALMCB *p_almcb;
229 ER ercd;
230
231 LOG_STP_ALM_ENTER(almid);
232 CHECK_TSKCTX_UNL();
233 CHECK_ALMID(almid);
234 p_almcb = get_almcb(almid);
235
236 t_lock_cpu();
237 if (p_almcb->almsta) {
238 p_almcb->almsta = false;
239 tmevtb_dequeue(&(p_almcb->tmevtb));
240 }
241 ercd = E_OK;
242 t_unlock_cpu();
243
244 error_exit:
245 LOG_STP_ALM_LEAVE(ercd);
246 return(ercd);
247}
248
249#endif /* TOPPERS_stp_alm */
250
251/*
252 * アラームハンドラの動作停止(非タスクコンテキスト用)
253 */
254#ifdef TOPPERS_istp_alm
255
256ER
257istp_alm(ID almid)
258{
259 ALMCB *p_almcb;
260 ER ercd;
261
262 LOG_ISTP_ALM_ENTER(almid);
263 CHECK_INTCTX_UNL();
264 CHECK_ALMID(almid);
265 p_almcb = get_almcb(almid);
266
267 i_lock_cpu();
268 if (p_almcb->almsta) {
269 p_almcb->almsta = false;
270 tmevtb_dequeue(&(p_almcb->tmevtb));
271 }
272 ercd = E_OK;
273 i_unlock_cpu();
274
275 error_exit:
276 LOG_ISTP_ALM_LEAVE(ercd);
277 return(ercd);
278}
279
280#endif /* TOPPERS_istp_alm */
281
282/*
283 * アラームハンドラの状æ…
284‹å‚ç…
285§
286 */
287#ifdef TOPPERS_ref_alm
288
289ER
290ref_alm(ID almid, T_RALM *pk_ralm)
291{
292 ALMCB *p_almcb;
293 ER ercd;
294
295 LOG_REF_ALM_ENTER(almid, pk_ralm);
296 CHECK_TSKCTX_UNL();
297 CHECK_ALMID(almid);
298 p_almcb = get_almcb(almid);
299
300 t_lock_cpu();
301 if (p_almcb->almsta) {
302 pk_ralm->almstat = TALM_STA;
303 pk_ralm->lefttim = tmevt_lefttim(&(p_almcb->tmevtb));
304 }
305 else {
306 pk_ralm->almstat = TALM_STP;
307 }
308 ercd = E_OK;
309 t_unlock_cpu();
310
311 error_exit:
312 LOG_REF_ALM_LEAVE(ercd, pk_ralm);
313 return(ercd);
314}
315
316#endif /* TOPPERS_ref_alm */
317
318/*
319 * アラームハンドラ起動ルーチン
320 */
321#ifdef TOPPERS_almcal
322
323void
324call_almhdr(ALMCB *p_almcb)
325{
326 PRI saved_ipm;
327
328 /*
329 * アラームハンドラを停止状æ…
330‹ã«ã™ã‚‹ï¼Ž
331 */
332 p_almcb->almsta = false;
333
334 /*
335 * アラームハンドラを,CPUロック解除状æ…
336‹ã§å‘¼ã³å‡ºã™ï¼Ž
337 */
338 saved_ipm = i_get_ipm();
339 i_unlock_cpu();
340
341 LOG_ALM_ENTER(p_almcb);
342 (*((ALMHDR)(p_almcb->p_alminib->almhdr)))(p_almcb->p_alminib->exinf);
343 LOG_ALM_LEAVE(p_almcb);
344
345 if (!i_sense_lock()) {
346 i_lock_cpu();
347 }
348 i_set_ipm(saved_ipm);
349}
350
351#endif /* TOPPERS_almcal */
Note: See TracBrowser for help on using the repository browser.