source: atk2-sc3_fl850f1l/kernel/alarm.c@ 165

Last change on this file since 165 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 13.9 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
11 * Copyright (C) 2011-2013 by Spansion LLC, USA
12 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
13 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
14 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
15 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
16 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
17 * Copyright (C) 2004-2015 by Witz Corporation
18 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
19 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
20 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
21 *
22 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
25 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
26 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
27 * スコード中に含まれていること.
28 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
29 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
30 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
31 * の無保証規定を掲載すること.
32 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
33 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
34 * と.
35 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
43 * 免責すること.
44 *
45 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
46 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
47 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
48 * 用する者に対して,AUTOSARパートナーになることを求めている.
49 *
50 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
51 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
52 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
53 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
54 * の責任を負わない.
55 *
56 * $Id: alarm.c 187 2015-06-25 03:39:04Z t_ishikawa $
57 */
58
59/*
60 * アラーム管理モジュール
61 */
62
63#include "kernel_impl.h"
64#include "check.h"
65#include "alarm.h"
66
67/*
68 * トレースログマクロのデフォルト定義
69 */
70#ifndef LOG_GETALB_ENTER
71#define LOG_GETALB_ENTER(almid)
72#endif /* LOG_GETALB_ENTER */
73
74#ifndef LOG_GETALB_LEAVE
75#define LOG_GETALB_LEAVE(ercd, info)
76#endif /* LOG_GETALB_LEAVE */
77
78#ifndef LOG_GETALM_ENTER
79#define LOG_GETALM_ENTER(almid)
80#endif /* LOG_GETALM_ENTER */
81
82#ifndef LOG_GETALM_LEAVE
83#define LOG_GETALM_LEAVE(ercd, p_tick)
84#endif /* LOG_GETALM_LEAVE */
85
86#ifndef LOG_SETREL_ENTER
87#define LOG_SETREL_ENTER(almid, incr, cycle)
88#endif /* LOG_SETREL_ENTER */
89
90#ifndef LOG_SETREL_LEAVE
91#define LOG_SETREL_LEAVE(ercd)
92#endif /* LOG_SETREL_LEAVE */
93
94#ifndef LOG_SETABS_ENTER
95#define LOG_SETABS_ENTER(almid, start, cycle)
96#endif /* LOG_SETABS_ENTER */
97
98#ifndef LOG_SETABS_LEAVE
99#define LOG_SETABS_LEAVE(ercd)
100#endif /* LOG_SETABS_LEAVE */
101
102#ifndef LOG_CANALM_ENTER
103#define LOG_CANALM_ENTER(almid)
104#endif /* LOG_CANALM_ENTER */
105
106#ifndef LOG_CANALM_LEAVE
107#define LOG_CANALM_LEAVE(ercd)
108#endif /* LOG_CANALM_LEAVE */
109
110#ifndef LOG_ALM_ENTER
111#define LOG_ALM_ENTER(p_cntexpinfo)
112#endif /* LOG_ALM_ENTER */
113
114#ifndef LOG_ALM_LEAVE
115#define LOG_ALM_LEAVE(p_cntexpinfo)
116#endif /* LOG_ALM_LEAVE */
117
118/*
119 * アラーム機能の初期化
120 */
121#ifdef TOPPERS_alarm_initialize
122
123void
124alarm_initialize(void)
125{
126 AlarmType i;
127 ALMCB *p_almcb;
128
129 for (i = 0U; i < tnum_alarm; i++) {
130 p_almcb = &(almcb_table[i]);
131
132 p_almcb->p_alminib = &(alminib_table[i]);
133 (p_almcb->cntexpinfo).expirefunc = &alarm_expire;
134 if ((p_almcb->p_alminib->autosta & ((AppModeType) 1 << appmodeid)) != APPMODE_NONE) {
135 if (p_almcb->p_alminib->actatr == ABSOLUTE) {
136 /*
137 * 絶対時間の起動
138 * 満了時間が0の場合,次の周期の0のタイミングとなる
139 * (get_abstickに考慮済み)
140 */
141 (p_almcb->cntexpinfo).expiretick =
142 get_abstick(p_almcb->p_alminib->p_cntcb, p_almcb->p_alminib->almval);
143 }
144 else {
145 /* 相対時間の起動 */
146 (p_almcb->cntexpinfo).expiretick =
147 get_reltick(p_almcb->p_alminib->p_cntcb, p_almcb->p_alminib->almval);
148 }
149 p_almcb->cycle = p_almcb->p_alminib->cycle;
150
151 insert_cnt_expr_que(&(p_almcb->cntexpinfo), p_almcb->p_alminib->p_cntcb);
152 }
153 else {
154 queue_initialize(&(p_almcb->cntexpinfo.cntexpque));
155 }
156 }
157}
158
159#endif /* TOPPERS_alarm_initialize */
160
161/*
162 * アラーム情報の取得
163 */
164#ifdef TOPPERS_GetAlarmBase
165
166StatusType
167GetAlarmBase(AlarmType AlarmID, AlarmBaseRefType Info)
168{
169 StatusType ercd = E_OK;
170 ALMCB *p_almcb;
171 CNTCB *p_cntcb;
172 OSAPCB *p_osapcb;
173
174 LOG_GETALB_ENTER(AlarmID);
175 CHECK_DISABLEDINT();
176 CHECK_CALLEVEL(CALLEVEL_GETALARMBASE);
177 CHECK_ID(AlarmID < tnum_alarm);
178 CHECK_PARAM_POINTER(Info);
179 CHECK_MEM_WRITE(Info, AlarmBaseType);
180 p_almcb = get_almcb(AlarmID);
181 CHECK_RIGHT(p_almcb->p_alminib->acsbtmp);
182 p_cntcb = p_almcb->p_alminib->p_cntcb;
183
184 p_osapcb = p_almcb->p_alminib->p_osapcb;
185 x_nested_lock_os_int();
186
187 /* アラーム所属のOSAPの状態をチェック */
188 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
189 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
190 (p_osapcb == p_runosap)));
191
192 Info->maxallowedvalue = p_cntcb->p_cntinib->maxval;
193 Info->ticksperbase = p_cntcb->p_cntinib->tickbase;
194 Info->mincycle = p_cntcb->p_cntinib->mincyc;
195
196 d_exit_no_errorhook:
197 x_nested_unlock_os_int();
198 exit_no_errorhook:
199 LOG_GETALB_LEAVE(ercd, Info);
200 return(ercd);
201
202#ifdef CFG_USE_ERRORHOOK
203 exit_errorhook:
204 x_nested_lock_os_int();
205 d_exit_errorhook:
206#ifdef CFG_USE_PARAMETERACCESS
207 _errorhook_par1.almid = AlarmID;
208 _errorhook_par2.p_info = Info;
209#endif /* CFG_USE_PARAMETERACCESS */
210 call_errorhook(ercd, OSServiceId_GetAlarmBase);
211 goto d_exit_no_errorhook;
212#endif /* CFG_USE_ERRORHOOK */
213}
214
215#endif /* TOPPERS_GetAlarmBase */
216
217/*
218 * アラームの状態参照
219 */
220#ifdef TOPPERS_GetAlarm
221
222StatusType
223GetAlarm(AlarmType AlarmID, TickRefType Tick)
224{
225 StatusType ercd = E_OK;
226 TickType curval;
227 ALMCB *p_almcb;
228 CNTCB *p_cntcb;
229 OSAPCB *p_osapcb;
230
231 LOG_GETALM_ENTER(AlarmID);
232 CHECK_DISABLEDINT();
233 CHECK_CALLEVEL(CALLEVEL_GETALARM);
234 CHECK_ID(AlarmID < tnum_alarm);
235 CHECK_PARAM_POINTER(Tick);
236 CHECK_MEM_WRITE(Tick, TickType);
237 p_almcb = get_almcb(AlarmID);
238 CHECK_RIGHT(p_almcb->p_alminib->acsbtmp);
239 p_cntcb = p_almcb->p_alminib->p_cntcb;
240
241 p_osapcb = p_almcb->p_alminib->p_osapcb;
242 x_nested_lock_os_int();
243 /* アラーム所属のOSAPの状態をチェック */
244 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
245 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
246 (p_osapcb == p_runosap)));
247
248 S_D_CHECK_NOFUNC(queue_empty(&(p_almcb->cntexpinfo.cntexpque)) == FALSE);
249
250 /*
251 * カウンタの現在値を取得
252 * ハードウェアカウンタの場合,既に満了している可能性がある
253 */
254 curval = get_curval(p_cntcb, CNTID(p_cntcb));
255
256 *Tick = diff_tick(p_almcb->cntexpinfo.expiretick, curval, p_cntcb->p_cntinib->maxval2);
257
258 d_exit_no_errorhook:
259 x_nested_unlock_os_int();
260 exit_no_errorhook:
261 LOG_GETALM_LEAVE(ercd, Tick);
262 return(ercd);
263
264#ifdef CFG_USE_ERRORHOOK
265 exit_errorhook:
266 x_nested_lock_os_int();
267 d_exit_errorhook:
268#ifdef CFG_USE_PARAMETERACCESS
269 _errorhook_par1.almid = AlarmID;
270 _errorhook_par2.p_tick = Tick;
271#endif /* CFG_USE_PARAMETERACCESS */
272 call_errorhook(ercd, OSServiceId_GetAlarm);
273 goto d_exit_no_errorhook;
274#endif /* CFG_USE_ERRORHOOK */
275}
276
277#endif /* TOPPERS_GetAlarm */
278
279/*
280 * アラームの設定(相対値)
281 */
282#ifdef TOPPERS_SetRelAlarm
283
284StatusType
285SetRelAlarm(AlarmType AlarmID, TickType increment, TickType cycle)
286{
287 StatusType ercd = E_OK;
288 TickType maxval;
289 ALMCB *p_almcb;
290 CNTCB *p_cntcb;
291 OSAPCB *p_osapcb;
292
293 LOG_SETREL_ENTER(AlarmID, increment, cycle);
294 CHECK_DISABLEDINT();
295 CHECK_CALLEVEL(CALLEVEL_SETRELALARM);
296 CHECK_ID(AlarmID < tnum_alarm);
297 p_almcb = get_almcb(AlarmID);
298 CHECK_RIGHT(p_almcb->p_alminib->acsbtmp);
299 p_cntcb = p_almcb->p_alminib->p_cntcb;
300
301 maxval = p_cntcb->p_cntinib->maxval;
302 CHECK_VALUE((0U < increment) && (increment <= maxval));
303 CHECK_VALUE((cycle == 0U)
304 || ((p_cntcb->p_cntinib->mincyc <= cycle) && (cycle <= maxval)));
305
306 p_osapcb = p_almcb->p_alminib->p_osapcb;
307 x_nested_lock_os_int();
308 /* アラーム所属のOSAPの状態をチェック */
309 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
310 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
311 (p_osapcb == p_runosap)));
312
313 S_D_CHECK_STATE(queue_empty(&(p_almcb->cntexpinfo.cntexpque)) != FALSE);
314
315 p_almcb->cntexpinfo.expiretick = get_reltick(p_cntcb, increment);
316 p_almcb->cycle = cycle;
317
318 insert_cnt_expr_que(&(p_almcb->cntexpinfo), p_cntcb);
319
320 d_exit_no_errorhook:
321 x_nested_unlock_os_int();
322 exit_no_errorhook:
323 LOG_SETREL_LEAVE(ercd);
324 return(ercd);
325
326#ifdef CFG_USE_ERRORHOOK
327 exit_errorhook:
328 x_nested_lock_os_int();
329 d_exit_errorhook:
330#ifdef CFG_USE_PARAMETERACCESS
331 _errorhook_par1.almid = AlarmID;
332 _errorhook_par2.incr = increment;
333 _errorhook_par3.cycle = cycle;
334#endif /* CFG_USE_PARAMETERACCESS */
335 call_errorhook(ercd, OSServiceId_SetRelAlarm);
336 goto d_exit_no_errorhook;
337#endif /* CFG_USE_ERRORHOOK */
338}
339
340#endif /* TOPPERS_SetRelAlarm */
341
342/*
343 * アラームの設定(絶対値)
344 */
345#ifdef TOPPERS_SetAbsAlarm
346
347StatusType
348SetAbsAlarm(AlarmType AlarmID, TickType start, TickType cycle)
349{
350 StatusType ercd = E_OK;
351 TickType maxval;
352 ALMCB *p_almcb;
353 CNTCB *p_cntcb;
354 OSAPCB *p_osapcb;
355
356 LOG_SETABS_ENTER(AlarmID, start, cycle);
357 CHECK_DISABLEDINT();
358 CHECK_CALLEVEL(CALLEVEL_SETABSALARM);
359 CHECK_ID(AlarmID < tnum_alarm);
360 p_almcb = get_almcb(AlarmID);
361 CHECK_RIGHT(p_almcb->p_alminib->acsbtmp);
362 p_cntcb = p_almcb->p_alminib->p_cntcb;
363
364 maxval = p_cntcb->p_cntinib->maxval;
365 CHECK_VALUE(start <= maxval);
366 CHECK_VALUE((cycle == 0U)
367 || ((p_cntcb->p_cntinib->mincyc <= cycle) && (cycle <= maxval)));
368
369 p_osapcb = p_almcb->p_alminib->p_osapcb;
370 x_nested_lock_os_int();
371 /* アラーム所属のOSAPの状態をチェック */
372 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
373 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
374 (p_osapcb == p_runosap)));
375
376 S_D_CHECK_STATE(queue_empty(&(p_almcb->cntexpinfo.cntexpque)) != FALSE);
377
378 p_almcb->cntexpinfo.expiretick = get_abstick(p_cntcb, start);
379 p_almcb->cycle = cycle;
380
381 insert_cnt_expr_que(&(p_almcb->cntexpinfo), p_cntcb);
382
383 d_exit_no_errorhook:
384 x_nested_unlock_os_int();
385 exit_no_errorhook:
386 LOG_SETABS_LEAVE(ercd);
387 return(ercd);
388
389#ifdef CFG_USE_ERRORHOOK
390 exit_errorhook:
391 x_nested_lock_os_int();
392 d_exit_errorhook:
393#ifdef CFG_USE_PARAMETERACCESS
394 _errorhook_par1.almid = AlarmID;
395 _errorhook_par2.start = start;
396 _errorhook_par3.cycle = cycle;
397#endif /* CFG_USE_PARAMETERACCESS */
398 call_errorhook(ercd, OSServiceId_SetAbsAlarm);
399 goto d_exit_no_errorhook;
400#endif /* CFG_USE_ERRORHOOK */
401}
402
403#endif /* TOPPERS_SetAbsAlarm */
404
405/*
406 * アラームのキャンセル
407 */
408#ifdef TOPPERS_CancelAlarm
409
410StatusType
411CancelAlarm(AlarmType AlarmID)
412{
413 StatusType ercd = E_OK;
414 ALMCB *p_almcb;
415 OSAPCB *p_osapcb;
416
417 LOG_CANALM_ENTER(AlarmID);
418 CHECK_DISABLEDINT();
419 CHECK_CALLEVEL(CALLEVEL_CANCELALARM);
420 CHECK_ID(AlarmID < tnum_alarm);
421 p_almcb = get_almcb(AlarmID);
422 CHECK_RIGHT(p_almcb->p_alminib->acsbtmp);
423
424 p_osapcb = p_almcb->p_alminib->p_osapcb;
425 x_nested_lock_os_int();
426 /* アラーム所属のOSAPの状態をチェック */
427 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
428 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
429 (p_osapcb == p_runosap)));
430
431 S_D_CHECK_NOFUNC(queue_empty(&(p_almcb->cntexpinfo.cntexpque)) == FALSE);
432
433 delete_cnt_expr_que(&(p_almcb->cntexpinfo), p_almcb->p_alminib->p_cntcb);
434
435 d_exit_no_errorhook:
436 x_nested_unlock_os_int();
437 exit_no_errorhook:
438 LOG_CANALM_LEAVE(ercd);
439 return(ercd);
440
441#ifdef CFG_USE_ERRORHOOK
442 exit_errorhook:
443 x_nested_lock_os_int();
444 d_exit_errorhook:
445#ifdef CFG_USE_PARAMETERACCESS
446 _errorhook_par1.almid = AlarmID;
447#endif /* CFG_USE_PARAMETERACCESS */
448 call_errorhook(ercd, OSServiceId_CancelAlarm);
449 goto d_exit_no_errorhook;
450#endif /* CFG_USE_ERRORHOOK */
451}
452
453#endif /* TOPPERS_CancelAlarm */
454
455/*
456 * アラーム満了アクション処理用関数
457 */
458#ifdef TOPPERS_alarm_expire
459
460void
461alarm_expire(CNTEXPINFO *p_cntexpinfo, const CNTCB *p_cntcb)
462{
463 ALMCB *p_almcb;
464 OSAPCB *p_runosap_saved;
465
466 p_almcb = (ALMCB *) p_cntexpinfo;
467
468 /* カウンタ満了キューへの再挿入(周期アラームの場合) */
469 if (p_almcb->cycle > 0U) {
470 p_cntexpinfo->expiretick = add_tick(p_cntexpinfo->expiretick, p_almcb->cycle,
471 p_cntcb->p_cntinib->maxval2);
472 insert_cnt_expr_que(p_cntexpinfo, (CNTCB *) p_cntcb);
473 }
474
475 LOG_ALM_ENTER(p_almcb);
476
477 p_runosap_saved = p_runosap;
478 p_runosap = p_almcb->p_alminib->p_osapcb;
479
480 /* アラーム満了アクションの呼出し */
481 (p_almcb->p_alminib->action)();
482
483 p_runosap = p_runosap_saved;
484
485 LOG_ALM_LEAVE(p_almcb);
486}
487
488#endif /* TOPPERS_alarm_expire */
489
490/*
491 * OSAP所属するアラームの強制終了
492 */
493#ifdef TOPPERS_force_term_osap_alarm
494
495void
496force_term_osap_alarm(OSAPCB *p_osapcb)
497{
498 /* カウンタの満了キューから消す */
499 AlarmType i;
500 ALMCB *p_almcb;
501
502 for (i = 0U; i < tnum_alarm; i++) {
503 if (alminib_table[i].p_osapcb == p_osapcb) {
504 p_almcb = &almcb_table[i];
505 /*
506 * 満了キューから削除する
507 * 初期化より先に実施する必要がある
508 */
509 delete_cnt_expr_que(&(p_almcb->cntexpinfo), p_almcb->p_alminib->p_cntcb);
510 p_almcb->cycle = 0U;
511 }
512 }
513}
514
515#endif /* TOPPERS_force_term_osap_alarm */
Note: See TracBrowser for help on using the repository browser.