OSDN Git Service

doxygenの追加等
[mimic/MiMicSDK.git] / lib / src / include / NyLPC_stdlib.h
1 /*********************************************************************************\r
2  * PROJECT: MiMic\r
3  * --------------------------------------------------------------------------------\r
4  *\r
5  * This file is part of MiMic\r
6  * Copyright (C)2011 Ryo Iizuka\r
7  *\r
8  * MiMic is free software: you can redistribute it and/or modify\r
9  * it under the terms of the GNU Lesser General Public License as published\r
10  * by the Free Software Foundation, either version 3 of the License, or\r
11  * (at your option) any later version.\r
12  *\r
13  * This program is distributed in the hope that it will be useful,\r
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
16  * GNU General Public License for more details.\r
17  *\r
18  * You should have received a copy of the GNU Lesser General Public License\r
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
20  *\r
21  * For further information please contact.\r
22  *      http://nyatla.jp/\r
23  *      <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
24  *\r
25  *********************************************************************************/\r
26 /**\r
27  * @file\r
28  * このファイルは、ルートモジュールにあるヘッダファイルを集積します。\r
29  * 基本的な型の定義も行います。\r
30  */\r
31 #ifndef NyLPC_stdlib_h\r
32 #define NyLPC_stdlib_h\r
33 \r
34 /**\r
35  * 環境定数です。WIN32環境でコンパイルすることを示します。\r
36  */\r
37 #define NyLPC_ARCH_WIN32 1\r
38 /**\r
39  * 環境定数です。FREERTOS環境でコンパイルすることを示します。\r
40  */\r
41 #define NyLPC_ARCH_FREERTOS 2\r
42 \r
43 /**\r
44  * 環境定数です。アーキテクチャを選択します。NyLPC_ARCH_WIN32は、デバック用の定数です。\r
45  * 通常は、NyLPC_ARCH_FREERTOSを使用します。\r
46  */\r
47 #ifdef WIN_DEBUG\r
48         #define NyLPC_ARCH NyLPC_ARCH_WIN32\r
49 #else\r
50         #define NyLPC_ARCH NyLPC_ARCH_FREERTOS\r
51 #endif\r
52 \r
53 #if NyLPC_ARCH==NyLPC_ARCH_FREERTOS\r
54         #include "FreeRTOS.h"\r
55         #include "semphr.h"\r
56         #include "task.h"\r
57 #elif NyLPC_ARCH==NyLPC_ARCH_WIN32\r
58 #else\r
59 #error Bad NyLPC_ARCH!\r
60 #endif\r
61 \r
62 #include <string.h>\r
63 /**********************************************************************\r
64  *\r
65  * ASSERT/ABORT\r
66  *\r
67  **********************************************************************/\r
68 \r
69 /**\r
70  * 引数チェック専用のASSERT構文です。\r
71  * デバック時のみ有効です。\r
72  */\r
73 #define NyLPC_ArgAssert(e) if(!(e)){NyLPC_assertHook(NULL,-1);};\r
74 \r
75 /**\r
76  * ASSERTマクロです。\r
77  * デバック時のみ有効です。\r
78  */\r
79 #define NyLPC_Assert(e) if(!(e)){NyLPC_assertHook(NULL,-1);};\r
80 \r
81 /**\r
82  * デバック用のフックマクロです。\r
83  * デバック時のみ有効です。\r
84  */\r
85 #define NyAR_DebugHook() {NyLPC_debugHook(__FILE__,__LINE__);};\r
86 \r
87 /**\r
88  * Abortマクロです。プログラムを異常終了するときのエントリポイントになります。\r
89  * デバック時/リリース時のどちらでも有効です。\r
90  */\r
91 #define NyLPC_Abort() {NyLPC_abortHook(__FILE__,__LINE__);};    //もうだめ\r
92 \r
93 /**\r
94  * Abortマクロです。eが偽の時に、異常終了します。\r
95  * デバック時/リリース時のどちらでも有効です。\r
96  * @param e\r
97  * 評価式です。\r
98  */\r
99 #define NyLPC_AbortIfNot(e) if(!(e)){NyLPC_abortHook(__FILE__,__LINE__);};\r
100 \r
101 /**\r
102  * 警告表示用のマクロです。デバックに使います。\r
103  * デバック時のみ有効です。\r
104  */\r
105 #define NyLPC_Warning() {NyLPC_debugHook(__FILE__,__LINE__);};\r
106 \r
107 /**\r
108  * 警告表示用のマクロです。eが偽の時に、警告を出します。\r
109  * デバック時のみ有効です。\r
110  * @param e\r
111  * 評価式です。\r
112  */\r
113 #define NyLPC_WarningIfNot(e) if(!(e)){NyLPC_debugHook(__FILE__,__LINE__);};\r
114 \r
115 /*\r
116  * トレースマクロです。デバックに使います。\r
117  * 内部変数に、最後にコールされたファイル名と、行番号を保存します。\r
118  * デバック時のみ有効です。\r
119  */\r
120 #define NyLPC_Trace() {NyLPC_debugHook(__FILE__,__LINE__);};\r
121 \r
122 /**\r
123  * アサートマクロが使う関数です。\r
124  * @param m\r
125  * __FILE__を指定します。\r
126  * @param l\r
127  * __LINE__を指定します。\r
128  */\r
129 void NyLPC_assertHook(const char* m,int l);\r
130  /**\r
131   * Abortマクロが使う関数です。\r
132   * @param m\r
133   * __FILE__を指定します。\r
134   * @param l\r
135   * __LINE__を指定します。\r
136   */\r
137 void NyLPC_abortHook(const char* m,int l);\r
138 /**\r
139  * Debugマクロが使う関数です。\r
140  * @param m\r
141  * __FILE__を指定します。\r
142  * @param l\r
143  * __LINE__を指定します。\r
144  */\r
145 void NyLPC_debugHook(const char* m,int l);\r
146 \r
147 /**\r
148  * デバック用のステータス変数です。\r
149  * アサートを検出した回数を保存します。\r
150  */\r
151 extern unsigned int NyLPC_assert_counter;\r
152 /**\r
153  * デバック用のステータス変数です。\r
154  * アサートを検出した回数を保存します。\r
155  */\r
156 extern unsigned int NyLPC_abort_counter;\r
157 /**\r
158  * デバック用のステータス変数です。\r
159  * アサートを検出した回数を保存します。\r
160  */\r
161 extern unsigned int NyLPC_debug_counter;\r
162 \r
163 /**\r
164  * GOTO方式のエラーハンドラを記述するためのマクロです。\r
165  * @param l\r
166  * 指定ラベルへジャンプします。\r
167  */\r
168 #if NyLPC_ARCH==NyLPC_ARCH_FREERTOS\r
169         #define NyLPC_OnErrorGoto(l) goto l\r
170 #elif NyLPC_ARCH==NyLPC_ARCH_WIN32\r
171         #define NyLPC_OnErrorGoto(l) printf("%s:%d\n",__FILE__,__LINE__); goto l;\r
172 #else\r
173 #error Bad NyLPC_ARCH!\r
174 #endif\r
175 \r
176 \r
177 \r
178 /**********************************************************************\r
179  *\r
180  * Basic type\r
181  *\r
182  **********************************************************************/\r
183 \r
184 /**\r
185  * 処理系依存の真偽値型です。\r
186  */\r
187 #if NyLPC_ARCH==NyLPC_ARCH_FREERTOS\r
188         typedef portBASE_TYPE NyLPC_TBool;\r
189 #elif NyLPC_ARCH==NyLPC_ARCH_WIN32\r
190         typedef int NyLPC_TBool;\r
191 #else\r
192 #error Bad NyLPC_ARCH!\r
193 #endif\r
194 /**\r
195  * TRUEを表します。この値は、ifで評価したときに真を返すことを保障します。\r
196  */\r
197 #define NyLPC_TBool_TRUE (0==0)\r
198 /**\r
199  * FALSEを表します。この値は、ifで評価したときに偽を返すことを保障します。\r
200  */\r
201 #define NyLPC_TBool_FALSE (0!=0)\r
202 \r
203 /**\r
204  * 8bit長のバイト文字の型です。\r
205  */\r
206 typedef char NyLPC_TChar;\r
207 /**\r
208  * 符号有り8bit型です。\r
209  */\r
210 typedef char NyLPC_TInt8;\r
211 /**\r
212  * 符号有り16bit型です。\r
213  */\r
214 typedef short NyLPC_TInt16;\r
215 /**\r
216  * 符号有り32bit型です。\r
217  */\r
218 typedef long NyLPC_TInt32;\r
219 \r
220 //----------------------------------------------------------------------\r
221 // NyLPC_TUInt8\r
222 //----------------------------------------------------------------------\r
223 \r
224 /**\r
225  * 符号無し8bit型です。\r
226  */\r
227 typedef unsigned char NyLPC_TUInt8;\r
228 \r
229 /**\r
230  * ビット操作関数です。bfのビット番号bに、1をセットします。\r
231  * @bf\r
232  * 操作対象の変数です。\r
233  * @b\r
234  * 操作するビット番号です。\r
235  */\r
236 #define NyLPC_TUInt8_setBit(bf,b) NyLPC_TUInt32_setBit(bf,b)\r
237 /**\r
238  * ビット操作関数です。bfのビット番号bに、0をセットします。\r
239  * @bf\r
240  * 操作対象の変数です。\r
241  * @b\r
242  * 操作するビット番号です。\r
243  */\r
244 #define NyLPC_TUInt8_unsetBit(bf,b) NyLPC_TUInt32_unsetBit(bf,b)\r
245 /**\r
246  * ビット判定関数です。bfのビット番号bが1であるかを確認します。\r
247  * @bf\r
248  * 判定する変数です。\r
249  * @b\r
250  * 判定するビット番号です。\r
251  * @return\r
252  * ビットが1なら真を返します。\r
253  */\r
254 #define NyLPC_TUInt8_isBitOn(bf,b) NyLPC_TUInt32_isBitOn(bf,b)\r
255 \r
256 /**\r
257  * 8bit長のTRUE値です。\r
258  */\r
259 #define NyLPC_TUInt8_TRUE NyLPC_TBool_TRUE\r
260 /**\r
261  * 8bit長のFALSE値です。\r
262  */\r
263 #define NyLPC_TUInt8_FALSE NyLPC_TBool_FALSE\r
264 /**\r
265  * 8bit長のFALSEをNyLPC_TBoolへ変換します。\r
266  * @param a\r
267  * 変換する変数です。\r
268  * @return\r
269  * 変換した値です。\r
270  */\r
271 #define NyLPC_TUInt8_castto_TBool(a) ((a)?NyLPC_TBool_TRUE:NyLPC_TBool_FALSE)\r
272 \r
273 //----------------------------------------------------------------------\r
274 // NyLPC_TUInt16\r
275 //----------------------------------------------------------------------\r
276 \r
277 /**\r
278  * 符号無し16bit型です。\r
279  */\r
280 typedef unsigned short NyLPC_TUInt16;\r
281 /**\r
282  * ビット操作関数です。bfのビット番号bに、1をセットします。\r
283  * @bf\r
284  * 操作対象の変数です。\r
285  * @b\r
286  * 操作するビット番号です。\r
287  */\r
288 #define NyLPC_TUInt16_setBit(bf,b) NyLPC_TUInt32_setBit(bf,b)\r
289 /**\r
290  * ビット操作関数です。bfのビット番号bに、0をセットします。\r
291  * @bf\r
292  * 操作対象の変数です。\r
293  * @b\r
294  * 操作するビット番号です。\r
295  */\r
296 #define NyLPC_TUInt16_unsetBit(bf,b) NyLPC_TUInt32_unsetBit(bf,b)\r
297 /**\r
298  * ビット判定関数です。bfのビット番号bが1であるかを確認します。\r
299  * @bf\r
300  * 判定する変数です。\r
301  * @b\r
302  * 判定するビット番号です。\r
303  * @return\r
304  * ビットが1なら真を返します。\r
305  */\r
306 #define NyLPC_TUInt16_isBitOn(bf,b) NyLPC_TUInt32_isBitOn(bf,b)\r
307 \r
308 /**\r
309  * バイトオーダーを入れ替えます。\r
310  * @param n\r
311  * 変換もとの変数です。\r
312  * @return\r
313  * 入れ替えた16ビット値を返します。\r
314  *\r
315  */\r
316 #define NyLPC_TUInt16_BSWAP(n) (((((NyLPC_TUInt16)(n))<< 8)&0xff00)|((((NyLPC_TUInt16)(n))>> 8)&0x00ff))\r
317 \r
318 \r
319 \r
320 /**\r
321  * バイトオーダーを入れ替えます。\r
322  * NyLPC_TUInt16_BSWAPとの違いは、関数であることです。\r
323  * @param n\r
324  * 変換もとの変数です。\r
325  * @return\r
326  * 入れ替えた16ビット値を返します。\r
327  */\r
328 NyLPC_TUInt16 NyLPC_TUInt16_bswap(NyLPC_TUInt16 n);\r
329 /**\r
330  * 16bit長のTRUE値です。\r
331  */\r
332 #define NyLPC_TUInt16_TRUE NyLPC_TBool_TRUE\r
333 /**\r
334  * 16bit長のFALSE値です。\r
335  */\r
336 #define NyLPC_TUInt16_FALSE NyLPC_TBool_FALSE\r
337 /**\r
338  * 16bit長のFALSEをNyLPC_TBoolへ変換します。\r
339  * @param a\r
340  * 変換する変数です。\r
341  * @return\r
342  * 変換した値です。\r
343  */\r
344 #define NyLPC_TUInt16_castto_TBool(a) ((a)?NyLPC_TBool_TRUE:NyLPC_TBool_FALSE)\r
345 \r
346 //----------------------------------------------------------------------\r
347 \r
348 /**\r
349  * 符号無し32bit型です。\r
350  */\r
351 typedef unsigned long NyLPC_TUInt32;\r
352 /**\r
353  * ビット操作関数です。bfのビット番号bに、1をセットします。\r
354  * @bf\r
355  * 操作対象の変数です。\r
356  * @b\r
357  * 操作するビット番号です。\r
358  */\r
359 #define NyLPC_TUInt32_setBit(bf,b) bf=(bf|b)\r
360 /**\r
361  * ビット操作関数です。bfのビット番号bに、0をセットします。\r
362  * @bf\r
363  * 操作対象の変数です。\r
364  * @b\r
365  * 操作するビット番号です。\r
366  */\r
367 #define NyLPC_TUInt32_unsetBit(bf,b) bf=(bf&(~b))\r
368 /**\r
369  * ビット判定関数です。bfのビット番号bが1であるかを確認します。\r
370  * @bf\r
371  * 判定する変数です。\r
372  * @b\r
373  * 判定するビット番号です。\r
374  * @return\r
375  * ビットが1なら真を返します。\r
376  */\r
377 #define NyLPC_TUInt32_isBitOn(bf,b) ((bf&b)==(b))\r
378 \r
379 /**\r
380  * バイトオーダーを入れ替えます。\r
381  * @param n\r
382  * 変換もとの変数です。\r
383  * @return\r
384  * 入れ替えた32ビット値を返します。\r
385  *\r
386  */\r
387 #define NyLPC_TUInt32_BSWAP(n) (((((NyLPC_TUInt32)(n))<<24)&0xff000000)|((((NyLPC_TUInt32)(n))<< 8)&0x00ff0000)|((((NyLPC_TUInt32)(n))>> 8)&0x0000ff00)|((((NyLPC_TUInt32)(n))>>24)&0x000000ff))\r
388 /**\r
389  * バイトオーダーを入れ替えます。\r
390  * NyLPC_TUInt32_BSWAPとの違いは、関数であることです。\r
391  * @param n\r
392  * 変換もとの変数です。\r
393  * @return\r
394  * 入れ替えた32ビット値を返します。\r
395  */\r
396 NyLPC_TUInt32 NyLPC_TUInt32_bswap(NyLPC_TUInt32 n);\r
397 \r
398 /**\r
399  * 32bit長のTRUE値です。\r
400  */\r
401 #define NyLPC_TUInt32_TRUE NyLPC_TBool_TRUE\r
402 /**\r
403  * 32bit長のFALSE値です。\r
404  */\r
405 #define NyLPC_TUInt32_FALSE NyLPC_TBool_FALSE\r
406 /**\r
407  * 32bit長のFALSEをNyLPC_TBoolへ変換します。\r
408  * @param a\r
409  * 変換する変数です。\r
410  * @return\r
411  * 変換した値です。\r
412  */\r
413 #define NyLPC_TUInt32_castto_TBool(a) ((a)?NyLPC_TBool_TRUE:NyLPC_TBool_FALSE)\r
414 \r
415 \r
416 \r
417 \r
418 \r
419 /*********************************************************************************\r
420  *\r
421  *********************************************************************************/\r
422 \r
423 \r
424 #include "../NyLPC_cRingBuffer.h"\r
425 #include "../NyLPC_cPtrTbl.h"\r
426 #include "../NyLPC_cFifoBuffer.h"\r
427 #include "../NyLPC_cPtrStream.h"\r
428 #include "../NyLPC_cStr.h"\r
429 \r
430 \r
431 #if NyLPC_ARCH==NyLPC_ARCH_FREERTOS\r
432         #include "../NyLPC_cStopwatch.h"\r
433         #include "../NyLPC_cMutex.h"\r
434         #include "../NyLPC_cThread.h"\r
435 #endif\r
436 \r
437 \r
438 \r
439 #endif\r