1 /************************************************************************
4 * (c) Copyright 2021, devenkong(18151155@qq.com), Hangzhou, China
5 * (c) Copyright 2021, devenkong(18151155@qq.com), º¼ÖÝ, Öйú
6 ************************************************************************
8 * function: QStackÄ£¿é¡£
9 * createdate: 2021-05-01
10 * author: devenkong(18151155@qq.com)
11 * note£º QStackÔ´×ÔÓÚQueue,ÊǼ¯Êý×éArray,¶ÓÁÐQueueºÍ¶ÑÕ»StackÓÚÒ»ÌåµÄ
12 * Êý¾Ý½á¹¹.ÔÚʹÓöÓÁйý³ÌÖÐ,ºÜ¶àÊý×éµÄ²Ù×÷»áÓõ½,²¢ÇÒStack¿É»ùÓÚ¶Ó
13 * ÁнṹÌåÐÅÏ¢À´½øÐÐʵÏÖ,ËùÒÔ½«¼¸ÖÖ¹¦Äܺϲ¢ÔÚÒ»Æð,ÑÜÉú³öQStack.
14 * Stack½ö½öʹÓÃÁËQueueµÄheadÖ¸Õë,Array½ö½öʹÓÃTailÖ¸Õë.ÔÚIndex,
15 * Sum,Average,Ê×β²î¼ÆËãµÈ²Ù×÷ÖÐ,ʹÓõÄÊÇÏàͬµÄº¯Êý.StackµÄÄÚ´æ´æ´¢
16 * ·½Ê½ºÍÁíÍâÁ½¸ö²»Í¬,ËùÒÔÔÚindexºÍmemcpyʱºÍѹջµÄÊý¾Ý˳ÐòÊDz»Í¬µÄ.
17 * QStack¿É¶Ô8/16/32bit/NbyteÊý¾Ý½øÐвÙ×÷.
18 * ΪÁËÔÚº¯ÊýʹÓÃÉÏÖ±¹ÛµÄʹÓÃQueueXXX()ºÍStackXXX()·Ö±ð¶Ô¶ÓÁкÍ
19 * ¶ÑÕ»½øÐвÙ×÷,¶¨ÒåÁËһЩºê,ʵ¼Êµ÷ÓõÄÊÇQStackXXX().
20 ************************************************************************/
22 /************************************************************************
24 * author: devenkong(18151155@qq.com)
27 ----------------------------------------------------------------------
28 Version-Date------Author-----Explanation
29 ----------------------------------------------------------------------
30 1.00 06-12-06 ¿×µÂ·å QueueµÚÒ»°æ
31 1.01 08-12-01 ¿×µÂ·å Ôö¼ÓÁËQueueValideCnt
32 1.02 20-05-30 ¿×µÂ·å ÓÃÓÚlinuxÇý¶¯
33 1.03 21-04-23 ¿×µÂ·å Ìí¼Óstack¹¦ÄÜ£¬¶ÓÁÐÊý¾Ý²Ù×÷·Ö³É8/16/32bitÒÔ¼°N×Ö½Ú²Ù×÷
34 1.04 21-05-01 ¿×µÂ·å ½«Queue,StackºÍArray¹¦ÄÜÌí¼Óµ½QStack,²¢·Ö±ð¿ÉʹÓÃÔÓнӿÚÃû³Æ.
35 ----------------------------------------------------------------------
36 ************************************************************************/
38 #ifndef __LIB_QSTACK_H__
39 #define __LIB_QSTACK_H__
41 /* Type Definations */
50 #include <linux/errno.h>
52 #include <linux/sched.h>
53 #include <linux/cdev.h>
55 #include <asm/system.h>
56 #include <asm/uaccess.h>
58 #include "linux/init.h"
59 #include "linux/module.h"
60 #include <linux/types.h>
61 #include "linux/spinlock.h"
64 /* дÔÚÍ·ÎļþÒýÓõÄ×îºó£¬ÒÔÃâ¸úÄÚºËÍ·ÎļþµÄ¶¨ÒåÓгåÍ» */
68 typedef struct _tag_QSTACK
{
78 // THREAD_MUTEX stMutex;
86 /* Public Variables and Functions */
88 extern_XXX(Gerneral_Operation
);
90 /*********************************************************************
91 * Ãû×Ö: QStackIF_InitQueue
92 * ¹¦ÄÜ: ³õʼ»¯Queue¶ÓÁС£
93 * ²ÎÊý: pstQStack£º¶ÓÁнṹÌåÖ¸Õë
94 * pu8Buff£º¶ÓÁÐËù²Ù×÷µÄ»º´æ
97 *********************************************************************/
98 extern void QStackIF_InitQueue (PQSTACK pstQStack
, uint8
* pu8Buff
, uint32 u32Size
);
100 /*********************************************************************
101 * Ãû×Ö: QStackIF_Create
102 * ¹¦ÄÜ: ʹÓÃbuffer¶¯Ì¬´´½¨Ò»¸öQStack¶ÓÁÐ.
103 * ²ÎÊý: pu8Buff£º¶ÓÁÐËù²Ù×÷µÄ»º´æ
105 * ·µ»Ø: QSTACK½á¹¹ÌåÖ¸Õë
106 *********************************************************************/
107 extern QSTACK
* QStackIF_Create (uint8
* pu8Buff
, uint32 u32Size
);
109 /*********************************************************************
110 * Ãû×Ö: QStackIF_Release
111 * ¹¦ÄÜ: ÊÍ·Å´´½¨µÄQSTACK½á¹¹ÌåµÄ¿Õ¼ä.
112 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
114 *********************************************************************/
115 extern void QStackIF_Release (QSTACK
*pstQStack
);
117 /*********************************************************************
118 * Ãû×Ö: QStackIF_Clear
119 * ¹¦ÄÜ: Çå³ý¶ÓÁÐÖеÄÊý¾Ý
120 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
122 *********************************************************************/
123 extern void QStackIF_Clear (QSTACK
*pstQStack
);
125 /*********************************************************************
126 * Ãû×Ö: QStackIF_MemCpy
127 * ¹¦ÄÜ: ´Ó¶ÓÁÐÖÐHead¿ªÊ¼µÄÖ¸¶¨Æ«ÒÆ´¦È¡³öÒ»¶ÎÊý¾Ý¡£
128 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
129 * u32SrcOffset£º¶ÓÁÐÊý¾ÝÖеÄÆ«ÒÆÁ¿
130 * pu8DstBuff£º¿½±´µÄÄ¿±ê»º´æµØÖ·
131 * pu8DstOffset£º¿½±´µ½Ä¿±ê»º´æµÄÖ¸¶¨Æ«ÒÆÁ¿
132 * u32Size£º¿½±´µÄ´óС
133 * ·µ»Ø: ·µ»ØDst»º´æµÄµØÖ·.
134 *********************************************************************/
135 extern char * QStackIF_MemCpy (QSTACK
*pstQStack
, uint32 u32SrcOffset
, char *pu8DstBuff
, uint32 u32DstOffset
, uint32 u32Size
);
137 /*********************************************************************
138 * Ãû×Ö: QStackIF_IsEmpty
139 * ¹¦ÄÜ: Åж϶ÓÁÐÊÇ·ñΪ¿Õ¡£
140 * ²ÎÊý: pstQStack£º¶ÓÁнṹÌåÖ¸Õë
141 * ·µ»Ø: ÊÇ·ñΪ¿Õ£¬true±íʾΪ¿Õ£¬false±íʾ²»Îª¿Õ
142 *********************************************************************/
143 extern bool QStackIF_IsEmpty (QSTACK
*pstQStack
);
145 /*********************************************************************
146 * Ãû×Ö: QStackIF_IsFull
147 * ¹¦ÄÜ: Åж϶ÓÁÐÊÇ·ñΪÂú¡£
148 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
149 * ·µ»Ø: ÊÇ·ñΪÂú£¬true±íʾΪÂú£¬false±íʾ²»ÎªÂú
150 *********************************************************************/
151 extern bool QStackIF_IsFull (QSTACK
*pstQStack
);
153 /*********************************************************************
154 * Ãû×Ö: QStackIF_GetBuffSize
155 * ¹¦ÄÜ: »ñÈ¡¶ÓÁлº´æ´óС¡£
156 * ²ÎÊý: pstQStack£º¶ÓÁнṹÌåÖ¸Õë
157 * ·µ»Ø: ¶ÓÁÐÖÐÊý¾Ý»º´æµÄ´óС.
158 *********************************************************************/
159 extern uint32
QStackIF_GetBuffSize (QSTACK
*pstQStack
);
161 /*********************************************************************
162 * Ãû×Ö: QStackIF_ValidCnt
163 * ¹¦ÄÜ: ¶ÁÈ¡¶ÓÁеÄÓÐЧÊý¾Ý¸öÊý¡£
164 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
165 * ·µ»Ø: ÔÚ¶ÓÁÐÖеÄÓÐЧÊý¾Ý¸öÊý.
166 *********************************************************************/
167 extern uint32
QStackIF_ValidCnt (QSTACK
*pstQStack
);
169 /*********************************************************************
170 * Ãû×Ö: QStackIF_BlankCnt
171 * ¹¦ÄÜ: ¶ÁÈ¡¶ÓÁеĿÕÏÐÊý¾Ý¸öÊý¡£
172 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
173 * ·µ»Ø: ·µ»Ø¶ÓÁеĿÕÏÐÊý¾Ý¸öÊý¡£
174 *********************************************************************/
175 extern uint32
QStackIF_BlankCnt (QSTACK
*pstQStack
);
177 extern_XXX(8bit_data_Operation
);
179 extern_XXX(16bit_Data_Operation
);
181 extern_XXX(U32_Data_Operation
);
183 extern_XXX(NByte_Data_Operation
);
185 /*********************************************************************
186 * Ãû×Ö: QStackIF_EnQueue
187 * ¹¦ÄÜ: Ïò¶ÓÁдæÈëµ¥¸ö×Ö½ÚÊý¾Ý,¶ÓÁÐÒÑÂúʱ,²»¸²¸ÇÇ°ÃæµÄÄÚÈÝ.
188 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
189 * cData£ºÊµ¼Ê´æÈëµÄÊý¾Ý
190 * ·µ»Ø: ÊÇ·ñ´æÈëÊý¾Ý,¿Õ¼äÒÑÂú·µ»Øfalse.
191 *********************************************************************/
192 extern bool QStackIF_EnQueue (QSTACK
*pstQStack
, char cData
);
194 extern bool QStackIF_EnQueueU16 (QSTACK
*pstQStack
, uint16 u16Data
);
195 extern bool QStackIF_EnQueueU32 (QSTACK
*pstQStack
, uint32 u32Data
);
196 extern bool QStackIF_EnQueueN (QSTACK
*pstQStack
, char *pszBuff
, uint32 u32Size
);
199 /*********************************************************************
200 * Ãû×Ö: QStackIF_LoopEnQueue(todo)
201 * ¹¦ÄÜ: Ïò¶ÓÁдæÈëµ¥¸ö×Ö½ÚÊý¾Ý,¶ÓÁÐÒÑÂúʱ,¸²¸ÇÇ°ÃæµÄÄÚÈÝ.
202 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
203 * cData£ºÊµ¼Ê´æÈëµÄÊý¾Ý
205 *********************************************************************/
206 extern void QStackIF_LoopEnQueue (QSTACK
*pstQStack
, char cData
);
208 extern void QStackIF_LoopEnQueueU16 (QSTACK
*pstQStack
, uint16 u16Data
);
209 extern void QStackIF_LoopEnQueueU32 (QSTACK
*pstQStack
, uint32 u32Data
);
210 extern void QStackIF_LoopEnQueueN (QSTACK
*pstQStack
, char *pszBuff
, uint32 u32Size
);
213 /*********************************************************************
214 * Ãû×Ö: QStackIF_DeQueue
215 * ¹¦ÄÜ: ´Ó¶ÓÁÐÖÐÈ¡³öÒ»¸ö×Ö½ÚÊý¾Ý¡£
216 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
218 *********************************************************************/
219 extern char QStackIF_DeQueue (QSTACK
*pstQStack
);
221 extern uint16
QStackIF_DeQueueU16 (QSTACK
*pstQStack
);
222 extern uint32
QStackIF_DeQueueU32 (QSTACK
*pstQStack
);
223 extern char * QStackIF_DeQueueN (QSTACK
*pstQStack
, char *pszBuff
, uint32 u32Size
);
226 /*********************************************************************
227 * Ãû×Ö: QStackIF_GetHeadData
228 * ¹¦ÄÜ: »ñÈ¡¶ÓÁÐÖÐ×îÇ°ÃæµÄheadµÄÊý¾Ý¡£
229 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
230 * ·µ»Ø: ¶ÁÈ¡µÄÒ»¸ö×Ö½ÚÊý¾Ý.
231 *********************************************************************/
232 extern char QStackIF_GetHeadData (QSTACK
*pstQStack
);
234 extern uint16
QStackIF_GetHeadDataU16 (QSTACK
*pstQStack
);
235 extern uint32
QStackIF_GetHeadDataU32 (QSTACK
*pstQStack
);
238 /*********************************************************************
239 * Ãû×Ö: QStackIF_GetTailData
240 * ¹¦ÄÜ: »ñÈ¡¶ÓÁÐÖÐ×îĩβµÄtailµÄÊý¾Ý¡£
241 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
242 * ·µ»Ø: ¶ÁÈ¡µÄÒ»¸ö×Ö½ÚÊý¾Ý.
243 *********************************************************************/
244 extern char QStackIF_GetTailData (QSTACK
*pstQStack
);
246 extern uint16
QStackIF_GetTailDataU16 (QSTACK
*pstQStack
);
247 extern uint32
QStackIF_GetTailDataU32 (QSTACK
*pstQStack
);
250 /*********************************************************************
251 * Ãû×Ö: QStackIF_Index
252 * ¹¦ÄÜ: ¶ÁÈ¡¶ÓÁÐÓÐЧÊý¾ÝÖÐÖ¸¶¨Î»ÖõÄcharÀàÐÍÊý¾Ý¡£
253 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
254 * ·µ»Ø: Ö¸¶¨Æ«ÒÆλÖõÄÊý¾Ý
255 *********************************************************************/
256 extern char QStackIF_Index (QSTACK
*pstQStack
, uint32 u32Pos
);
258 extern uint16
QStackIF_IndexU16 (QSTACK
*pstQStack
, uint32 u32Pos
);
259 extern uint32
QStackIF_IndexU32 (QSTACK
*pstQStack
, uint8 u32Pos
);
262 /*********************************************************************
263 * Ãû×Ö: QStackIF_CheckSum(todo)
264 * ¹¦ÄÜ: ÒÔuint8ÀàÐͼÆËã¶ÓÁÐÖÐÊý¾ÝµÄÀÛ¼ÓºÍ,ʹÓÃuint16×÷Ϊ·µ»ØÖµ.
265 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
266 * ·µ»Ø: ·µ»Ø¼ÆËãµÄÀÛ¼ÓºÍÊý¾Ý.
267 *********************************************************************/
268 extern uint16
QStackIF_CheckSum (QSTACK
*pstQStack
);
270 extern uint32
QStackIF_CheckSumU16 (QSTACK
*pstQStack
);
271 extern uint64
QStackIF_CheckSumU32 (QSTACK
*pstQStack
);
274 /*********************************************************************
275 * Ãû×Ö: QStackIF_HeadSubTail(todo)
276 * ¹¦ÄÜ: ¼ÆËã¶ÓÁÐÖÐÍ·ºÍβuint8ÀàÐÍÊý¾ÝµÄ²îÖµ,²¢·µ»Øint16Öµ.
277 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
278 * ·µ»Ø: ·µ»ØͷβÊý¾ÝµÄ²îÖµ.
279 *********************************************************************/
280 extern int16
QStackIF_HeadSubTail (QSTACK
*pstQStack
);
282 extern int32
QStackIF_HeadSubTailU16 (QSTACK
*pstQStack
);
283 extern int64
QStackIF_HeadSubTailU32 (QSTACK
*pstQStack
);
286 /*********************************************************************
287 * Ãû×Ö: QStackIF_Average(todo)
288 * ¹¦ÄÜ: ¼ÆËã¶ÓÁÐÖÐuint8Êý¾ÝµÄƽ¾ùÖµ
289 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
290 * ·µ»Ø: ·µ»Ø¶ÓÁеÄƽ¾ùÖµ
291 *********************************************************************/
292 extern uint8
QStackIF_Average (QSTACK
*pstQStack
);
294 extern uint16
QStackIF_AverageU16 (QSTACK
*pstQStack
);
295 extern uint32
QStackIF_AverageU32 (QSTACK
*pstQStack
);
298 /*********************************************************************
299 * Ãû×Ö: QStackIF_AverageSigned8(todo)
300 * ¹¦ÄÜ: ¼ÆËã¶ÓÁÐÖдø·ûºÅint8Êý¾ÝµÄƽ¾ùÖµ.
301 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
302 * ·µ»Ø: ·µ»Ø¶ÓÁеÄƽ¾ùÖµ
303 *********************************************************************/
304 extern int8
QStackIF_AverageSigned8 (QSTACK
*pstQStack
);
306 extern int16
QStackIF_AverageSigned16 (QSTACK
*pstQStack
);
307 extern int32
QStackIF_AverageSigned32 (QSTACK
*pstQStack
);
312 extern_XXX(Stack_Operation
);
314 /* ÓöÓÁеÄÊý¾Ý½á¹¹ÊµÏÖ¶ÑÕ»µÄ¹¦ÄÜ */
316 /*********************************************************************
317 * Ãû×Ö: QStackIF_InitQueue
318 * ¹¦ÄÜ: ³õʼ»¯Queue¡£
319 * ²ÎÊý: pstQStack£º¶ÓÁнṹÌåÖ¸Õë
320 * pu8Buff£º¶ÓÁÐËù²Ù×÷µÄ»º´æ
323 *********************************************************************/
324 extern void QStackIF_InitStack (QSTACK
*pstQStack
, uint8
* pu8Buff
, uint32 u32Size
);
326 /*********************************************************************
327 * Ãû×Ö: QStackIF_Push
328 * ¹¦ÄÜ: Ïò¶ÑÕ»´æÈëÊý¾Ý
329 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
330 * cData£ºÊµ¼Ê´æÈëµÄÊý¾Ý
332 *********************************************************************/
333 extern bool QStackIF_Push (QSTACK
*pstQStack
, char cData
);
334 extern bool QStackIF_PushU16 (QSTACK
*pstQStack
, uint16 u16Data
);
335 extern bool QStackIF_PushU32 (QSTACK
*pstQStack
, uint32 u32Data
);
336 extern bool QStackIF_PushN (QSTACK
*pstQStack
, char *pszBuff
, uint32 u32Size
);
338 /*********************************************************************
340 * ¹¦ÄÜ: ´Ó¶ÑÕ»ÖÐÈ¡³öÒ»¸öÊý¾Ý¡£
341 * ²ÎÊý: pstQStack£º¶ÓÁÐÖ¸Õë
342 * ·µ»Ø: È¡³öµÄʵ¼ÊÊý¾Ý
343 *********************************************************************/
344 extern char QStackIF_Pop (QSTACK
*pstQStack
);
345 extern uint16
QStackIF_PopU16 (QSTACK
*pstQStack
);
346 extern uint32
QStackIF_PopU32 (QSTACK
*pstQStack
);
347 extern char * QStackIF_PopN (QSTACK
*pstQStack
, char *pszBuff
, uint32 u32Size
);
353 /* Queue²Ù×÷½Ó¿Ú¶¨Òå */
354 #define QueueIF_Init()
355 #define QueueIF_Init()
356 #define QueueIF_Init()
357 #define QueueIF_Init()
358 #define QueueIF_Init()
360 /* Stack²Ù×÷½Ó¿Ú¶¨Òå */
361 #define StackIF_Init()
362 #define StackIF_Init()
363 #define StackIF_Init()
364 #define StackIF_Init()
365 #define StackIF_Init()
367 /* Сд×Öĸ·ç¸ñµÄº¯Êý½Ó¿Ú¶¨Òå */
368 #define StackIF_Init()
369 #define StackIF_Init()
370 #define StackIF_Init()
371 #define StackIF_Init()
372 #define StackIF_Init()
374 /* ²»°üº¬Ä£¿éÃû³ÆµÄº¯Êý½Ó¿Ú¶¨Òå */
377 #define LoopEnQueue()
379 #define StackIF_Init()
384 #endif /* __LIB_QSTACK_H__ */