source: atk2-sc3_fl850f1l/kernel/scheduletable.c@ 117

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

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

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