source: uKadecot/trunk/ssp/extension/dataqueue.c@ 107

Last change on this file since 107 was 107, checked in by coas-nagasima, 9 years ago

SHIFT_JISのコードにcharsetプロパティを付けた

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/plain; charset=SHIFT_JIS
File size: 6.0 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 *
11 * 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
13 * 再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
15 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース
16 * コード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
18 * できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
19 * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
20 * 証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
22 * できない形で再配布する場合には,次のいずれかの条件を満たすこと.
23 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
24 * 権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
26 * 告すること.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
28 * からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
29 * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
30 * く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
33 * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
34 * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
35 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負
36 * わない.
37 *
38 */
39
40/*
41 * データキュー機能
42 */
43
44#include "kernel_impl.h"
45#include "check.h"
46#include "dataqueue.h"
47
48/*
49 * トレースログマクロのデフォルト定義
50 */
51#ifndef LOG_PSND_DTQ_ENTER
52#define LOG_PSND_DTQ_ENTER(dtqid, data)
53#endif /* LOG_PSND_DTQ_ENTER */
54
55#ifndef LOG_PSND_DTQ_LEAVE
56#define LOG_PSND_DTQ_LEAVE(ercd)
57#endif /* LOG_PSND_DTQ_LEAVE */
58
59#ifndef LOG_IPSND_DTQ_ENTER
60#define LOG_IPSND_DTQ_ENTER(dtqid, data)
61#endif /* LOG_IPSND_DTQ_ENTER */
62
63#ifndef LOG_IPSND_DTQ_LEAVE
64#define LOG_IPSND_DTQ_LEAVE(ercd)
65#endif /* LOG_IPSND_DTQ_LEAVE */
66
67#ifndef LOG_PRCV_DTQ_ENTER
68#define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
69#endif /* LOG_PRCV_DTQ_ENTER */
70
71#ifndef LOG_PRCV_DTQ_LEAVE
72#define LOG_PRCV_DTQ_LEAVE(ercd, data)
73#endif /* LOG_PRCV_DTQ_LEAVE */
74
75/*
76 * データキューへのデータ送信
77 */
78void
79enqueue_data(intptr_t* const data , uint8_t* const tail , const uint8_t size , const intptr_t sdata);
80
81/*
82 * データキューからのデータ受信
83 */
84void
85dequeue_data(intptr_t* const data , uint8_t* const head , const uint8_t size , intptr_t* rdata);
86
87
88/*
89 * データキューの数
90 */
91#define tnum_dtq ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
92
93/*
94 * データキューIDからデータキュー管理ブロックを取り出すためのマクロ
95 */
96#define INDEX_DTQ(dtqid) ((uint_t)((dtqid) - TMIN_DTQID))
97
98/*
99 * データキュー機能の初期化
100 */
101#ifdef TOPPERS_dtqini
102
103void
104initialize_dataqueue(void)
105{
106 uint_t i;
107
108 for (i = 0U ; i < tnum_dtq ; i++) {
109 dtqcb_count[i] = 0U;
110 dtqcb_head[i] = 0U;
111 dtqcb_tail[i] = 0U;
112 }
113}
114
115#endif /* TOPPERS_dtqini */
116
117
118/*
119 * データキューが満杯かのチェック
120 */
121
122Inline bool_t
123data_full(uint8_t count , uint8_t size)
124{
125 return (count >= size)? true : false;
126}
127
128/*
129 * データキューが空かのチェック
130 */
131
132Inline bool_t
133data_empty(uint8_t count)
134{
135 return (count == 0)? true : false;
136}
137
138
139/*
140 * データキューへのデータ送信
141 */
142
143
144#ifdef TOPPERS_dtqenq
145
146void
147enqueue_data(intptr_t* const data , uint8_t* const tail , const uint8_t size , const intptr_t sdata)
148{
149 data[*tail] = sdata;
150 (*tail)++;
151 if (*tail >= size) {
152 *tail = 0U;
153 }
154}
155
156#endif /* TOPPERS_dtqenq */
157
158/*
159 * 送信待ちキューの先頭タスクからのデータ受信
160 */
161#ifdef TOPPERS_dtqdeq
162
163void
164dequeue_data(intptr_t* const data , uint8_t* const head , const uint8_t size , intptr_t* rdata)
165{
166 *rdata = data[*head];
167 (*head)++;
168 if (*head >= size) {
169 *head = 0U;
170 }
171
172}
173
174#endif /* TOPPERS_dtqdeq */
175
176/*
177 * データキューへの送信(ポーリング)
178 */
179#ifdef TOPPERS_psnd_dtq
180
181ER
182psnd_dtq(ID dtqid, intptr_t data)
183{
184 ER ercd;
185 int_t index;
186
187 LOG_PSND_DTQ_ENTER(dtqid, data);
188 CHECK_TSKCTX_UNL();
189 CHECK_DTQID(dtqid);
190
191 t_lock_cpu();
192 index = INDEX_DTQ(dtqid);
193
194 if (!data_full(dtqcb_count[index] , dtqinib_size[index]))
195 {
196 enqueue_data(dtqinib_data[index] , &(dtqcb_tail[index]) ,
197 dtqinib_size[index] , data);
198 dtqcb_count[index]++;
199 ercd = E_OK;
200 }
201 else {
202 ercd = E_TMOUT;
203 }
204 t_unlock_cpu();
205
206 error_exit:
207 LOG_PSND_DTQ_LEAVE(ercd);
208 return(ercd);
209}
210
211#endif /* TOPPERS_psnd_dtq */
212
213/*
214 * データキューへの送信(ポーリング,非タスクコンテキスト用)
215 */
216#ifdef TOPPERS_ipsnd_dtq
217
218ER
219ipsnd_dtq(ID dtqid, intptr_t data)
220{
221 ER ercd;
222 int_t index;
223
224 LOG_IPSND_DTQ_ENTER(dtqid, data);
225 CHECK_INTCTX_UNL();
226 CHECK_DTQID(dtqid);
227
228 i_lock_cpu();
229 index = INDEX_DTQ(dtqid);
230
231 if (!data_full(dtqcb_count[index] , dtqinib_size[index]))
232 {
233 enqueue_data(dtqinib_data[index] , &(dtqcb_tail[index]) ,
234 dtqinib_size[index] , data);
235 dtqcb_count[index]++;
236 ercd = E_OK;
237 }
238 else {
239 ercd = E_TMOUT;
240 }
241 i_unlock_cpu();
242
243 error_exit:
244 LOG_IPSND_DTQ_LEAVE(ercd);
245 return(ercd);
246}
247
248#endif /* TOPPERS_ipsnd_dtq */
249
250/*
251 * データキューからの受信(ポーリング)
252 */
253#ifdef TOPPERS_prcv_dtq
254
255ER
256prcv_dtq(ID dtqid, intptr_t *p_data)
257{
258 ER ercd;
259 int_t index;
260
261 LOG_PRCV_DTQ_ENTER(dtqid, p_data);
262 CHECK_TSKCTX_UNL();
263 CHECK_DTQID(dtqid);
264
265 t_lock_cpu();
266 index = INDEX_DTQ(dtqid);
267
268 if (!data_empty(dtqcb_count[index]))
269 {
270 dequeue_data(dtqinib_data[index] , &(dtqcb_head[index]) ,
271 dtqinib_size[index] , p_data);
272 dtqcb_count[index]--;
273 ercd = E_OK;
274 }
275 else {
276 ercd = E_TMOUT;
277 }
278 t_unlock_cpu();
279
280 error_exit:
281 LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
282 return(ercd);
283}
284
285#endif /* TOPPERS_prcv_dtq */
Note: See TracBrowser for help on using the repository browser.