2 * Hyper Operating System V4 Advance
5 * @brief %jp{イベントフラグ待ち}%en{Wait for Eventflag}
7 * Copyright (C) 1998-2006 by Project HOS
8 * http://sourceforge.jp/projects/hos/
13 #include "core/core.h"
14 #include "object/flgobj.h"
18 #if _KERNEL_SPT_WAI_FLG
21 #if _KERNEL_SPT_TWAI_FLG && (_KERNEL_OPT_CODE_SIZE <= _KERNEL_OPT_SPEED) /* %jp{twai_flgありで、サイズ優先なら} */
23 /** %jp{イベントフラグ待ち}%en{Wait for Eventflag}
24 * @param flgid %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set}
25 * @param flgptn %jp{待ちビットパターン}%en{Wait bit pattern}
26 * @param wfmode %jp{待ちモード}%en{Wait mode}
27 * @param p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting}
28 * @retval E_OK %jp{正常終了}%en{Normal completion}
29 * @retval E_ID %jp{不正ID番号(flgidが不正あるいは使用できない)}%en{Invalid ID number(flgid is invalid or unusable)}
30 * @retval E_NOEXS %jp{オブジェクト未生成(対象イベントフラグが未登録)}%en{Non-existant object(specified eventflag is not registerd)}
31 * @retval E_PAR %jp{パラメータエラー(waiptn, wfmode, p_flgptnが不正)}%en{Parameter error(waiptn, wfmode, or p_flgptn is invalid)}
32 * @retval E_ILUSE %jp{サービスコール不正使用(TA_WSGL属性が指定されたイベントフラグで待ちタスクあり}%en{Illegal service call use(there is already a task waiting for an eventflag with tahe TA_WSGL attribute)}
33 * @retval E_RLWAI %jp{待ち状態の強制解除(待ち状態の間にrel_waiを受付)}%en{Forced release from waiting(accept rel_wai while waiting)}
34 * @retval E_DLT %jp{待ちオブジェクトの削除(待ち状態の間に対象イベントフラグが削除)}%en{Waiting object deleted(eventflag is deleted waiting)}
36 ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
38 return twai_flg(flgid, waiptn, wfmode, p_flgptn, TMO_FEVR);
43 /** %jp{イベントフラグ待ち}%en{Wait for Eventflag}
44 * @param flgid %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set}
45 * @param flgptn %jp{待ちビットパターン}%en{Wait bit pattern}
46 * @param wfmode %jp{待ちモード}%en{Wait mode}
47 * @param p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting}
48 * @retval E_OK %jp{正常終了}%en{Normal completion}
49 * @retval E_ID %jp{不正ID番号(flgidが不正あるいは使用できない)}%en{Invalid ID number(flgid is invalid or unusable)}
50 * @retval E_CTX %jp{コンテキストエラー}%en{Context error}
51 * @retval E_NOEXS %jp{オブジェクト未生成(対象イベントフラグが未登録)}%en{Non-existant object(specified eventflag is not registerd)}
52 * @retval E_PAR %jp{パラメータエラー(waiptn, wfmode, p_flgptnが不正)}%en{Parameter error(waiptn, wfmode, or p_flgptn is invalid)}
53 * @retval E_ILUSE %jp{サービスコール不正使用(TA_WSGL属性が指定されたイベントフラグで待ちタスクあり}%en{Illegal service call use(there is already a task waiting for an eventflag with tahe TA_WSGL attribute)}
54 * @retval E_RLWAI %jp{待ち状態の強制解除(待ち状態の間にrel_waiを受付)}%en{Forced release from waiting(accept rel_wai while waiting)}
55 * @retval E_DLT %jp{待ちオブジェクトの削除(待ち状態の間に対象イベントフラグが削除)}%en{Waiting object deleted(eventflag is deleted waiting)}
57 ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
59 _KERNEL_T_FLGCB *flgcb;
60 _KERNEL_T_FLGINF flginf;
61 _KERNEL_T_TSKHDL tskhdl;
66 #if _KERNEL_SPT_WAI_FLG_E_CTX
67 if ( _KERNEL_SYS_SNS_DPN() )
69 return E_CTX; /* %jp{コンテキストエラー}%en{Context error} */
74 #ifdef _KERNEL_SPT_WAI_FLG_E_ID
75 if ( !_KERNEL_FLG_CHECK_FLGID(flgid) )
77 return E_ID; /* %jp{ID不正} */
82 #ifdef _KERNEL_SPT_WAI_FLG_E_PAR
85 return E_PAR; /* %jp{パラメータ不正} */
89 _KERNEL_ENTER_SVC(); /* %jp{サービスコール開始} */
91 /* %jp{オブジェクト存在チェック} */
92 #ifdef _KERNEL_SPT_WAI_FLG_E_NOEXS
93 if ( !_KERNEL_FLG_CHECK_EXS(flgid) )
95 _KERNEL_LEAVE_SVC(); /* %jp{サービスコール終了} */
96 return E_NOEXS; /* %jp{オブジェクト未生成} */
100 /* %jp{コントロールブロック取得} */
101 flgcb = _KERNEL_FLG_ID2FLGCB(flgid);
103 #if _KERNEL_SPT_WAI_FLG_E_ILUSE
104 if ( !(_KERNEL_FLG_GET_FLGATR(_KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb)) & TA_WMUL)
105 && _KERNEL_REF_QUE(_KERNEL_FLG_GET_QUE(flgcb)) != _KERNEL_TSKHDL_NULL )
107 _KERNEL_LEAVE_SVC(); /* %jp{サービスコール終了} */
113 flginf.waiptn = waiptn;
114 flginf.wfmode = wfmode;
117 if ( _kernel_chk_flg(flgcb, &flginf) )
119 /* %jp{既に条件を満たしているなら} */
120 if ( p_flgptn != NULL )
122 *p_flgptn = _KERNEL_FLG_GET_FLGPTN(flgcb); /* %jp{解除時のフラグパターンを格納} */
125 #if _KERNEL_SPT_FLG_TA_CLR
126 if ( _KERNEL_FLG_GET_FLGATR(_KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb)) & TA_CLR )
128 _KERNEL_FLG_SET_FLGPTN(flgcb, 0); /* %jp{クリア属性があればクリア} */
136 /* %jp{タスクを待ち状態にする} */
137 tskhdl = _KERNEL_SYS_GET_RUNTSK();
138 tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */
139 _KERNEL_TSK_SET_TSKSTAT(tcb, _KERNEL_TTS_WAI);
140 _KERNEL_TSK_SET_TSKWAIT(tcb, _KERNEL_TTW_SEM);
141 _KERNEL_TSK_SET_WOBJID(tcb, flgid);
142 _KERNEL_TSK_SET_DATA(tcb, (VP_INT)&flginf);
144 _KERNEL_DSP_WAI_TSK(tskhdl);
145 _KERNEL_FLG_ADD_QUE(flgcb, _KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb), tskhdl); /* %jp{待ち行列に追加} */
147 /* %jp{タスクディスパッチの実行} */
151 ercd = _KERNEL_TSK_GET_ERCD(tcb);
153 /* %jp{条件を満たして解除されたのなら} */
156 if ( p_flgptn != NULL )
158 *p_flgptn = flginf.waiptn; /* %jp{解除時のフラグパターンを格納} */
163 _KERNEL_LEAVE_SVC(); /* %jp{サービスコール終了} */
165 return ercd; /* 成功 */
171 #else /* _KERNEL_SPT_WAI_FLG */
174 #if _KERNEL_SPT_WAI_FLG_E_NOSPT
176 /** %jp{イベントフラグ待ち}%en{Wait for Eventflag}
177 * @param flgid %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set}
178 * @param flgptn %jp{待ちビットパターン}%en{Wait bit pattern}
179 * @param wfmode %jp{待ちモード}%en{Wait mode}
180 * @param p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting}
181 * @retval E_NOSPT %jp{未サポート機能}%en{Unsupported function}
183 ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
190 #endif /* _KERNEL_SPT_WAI_FLG */