source: atk2-sc3-1.4.0-ntisr/kernel/alarm.c

Last change on this file was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

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