source: ssp_qb_r5f100le_cs/trunk/extension/eventflag.c

Last change on this file was 95, checked in by nmir-saito, 9 years ago

ファイルの mime-type 変更

  • Property svn:mime-type set to text/plain; charset=shift_jis
File size: 5.8 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6 * Toyohashi Univ. of Technology, JAPAN
7 * Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 * Copyright (C) 2011 by Meika Sugimoto
10 * Copyright (C) 2015 by Naoki Saito
11 * Nagoya Municipal Industrial Research Institute, JAPAN
12 *
13 * 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
14 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
15 * 再配布(以下,利用と呼ぶ)することを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
17 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース
18 * コード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
20 * できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
21 * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
22 * 証規定を掲載すること.
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
24 * できない形で再配布する場合には,次のいずれかの条件を満たすこと.
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
26 * 権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
28 * 告すること.
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
30 * からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
31 * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
32 * く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
35 * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
36 * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
37 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負
38 * わない.
39 *
40 */
41/*
42 * イベントフラグ機能
43 */
44
45
46#include "kernel_impl.h"
47#include "check.h"
48#include "eventflag.h"
49
50/*
51 * トレースログマクロのデフォルト定義
52 */
53#ifndef LOG_SET_FLG_ENTER
54#define LOG_SET_FLG_ENTER(flgid, setptn)
55#endif /* LOG_SET_FLG_ENTER */
56
57#ifndef LOG_SET_FLG_LEAVE
58#define LOG_SET_FLG_LEAVE(ercd)
59#endif /* LOG_SET_FLG_LEAVE */
60
61#ifndef LOG_ISET_FLG_ENTER
62#define LOG_ISET_FLG_ENTER(flgid, setptn)
63#endif /* LOG_ISET_FLG_ENTER */
64
65#ifndef LOG_ISET_FLG_LEAVE
66#define LOG_ISET_FLG_LEAVE(ercd)
67#endif /* LOG_ISET_FLG_LEAVE */
68
69#ifndef LOG_CLR_FLG_ENTER
70#define LOG_CLR_FLG_ENTER(flgid, clrptn)
71#endif /* LOG_CLR_FLG_ENTER */
72
73#ifndef LOG_CLR_FLG_LEAVE
74#define LOG_CLR_FLG_LEAVE(ercd)
75#endif /* LOG_CLR_FLG_LEAVE */
76
77#ifndef LOG_POL_FLG_ENTER
78#define LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn)
79#endif /* LOG_POL_FLG_ENTER */
80
81#ifndef LOG_POL_FLG_LEAVE
82#define LOG_POL_FLG_LEAVE(ercd, flgptn)
83#endif /* LOG_POL_FLG_LEAVE */
84
85
86
87/* イベントフラグIDIDからの配列オフセットへの変換マクロ */
88#define INDEX_FLG(flgid) ((uint_t)((flgid) - TMIN_FLGID))
89
90#ifdef TOPPERS_iniflg
91
92void initialize_eventflag(void)
93{
94 int_t i;
95
96 for(i = 0 ; i < tmax_flgid ; i++)
97 {
98 /* ビットパターンの初期化 */
99 flgcb_flgptn[i] = flginib_iflgptn[i];
100 }
101}
102
103#endif /* TOPPERS_iniflg */
104
105/*
106 * イベントフラグ条件が成立しているかのチェック
107 */
108Inline bool_t
109check_flg_cond(FLGPTN curptn , FLGPTN waiptn, MODE wfmode)
110{
111 bool_t flgset = false;
112
113 if ((wfmode & TWF_ORW) != 0U)
114 {
115 if((curptn & waiptn) != 0U)
116 {
117 flgset = true;
118 }
119 }
120 else /* (wfmode & TWF_ANDW) != 0U */
121 {
122 if((curptn & waiptn) == waiptn)
123 {
124 flgset = true;
125 }
126 }
127
128 return (flgset);
129}
130
131/*
132 * イベントフラグのセット
133 */
134#ifdef TOPPERS_set_flg
135
136ER
137set_flg(ID flgid, FLGPTN setptn)
138{
139 ER ercd;
140
141 LOG_SET_FLG_ENTER(flgid, setptn);
142 CHECK_TSKCTX_UNL();
143 CHECK_FLGID(flgid);
144
145 t_lock_cpu();
146 flgcb_flgptn[INDEX_FLG(flgid)] |= setptn;
147 ercd = E_OK;
148 t_unlock_cpu();
149
150 error_exit:
151 LOG_SET_FLG_LEAVE(ercd);
152 return(ercd);
153}
154
155
156#endif /* TOPPERS_set_flg */
157
158/*
159 * イベントフラグのセット(非タスクコンテキスト用)
160 */
161#ifdef TOPPERS_iset_flg
162
163ER
164iset_flg(ID flgid, FLGPTN setptn)
165{
166 ER ercd;
167
168 LOG_ISET_FLG_ENTER(flgid, setptn);
169 CHECK_INTCTX_UNL();
170 CHECK_FLGID(flgid);
171
172 i_lock_cpu();
173 flgcb_flgptn[INDEX_FLG(flgid)] |= setptn;
174 ercd = E_OK;
175 i_unlock_cpu();
176
177 error_exit:
178 LOG_ISET_FLG_LEAVE(ercd);
179 return(ercd);
180}
181
182#endif /* TOPPERS_iset_flg */
183
184/*
185 * イベントフラグのクリア
186 */
187#ifdef TOPPERS_clr_flg
188
189ER
190clr_flg(ID flgid, FLGPTN clrptn)
191{
192 ER ercd;
193
194 LOG_CLR_FLG_ENTER(flgid, clrptn);
195 CHECK_TSKCTX_UNL();
196 CHECK_FLGID(flgid);
197
198 t_lock_cpu();
199 flgcb_flgptn[INDEX_FLG(flgid)] &= clrptn;
200 ercd = E_OK;
201 t_unlock_cpu();
202
203 error_exit:
204 LOG_CLR_FLG_LEAVE(ercd);
205 return(ercd);
206}
207
208#endif /* TOPPERS_clr_flg */
209
210
211/*
212 * イベントフラグ待ち(ポーリング)
213 */
214#ifdef TOPPERS_pol_flg
215
216ER
217pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
218{
219 ER ercd;
220 int_t index;
221
222 LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn);
223 CHECK_TSKCTX_UNL();
224 CHECK_FLGID(flgid);
225 CHECK_PAR(waiptn != 0U);
226 CHECK_PAR(wfmode == TWF_ORW || wfmode == TWF_ANDW);
227
228 t_lock_cpu();
229
230 index = INDEX_FLG(flgid);
231
232 if (check_flg_cond(flgcb_flgptn[index], waiptn, wfmode)) {
233 ercd = E_OK;
234 *p_flgptn = flgcb_flgptn[index];
235
236 if((flginib_atr[index] & TA_CLR) != 0U)
237 {
238 flgcb_flgptn[index] = 0U;
239 }
240 }
241 else {
242 ercd = E_TMOUT;
243 }
244 t_unlock_cpu();
245
246 error_exit:
247 LOG_POL_FLG_LEAVE(ercd, *p_flgptn);
248 return(ercd);
249}
250
251#endif /* TOPPERS_pol_flg */
252
253
Note: See TracBrowser for help on using the repository browser.