source: atk2-sc3-1.4.0-ntisr/kernel/scheduletable.c@ 172

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

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

  • Property svn:executable set to *
File size: 24.0 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
9 * Copyright (C) 2011-2013 by Spansion LLC, USA
10 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
11 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
13 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
14 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
15 * Copyright (C) 2004-2015 by Witz Corporation
16 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
17 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
18 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
19 * Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
20 *
21 * 上記著作権者
22は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24 * 変・再é…
25å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
26 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
27 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
28 * スコード中に含まれていること.
29 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
30 * 用できる形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
33 * 者
34マニュアルなど)に,上記の著作権表示,この利用条件および下記
35 * の無保証規定を掲載すること.
36 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
37 * 用できない形で再é…
38å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
39 * と.
40 * (a) 再é…
41å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
42マニュアルなど)に,上記の著
43 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
44 * (b) 再é…
45å¸ƒã®å½¢æ…
46‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
47 * 報告すること.
48 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
49 * 害からも,上記著作権者
50およびTOPPERSプロジェクトをå…
51è²¬ã™ã‚‹ã“と.
52 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
53 * 由に基づく請求からも,上記著作権者
54およびTOPPERSプロジェクトを
55 * å…
56è²¬ã™ã‚‹ã“と.
57 *
58 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
59 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
60 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
61 * 用する者
62に対して,AUTOSARパートナーになることを求めている.
63 *
64 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
65お
66 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
67 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
68 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
69 * の責任を負わない.
70 *
71 * $Id: scheduletable.c 485 2015-12-17 08:21:50Z witz-itoyo $
72 */
73
74/*
75 * スケジュールテーブル管理モジュール
76 */
77
78#include "kernel_impl.h"
79#include "check.h"
80#include "scheduletable.h"
81
82/*
83 * トレースログマクロのデフォルト定義
84 */
85#ifndef LOG_STASCHTBLREL_ENTER
86#define LOG_STASCHTBLREL_ENTER(schtblid, offset)
87#endif /* LOG_STASCHTBLREL_ENTER */
88
89#ifndef LOG_STASCHTBLREL_LEAVE
90#define LOG_STASCHTBLREL_LEAVE(ercd)
91#endif /* LOG_STASCHTBLREL_LEAVE */
92
93#ifndef LOG_STASCHTBLABS_ENTER
94#define LOG_STASCHTBLABS_ENTER(schtblid, start)
95#endif /* LOG_STASCHTBLABS_ENTER */
96
97#ifndef LOG_STASCHTBLABS_LEAVE
98#define LOG_STASCHTBLABS_LEAVE(ercd)
99#endif /* LOG_STASCHTBLABS_LEAVE */
100
101#ifndef LOG_STPSCHTBL_ENTER
102#define LOG_STPSCHTBL_ENTER(schtblid)
103#endif /* LOG_STPSCHTBL_ENTER */
104
105#ifndef LOG_STPSCHTBL_LEAVE
106#define LOG_STPSCHTBL_LEAVE(ercd)
107#endif /* LOG_STPSCHTBL_LEAVE */
108
109#ifndef LOG_NXTSCHTBL_ENTER
110#define LOG_NXTSCHTBL_ENTER(from, to)
111#endif /* LOG_NXTSCHTBL_ENTER */
112
113#ifndef LOG_NXTSCHTBL_LEAVE
114#define LOG_NXTSCHTBL_LEAVE(ercd)
115#endif /* LOG_NXTSCHTBL_LEAVE */
116
117#ifndef LOG_GETSCHTBLST_ENTER
118#define LOG_GETSCHTBLST_ENTER(schtblid)
119#endif /* LOG_GETSCHTBLST_ENTER */
120
121#ifndef LOG_GETSCHTBLST_LEAVE
122#define LOG_GETSCHTBLST_LEAVE(ercd, p_status)
123#endif /* LOG_GETSCHTBLST_LEAVE */
124
125#ifndef LOG_SCHTBL_ENTER
126#define LOG_SCHTBL_ENTER(p_schtblcb)
127#endif /* LOG_SCHTBL_ENTER */
128
129#ifndef LOG_SCHTBL_LEAVE
130#define LOG_SCHTBL_LEAVE(p_schtblcb)
131#endif /* LOG_SCHTBL_LEAVE */
132
133/*
134 * スケジュールテーブルオブジェクトの初期化
135 */
136#ifdef TOPPERS_schtbl_initialize
137
138void
139schtbl_initialize(void)
140{
141 ScheduleTableType i;
142 SCHTBLCB *p_schtblcb;
143 CNTCB *p_cntcb;
144 TickType staval;
145
146 for (i = 0U; i < tnum_scheduletable; i++) {
147 p_schtblcb = &(schtblcb_table[i]);
148 p_schtblcb->p_schtblinib = &(schtblinib_table[i]);
149
150 /*
151 * STOPPED状æ…
152‹ã«ã™ã‚‹æ™‚,p_nextschtblcb,p_prevschtblcbを初期化する
153 * RUNNING,NEXT状æ…
154‹ã«ã™ã‚‹æ™‚,expptindexを初期化する
155 */
156 p_schtblcb->p_nextschtblcb = NULL;
157 p_schtblcb->p_prevschtblcb = NULL;
158 (p_schtblcb->cntexpinfo).expirefunc = &schtbl_expire;
159
160 if ((p_schtblcb->p_schtblinib->autosta & ((AppModeType) 1 << appmodeid)) != APPMODE_NONE) {
161 if (is_implschtbl(i)) {
162 p_schtblcb->status = SCHEDULETABLE_RUNNING_AND_SYNCHRONOUS;
163 }
164 else {
165 p_schtblcb->status = SCHEDULETABLE_RUNNING;
166 }
167 p_schtblcb->expptindex = EXPPTINDEX_INITIAL;
168
169 p_cntcb = p_schtblcb->p_schtblinib->p_cntcb;
170 staval = p_schtblcb->p_schtblinib->staval;
171 if (p_schtblcb->p_schtblinib->actatr == ABSOLUTE) {
172 /*
173 * 絶対時間の起動
174 * 満了時間が0の場合,次の周期の0のタイミングとなる
175 * (get_abstickに考æ…
176®æ¸ˆã¿ï¼‰
177 */
178 (p_schtblcb->cntexpinfo).expiretick = get_abstick(p_cntcb, staval);
179 }
180 else {
181 /* 相対時間の起動 */
182 (p_schtblcb->cntexpinfo).expiretick = get_reltick(p_cntcb, staval);
183 }
184
185 insert_cnt_expr_que(&(p_schtblcb->cntexpinfo), p_cntcb);
186 }
187 else {
188 p_schtblcb->status = SCHEDULETABLE_STOPPED;
189
190 queue_initialize(&(p_schtblcb->cntexpinfo.cntexpque));
191 }
192 }
193}
194
195#endif /* TOPPERS_schtbl_initialize */
196
197/*
198 * 指定したスケジュールテーブルの開始(相対時間)
199 */
200#ifdef TOPPERS_StartScheduleTableRel
201
202StatusType
203StartScheduleTableRel(ScheduleTableType ScheduleTableID, TickType Offset)
204{
205 StatusType ercd = E_OK;
206 SCHTBLCB *p_schtblcb;
207 CNTCB *p_cntcb;
208 OSAPCB *p_osapcb;
209
210 LOG_STASCHTBLREL_ENTER(ScheduleTableID, Offset);
211 CHECK_DISABLEDINT();
212 CHECK_CALLEVEL(CALLEVEL_STARTSCHEDULETABLEREL);
213 CHECK_ID(ScheduleTableID < tnum_scheduletable);
214 CHECK_ID(ScheduleTableID >= tnum_implscheduletable);
215
216 p_schtblcb = get_schtblcb(ScheduleTableID);
217 CHECK_RIGHT(p_schtblcb->p_schtblinib->acsbtmp);
218
219 p_cntcb = p_schtblcb->p_schtblinib->p_cntcb;
220 CHECK_VALUE((Offset != 0U) &&
221 ((p_cntcb->p_cntinib->maxval - p_schtblcb->p_schtblinib->p_exppt->offset) >= Offset));
222
223 p_osapcb = p_schtblcb->p_schtblinib->p_osapcb;
224 x_nested_lock_os_int();
225
226 /* 起動するスケジュールテーブル所属のOSAPの状æ…
227‹ã‚’チェック */
228 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
229 (p_osapcb == p_runosap));
230 S_D_CHECK_STATE(p_schtblcb->status == SCHEDULETABLE_STOPPED);
231
232 p_schtblcb->status = SCHEDULETABLE_RUNNING;
233 p_schtblcb->expptindex = EXPPTINDEX_INITIAL;
234 p_schtblcb->cntexpinfo.expiretick = get_reltick(p_cntcb, Offset);
235
236 insert_cnt_expr_que(&(p_schtblcb->cntexpinfo), p_cntcb);
237
238 d_exit_no_errorhook:
239 x_nested_unlock_os_int();
240 exit_no_errorhook:
241 LOG_STASCHTBLREL_LEAVE(ercd);
242 return(ercd);
243
244#ifdef CFG_USE_ERRORHOOK
245 exit_errorhook:
246 x_nested_lock_os_int();
247 d_exit_errorhook:
248#ifdef CFG_USE_PARAMETERACCESS
249 _errorhook_par1.schtblid = ScheduleTableID;
250 _errorhook_par2.offset = Offset;
251#endif /* CFG_USE_PARAMETERACCESS */
252 call_errorhook(ercd, OSServiceId_StartScheduleTableRel);
253 goto d_exit_no_errorhook;
254#endif /* CFG_USE_ERRORHOOK */
255}
256
257#endif /* TOPPERS_StartScheduleTableRel */
258
259/*
260 * 指定したスケジュールテーブルの開始(絶対時間)
261 */
262#ifdef TOPPERS_StartScheduleTableAbs
263
264StatusType
265StartScheduleTableAbs(ScheduleTableType ScheduleTableID, TickType Start)
266{
267 StatusType ercd = E_OK;
268 SCHTBLCB *p_schtblcb;
269 CNTCB *p_cntcb;
270 OSAPCB *p_osapcb;
271
272 LOG_STASCHTBLABS_ENTER(ScheduleTableID, Start);
273 CHECK_DISABLEDINT();
274 CHECK_CALLEVEL(CALLEVEL_STARTSCHEDULETABLEABS);
275 CHECK_ID(ScheduleTableID < tnum_scheduletable);
276
277 p_schtblcb = get_schtblcb(ScheduleTableID);
278 CHECK_RIGHT(p_schtblcb->p_schtblinib->acsbtmp);
279
280 p_cntcb = p_schtblcb->p_schtblinib->p_cntcb;
281 CHECK_VALUE(p_cntcb->p_cntinib->maxval >= Start);
282
283 p_osapcb = p_schtblcb->p_schtblinib->p_osapcb;
284 x_nested_lock_os_int();
285
286 /* 起動するスケジュールテーブル所属のOSAPの状æ…
287‹ã‚’チェック */
288 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
289 (p_osapcb == p_runosap));
290 S_D_CHECK_STATE(p_schtblcb->status == SCHEDULETABLE_STOPPED);
291
292 /* 暗黙同期の場合,同期動作状æ…
293‹ã§å‹•ä½œã™ã‚‹ */
294 if (is_implschtbl(ScheduleTableID)) {
295 p_schtblcb->status = SCHEDULETABLE_RUNNING_AND_SYNCHRONOUS;
296 }
297 else {
298 p_schtblcb->status = SCHEDULETABLE_RUNNING;
299 }
300 p_schtblcb->expptindex = EXPPTINDEX_INITIAL;
301 p_schtblcb->cntexpinfo.expiretick = get_abstick(p_cntcb, Start);
302
303 insert_cnt_expr_que(&(p_schtblcb->cntexpinfo), p_cntcb);
304
305 d_exit_no_errorhook:
306 x_nested_unlock_os_int();
307 exit_no_errorhook:
308 LOG_STASCHTBLABS_LEAVE(ercd);
309 return(ercd);
310
311#ifdef CFG_USE_ERRORHOOK
312 exit_errorhook:
313 x_nested_lock_os_int();
314 d_exit_errorhook:
315#ifdef CFG_USE_PARAMETERACCESS
316 _errorhook_par1.schtblid = ScheduleTableID;
317 _errorhook_par2.start = Start;
318#endif /* CFG_USE_PARAMETERACCESS */
319 call_errorhook(ercd, OSServiceId_StartScheduleTableAbs);
320 goto d_exit_no_errorhook;
321#endif /* CFG_USE_ERRORHOOK */
322}
323
324#endif /* TOPPERS_StartScheduleTableAbs */
325
326/*
327 * 指定したスケジュールテーブルの停止
328 */
329#ifdef TOPPERS_StopScheduleTable
330
331StatusType
332StopScheduleTable(ScheduleTableType ScheduleTableID)
333{
334 StatusType ercd = E_OK;
335 SCHTBLCB *p_schtblcb, *p_nextcb;
336 OSAPCB *p_osapcb;
337
338 LOG_STPSCHTBL_ENTER(ScheduleTableID);
339 CHECK_DISABLEDINT();
340 CHECK_CALLEVEL(CALLEVEL_STOPSCHEDULETABLE);
341 CHECK_ID(ScheduleTableID < tnum_scheduletable);
342
343 p_schtblcb = get_schtblcb(ScheduleTableID);
344
345 CHECK_RIGHT(p_schtblcb->p_schtblinib->acsbtmp);
346
347 p_osapcb = p_schtblcb->p_schtblinib->p_osapcb;
348 x_nested_lock_os_int();
349
350 /* 起動するスケジュールテーブル所属のOSAPの状æ…
351‹ã‚’チェック */
352 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
353 (p_osapcb == p_runosap));
354 S_D_CHECK_NOFUNC(p_schtblcb->status != SCHEDULETABLE_STOPPED);
355
356 /*
357 * 指定されたスケジュールテーブルがSCHEDULETABLE_NEXTの場合,
358 * 自分をNextにしたスケジュールテーブルから,自分を外す
359 */
360 if (p_schtblcb->status == SCHEDULETABLE_NEXT) {
361 p_schtblcb->p_prevschtblcb->p_nextschtblcb = NULL;
362 p_schtblcb->p_prevschtblcb = NULL;
363 }
364 else {
365 /*
366 * Nextスケジュールテーブルが存在した場合,
367 * Nextスケジュールテーブルの予約をキャンセルする
368 */
369 p_nextcb = p_schtblcb->p_nextschtblcb;
370 if (p_nextcb != NULL) {
371 p_nextcb->status = SCHEDULETABLE_STOPPED;
372 p_nextcb->p_prevschtblcb = NULL;
373 p_schtblcb->p_nextschtblcb = NULL;
374 }
375
376 /* カウンタ満了キューから既に登録した満了処理を削除 */
377 delete_cnt_expr_que(&(p_schtblcb->cntexpinfo),
378 p_schtblcb->p_schtblinib->p_cntcb);
379 }
380
381 p_schtblcb->status = SCHEDULETABLE_STOPPED;
382
383 d_exit_no_errorhook:
384 x_nested_unlock_os_int();
385 exit_no_errorhook:
386 LOG_STPSCHTBL_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.schtblid = ScheduleTableID;
395#endif /* CFG_USE_PARAMETERACCESS */
396 call_errorhook(ercd, OSServiceId_StopScheduleTable);
397 goto d_exit_no_errorhook;
398#endif /* CFG_USE_ERRORHOOK */
399}
400#endif /* TOPPERS_StopScheduleTable */
401
402/*
403 * スケジュールテーブルの切替え
404 */
405#ifdef TOPPERS_NextScheduleTable
406
407StatusType
408NextScheduleTable(ScheduleTableType ScheduleTableID_From,
409 ScheduleTableType ScheduleTableID_To)
410{
411 StatusType ercd = E_OK;
412 SCHTBLCB *p_curcb, *p_nextcb;
413 OSAPCB *p_osapcb;
414
415 LOG_NXTSCHTBL_ENTER(ScheduleTableID_From, ScheduleTableID_To);
416 CHECK_DISABLEDINT();
417 CHECK_CALLEVEL(CALLEVEL_NEXTSCHEDULETABLE);
418 CHECK_ID(ScheduleTableID_From < tnum_scheduletable);
419 CHECK_ID(ScheduleTableID_To < tnum_scheduletable);
420 CHECK_ID((ScheduleTableID_From < tnum_implscheduletable) ==
421 (ScheduleTableID_To < tnum_implscheduletable));
422
423 p_curcb = get_schtblcb(ScheduleTableID_From);
424 p_nextcb = get_schtblcb(ScheduleTableID_To);
425
426 CHECK_RIGHT(p_curcb->p_schtblinib->acsbtmp);
427 CHECK_RIGHT(p_nextcb->p_schtblinib->acsbtmp);
428
429 CHECK_ID(p_curcb->p_schtblinib->p_cntcb == p_nextcb->p_schtblinib->p_cntcb);
430
431 x_nested_lock_os_int();
432 p_osapcb = p_curcb->p_schtblinib->p_osapcb;
433 /* 起動するスケジュールテーブル所属のOSAPの状æ…
434‹ã‚’チェック */
435 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
436 (p_osapcb == p_runosap));
437
438 p_osapcb = p_nextcb->p_schtblinib->p_osapcb;
439 /* 起動するスケジュールテーブル所属のOSAPの状æ…
440‹ã‚’チェック */
441 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
442 (p_osapcb == p_runosap));
443
444 /* ScheduleTableID_Fromの状æ…
445‹ãƒã‚§ãƒƒã‚¯ */
446 S_D_CHECK_NOFUNC((p_curcb->status & (SCHEDULETABLE_STOPPED | SCHEDULETABLE_NEXT)) == 0U);
447
448 /* ScheduleTableID_Toの状æ…
449‹ãƒã‚§ãƒƒã‚¯ */
450 S_D_CHECK_STATE(p_nextcb->status == SCHEDULETABLE_STOPPED);
451
452 /*
453 * Currentに対して既にNextが存在した場合,
454 * これまでのNextに対してキャンセルする
455 */
456 if (p_curcb->p_nextschtblcb != NULL) {
457 p_curcb->p_nextschtblcb->status = SCHEDULETABLE_STOPPED;
458 p_curcb->p_nextschtblcb->p_prevschtblcb = NULL;
459 }
460
461 p_curcb->p_nextschtblcb = p_nextcb;
462 p_nextcb->status = SCHEDULETABLE_NEXT;
463 p_nextcb->p_prevschtblcb = p_curcb;
464
465 d_exit_no_errorhook:
466 x_nested_unlock_os_int();
467 exit_no_errorhook:
468 LOG_NXTSCHTBL_LEAVE(ercd);
469 return(ercd);
470
471#ifdef CFG_USE_ERRORHOOK
472 exit_errorhook:
473 x_nested_lock_os_int();
474 d_exit_errorhook:
475#ifdef CFG_USE_PARAMETERACCESS
476 _errorhook_par1.schtblid_from = ScheduleTableID_From;
477 _errorhook_par2.schtblid_to = ScheduleTableID_To;
478#endif /* CFG_USE_PARAMETERACCESS */
479 call_errorhook(ercd, OSServiceId_NextScheduleTable);
480 goto d_exit_no_errorhook;
481#endif /* CFG_USE_ERRORHOOK */
482}
483
484#endif /* TOPPERS_NextScheduleTable */
485
486/*
487 * スケジュールテーブル状æ…
488‹ã®å–å¾—
489 */
490#ifdef TOPPERS_GetScheduleTableStatus
491
492StatusType
493GetScheduleTableStatus(ScheduleTableType ScheduleTableID,
494 ScheduleTableStatusRefType ScheduleStatus)
495{
496 StatusType ercd = E_OK;
497 SCHTBLCB *p_schtblcb;
498 OSAPCB *p_osapcb;
499
500 LOG_GETSCHTBLST_ENTER(ScheduleTableID);
501 CHECK_DISABLEDINT();
502 CHECK_CALLEVEL(CALLEVEL_GETSCHEDULETABLESTATUS);
503 CHECK_ID(ScheduleTableID < tnum_scheduletable);
504 CHECK_PARAM_POINTER(ScheduleStatus);
505 CHECK_MEM_WRITE(ScheduleStatus, ScheduleTableStatusType);
506
507 p_schtblcb = get_schtblcb(ScheduleTableID);
508 CHECK_RIGHT(p_schtblcb->p_schtblinib->acsbtmp);
509
510 /* スケジュールテーブル所属のOSAPの状æ…
511‹ã‚’チェック */
512 p_osapcb = p_schtblcb->p_schtblinib->p_osapcb;
513 CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
514 (p_osapcb == p_runosap));
515
516 *ScheduleStatus = p_schtblcb->status;
517
518 exit_no_errorhook:
519 LOG_GETSCHTBLST_LEAVE(ercd, ScheduleStatus);
520 return(ercd);
521
522#ifdef CFG_USE_ERRORHOOK
523 exit_errorhook:
524 x_nested_lock_os_int();
525#ifdef CFG_USE_PARAMETERACCESS
526 _errorhook_par1.schtblid = ScheduleTableID;
527 _errorhook_par2.p_schtblstate = ScheduleStatus;
528#endif /* CFG_USE_PARAMETERACCESS */
529 call_errorhook(ercd, OSServiceId_GetScheduleTableStatus);
530 x_nested_unlock_os_int();
531 goto exit_no_errorhook;
532#endif /* CFG_USE_ERRORHOOK */
533}
534
535#endif /* TOPPERS_GetScheduleTableStatus */
536
537/*
538 * スケジュール満了処理関数
539 */
540#ifdef TOPPERS_schtbl_expire
541
542void
543schtbl_expire(CNTEXPINFO *p_cntexpinfo, const CNTCB *p_cntcb)
544{
545 SCHTBLEXPINFO schtblexpinfo;
546
547 schtblexpinfo.p_schtblcb = (SCHTBLCB *) p_cntexpinfo;
548
549 schtbl_expiry_process(&schtblexpinfo, p_cntcb);
550
551 if (schtblexpinfo.p_schtblcb != NULL) {
552 insert_cnt_expr_que(&(schtblexpinfo.p_schtblcb->cntexpinfo), (CNTCB *) p_cntcb);
553 }
554}
555
556#endif /* TOPPERS_schtbl_expire */
557
558/*
559 * 満了処理関数から各タイミング処理の実行
560 */
561#ifdef TOPPERS_schtbl_expiry_process
562
563void
564schtbl_expiry_process(SCHTBLEXPINFO *p_schtblexpinfo, const CNTCB *p_cntcb)
565{
566 boolean loopcont = FALSE;
567 SCHTBLCB *p_schtblcb;
568
569 /*
570 * 設定した満了点は,すぐ満了する可能性があるので,
571 * 繰り返し情
572報によってループ処理
573 */
574 do {
575 p_schtblcb = p_schtblexpinfo->p_schtblcb;
576
577 if (p_schtblcb->expptindex < p_schtblcb->p_schtblinib->tnum_exppt) {
578 /* 各満了点時 */
579 loopcont = schtbl_exppoint_process(p_schtblcb, p_cntcb);
580 }
581 else if (p_schtblcb->expptindex == p_schtblcb->p_schtblinib->tnum_exppt) {
582 /* 周期の最後時 */
583 loopcont = schtbl_tail(p_schtblcb, p_schtblexpinfo, p_cntcb);
584 }
585 else {
586 /*
587 * 周期の開始時
588 * p_schtblcb->expptindex == EXPPTINDEX_INITIALしかあり得ない
589 */
590 loopcont = schtbl_head(p_schtblcb, p_cntcb);
591 }
592 } while (loopcont != FALSE);
593}
594
595#endif /* TOPPERS_schtbl_expiry_process */
596
597/*
598 * スケジュールテーブルの開始処理
599 */
600#ifdef TOPPERS_schtbl_head
601
602boolean
603schtbl_head(SCHTBLCB *p_schtblcb, const CNTCB *p_cntcb)
604{
605 boolean loopcont;
606 const SCHTBLEXPPTCB *p_exppoint;
607
608 p_exppoint = &(p_schtblcb->p_schtblinib->p_exppt[EXPPTINDEX_TOP]);
609
610 if (p_exppoint->offset == 0U) {
611 /* 初期オフセット0の場合,今回満了処理内
612で1個目の満了点処理を行う */
613 loopcont = TRUE;
614 }
615 else {
616 loopcont = FALSE;
617 /* 次に起動すべき時間の選定 */
618 p_schtblcb->cntexpinfo.expiretick = add_tick(p_schtblcb->cntexpinfo.expiretick,
619 p_exppoint->offset, p_cntcb->p_cntinib->maxval2);
620 }
621
622 p_schtblcb->expptindex = EXPPTINDEX_TOP;
623
624 return(loopcont);
625}
626
627#endif /* TOPPERS_schtbl_head */
628
629/*
630 * スケジュールテーブルの各満了点処理
631 */
632#ifdef TOPPERS_schtbl_exppoint_process
633
634boolean
635schtbl_exppoint_process(SCHTBLCB *p_schtblcb, const CNTCB *p_cntcb)
636{
637 boolean loopcont = FALSE;
638 const SCHTBLEXPPTCB *p_exppoint;
639 const SCHTBLEXPPTCB *pp_exppoint;
640 uint8 index;
641 TickType currtime;
642 OSAPCB *p_runosap_saved;
643
644 pp_exppoint = p_schtblcb->p_schtblinib->p_exppt;
645 index = p_schtblcb->expptindex;
646 p_exppoint = &(pp_exppoint[index]);
647
648 /* 満了処理の実行 */
649 LOG_SCHTBL_ENTER(p_schtblcb);
650 p_runosap_saved = p_runosap;
651 p_runosap = p_schtblcb->p_schtblinib->p_osapcb;
652
653 (p_exppoint->expptfnt)();
654
655 p_runosap = p_runosap_saved;
656
657 LOG_SCHTBL_LEAVE(p_schtblcb);
658 /* 現在時間の退避 */
659 currtime = p_exppoint->offset;
660 /* 次の満了点へ */
661 index++;
662 p_schtblcb->expptindex = index;
663
664 if (p_schtblcb->expptindex == p_schtblcb->p_schtblinib->tnum_exppt) {
665 /* 現在が周期の最後の満了点の場合 */
666 if (p_schtblcb->p_schtblinib->length == currtime) {
667 /*
668 * 単発スケジュールテーブル最終遅
669延値が0の場合,Nextが存在するかもしれないため,
670 * スケジュールテーブルの最後タイミング処理をする
671 */
672 loopcont = TRUE;
673 }
674 else {
675 /* 最終遅
676延処理のため,満了時間の設定 */
677 p_schtblcb->cntexpinfo.expiretick = add_tick(p_schtblcb->cntexpinfo.expiretick,
678 (p_schtblcb->p_schtblinib->length - currtime), p_cntcb->p_cntinib->maxval2);
679 }
680 }
681 else {
682 p_exppoint = &(pp_exppoint[index]);
683 /* 次の満了点の満了時間の設定 */
684 p_schtblcb->cntexpinfo.expiretick = add_tick(p_schtblcb->cntexpinfo.expiretick,
685 (p_exppoint->offset - currtime), p_cntcb->p_cntinib->maxval2);
686 }
687
688 return(loopcont);
689}
690
691#endif /* TOPPERS_schtbl_exppoint_process */
692
693/*
694 * スケジュールテーブルの終端処理
695 */
696#ifdef TOPPERS_schtbl_tail
697
698boolean
699schtbl_tail(SCHTBLCB *p_schtblcb, SCHTBLEXPINFO *p_schtblexpinfo, const CNTCB *p_cntcb)
700{
701 boolean loopcont = FALSE;
702 SCHTBLCB *p_nextcb;
703 const SCHTBLEXPPTCB *p_exppoint;
704
705 /* 周期の最後にてNextが存在するかチェック */
706 if (p_schtblcb->p_nextschtblcb != NULL) {
707 p_nextcb = p_schtblcb->p_nextschtblcb;
708
709 /*
710 * スケジュールテーブルの切り替え
711 *
712 * 暗黙同期同士の切替を考æ…
713®ã—,状æ…
714‹ã®å¼•ç¶™ãŽãŒå¿…
715要
716 * NextScheduleTableで同期方法チェックしているので,
717 * 同期方法の不整合がない
718 */
719 p_nextcb->status = p_schtblcb->status;
720 p_nextcb->expptindex = EXPPTINDEX_INITIAL;
721
722 /* Nextの満了点設定基準は,Prevの満了時刻となる */
723 p_nextcb->cntexpinfo.expiretick = p_schtblcb->cntexpinfo.expiretick;
724 p_nextcb->p_prevschtblcb = NULL;
725
726 /* 今まで実行状æ…
727‹ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ«ãƒ†ãƒ¼ãƒ–ルに対して終了処理 */
728 p_schtblcb->status = SCHEDULETABLE_STOPPED;
729 p_schtblcb->p_nextschtblcb = NULL;
730
731 /*
732 * 上流側よりNextの初期満了点をカウンタ満了キューに追加する時,
733 * 使用される
734 */
735 p_schtblexpinfo->p_schtblcb = p_nextcb;
736
737 loopcont = TRUE;
738 }
739 else {
740 /* 周期制御の有無チェック */
741 if (p_schtblcb->p_schtblinib->repeat != FALSE) {
742
743 p_schtblcb->expptindex = EXPPTINDEX_TOP;
744 p_exppoint = &(p_schtblcb->p_schtblinib->p_exppt[EXPPTINDEX_TOP]);
745
746 if (p_exppoint->offset == 0U) {
747 /* 初期オフセット0の場合,今回満了処理内
748で1個目の満了点処理を行う */
749 loopcont = TRUE;
750 }
751 else {
752 /* 最終遅
753延処理のため,満了時間の設定 */
754 p_schtblcb->cntexpinfo.expiretick = add_tick(p_schtblcb->cntexpinfo.expiretick,
755 p_exppoint->offset, p_cntcb->p_cntinib->maxval2);
756 }
757 }
758 else {
759 /* 周期起動しないので,終了処理 */
760 p_schtblcb->status = SCHEDULETABLE_STOPPED;
761 p_schtblexpinfo->p_schtblcb = NULL;
762 p_schtblcb->p_prevschtblcb = NULL;
763 p_schtblcb->p_nextschtblcb = NULL;
764 }
765 }
766
767 return(loopcont);
768}
769
770#endif /* TOPPERS_schtbl_tail */
771
772/*
773 * OSAP所属するスケジュールテーブルの強制終了
774 */
775#ifdef TOPPERS_force_term_osap_schtbl
776
777void
778force_term_osap_schtbl(OSAPCB *p_osapcb)
779{
780 ScheduleTableType i;
781 SCHTBLCB *p_schtblcb;
782 SCHTBLCB *p_nextcb;
783
784 for (i = 0U; i < tnum_scheduletable; i++) {
785 if (schtblinib_table[i].p_osapcb == p_osapcb) {
786 p_schtblcb = &schtblcb_table[i];
787 /*
788 * 指定されたスケジュールテーブルがSCHEDULETABLE_NEXTの場合,
789 * 自分をNextにしたスケジュールテーブルから,自分を外す
790 */
791 if (p_schtblcb->status == SCHEDULETABLE_NEXT) {
792 p_schtblcb->p_prevschtblcb->p_nextschtblcb = NULL;
793 p_schtblcb->p_prevschtblcb = NULL;
794 p_schtblcb->status = SCHEDULETABLE_STOPPED;
795 }
796 else if ((p_schtblcb->status == SCHEDULETABLE_RUNNING) ||
797 (p_schtblcb->status == SCHEDULETABLE_RUNNING_AND_SYNCHRONOUS)) {
798 /*
799 * Nextスケジュールテーブルが存在する場合,
800 * Nextスケジュールテーブルの予約をキャンセルする
801 */
802 p_nextcb = p_schtblcb->p_nextschtblcb;
803 if (p_nextcb != NULL) {
804 p_nextcb->status = SCHEDULETABLE_STOPPED;
805 p_nextcb->p_prevschtblcb = NULL;
806 p_schtblcb->p_nextschtblcb = NULL;
807 }
808
809 /* カウンタ満了キューから既に登録した満了処理を削除 */
810 delete_cnt_expr_que(&(p_schtblcb->cntexpinfo),
811 p_schtblcb->p_schtblinib->p_cntcb);
812 p_schtblcb->status = SCHEDULETABLE_STOPPED;
813 }
814 else {
815 /* 実施すべきことがない */
816 }
817 }
818 }
819}
820
821#endif /* TOPPERS_force_term_osap_schtbl */
Note: See TracBrowser for help on using the repository browser.