abl_ring.h

来自「SHARP_ARM720T_LH79524/5软件开发包_支持TFT_LCD_N」· C头文件 代码 · 共 247 行

H
247
字号
/*********************************************************************** 
 * $Workfile:   abl_ring.h  $ 
 * $Revision:   1.0  $ 
 * $Author:   FuraD  $ 
 * $Date:   May 18 2005 11:15:52  $ 
 * 
 * Project: Ring buffer manager
 * 
 * Description:
 *     This package provides a simple ring buffer manager with
 *     the following operations:
 *         RING_INIT: Define ring size and initialize ring
 *                    parameters.  This should be the first
 *                    operation used.
 *         RING_FLUSH: Initialize ring parameters.
 *         RING_COUNT: Return number of elements in buffer.
 *         RING_PUTC: Add element to buffer.
 *         RING_GETC: Remove element from buffer.
 *         RING_PUTC_MULTIPLE: Add multiple elements to buffer.
 *         RING_GETC_MULTIPLE: Remove multiple elements from buffer.
 *
 * Notes:
 *    The user of this ring buffer is responsible for specifying
 *    the ring buffer size and for providing the memory space used
 *    to store ring buffer data.
 *     
 * Revision History: 
 * $Log::   //smaicnt2/pvcs/VM/sharpmcu/archives/sharpmcu/software/abl/$
 * 
 *    Rev 1.0   May 18 2005 11:15:52   FuraD
 * Initial revision.
 * 
 *********************************************************************** 
 * 
 *  SHARP MICROELECTRONICS OF THE AMERICAS MAKES NO REPRESENTATION 
 *  OR WARRANTIES WITH RESPECT TO THE PERFORMANCE OF THIS SOFTWARE, 
 *  AND SPECIFICALLY DISCLAIMS ANY RESPONSIBILITY FOR ANY DAMAGES, 
 *  SPECIAL OR CONSEQUENTIAL, CONNECTED WITH THE USE OF THIS SOFTWARE. 
 * 
 *  SHARP MICROELECTRONICS OF THE AMERICAS PROVIDES THIS SOFTWARE SOLELY 
 *  FOR THE PURPOSE OF SOFTWARE DEVELOPMENT INCORPORATING THE USE OF A 
 *  SHARP MICROCONTROLLER OR SYSTEM-ON-CHIP PRODUCT. USE OF THIS SOURCE 
 *  FILE IMPLIES ACCEPTANCE OF THESE CONDITIONS. 
 * 
 *  COPYRIGHT (c) 2005 SHARP MICROELECTRONICS OF THE AMERICAS 
 *      CAMAS, WA
 * 
 **********************************************************************/

#ifndef ABL_RING_H
#define ABL_RING_H

#include "abl_types.h"

#ifdef __cplusplus
extern "C"
{
#endif

/*********************************************************************** 
 * 1. Ring Buffer Data Structure
 **********************************************************************/

/*
 * Ring buffer structure 
 */
typedef struct RING_S
{
  UNS_32 size;   // buffer size    
  UNS_32 count;  // buffer data count
  UNS_32 wr_pos; // input position
  UNS_32 rd_pos; // output position
  CHAR*  data;   // pointer to data buffer
} RING_T;


/*********************************************************************** 
 * 2. Ring Buffer Operations
 **********************************************************************/

/* 
 * 2.1. Initialize ring buffer.
 */
#define RING_INIT(ring, nbytes)\
{\
    ((RING_T*)ring)->size = (nbytes);\
    ((RING_T*)ring)->count = 0;\
    ((RING_T*)ring)->wr_pos = 0;\
    ((RING_T*)ring)->rd_pos = 0;\
}

/* 
 * 2.2. Drain and reset ring buffer.
 */
#define RING_FLUSH(ring)\
{\
    ((RING_T*)ring)->count = 0;\
    ((RING_T*)ring)->wr_pos = 0;\
    ((RING_T*)ring)->rd_pos = 0;\
}

/* 
 * 2.3. Return the current buffer count.
 */
#define RING_COUNT(ring) ((RING_T*)ring)->count

/* 
 * 2.4. Put a byte into the buffer.
 */
#define RING_PUTC(ring, rdata)\
{\
    ((RING_T*)ring)->count++;\
    ((RING_T*)ring)->data[((RING_T*)ring)->wr_pos++] = (rdata);\
    if (((RING_T*)ring)->wr_pos >= ((RING_T*)ring)->size)\
    {\
        ((RING_T*)ring)->wr_pos = 0;\
    }\
}

/*
 * 2.5. Get a byte from the buffer.
 */
#define RING_GETC(ring, rdata)\
{\
    ((RING_T*)ring)->count--;\
    if (((RING_T*)ring)->rd_pos >= ((RING_T*)ring)->size)\
    {\
        ((RING_T*)ring)->rd_pos = 0;\
    }\
    (rdata) = ((RING_T*)ring)->data[((RING_T*)ring)->rd_pos++];\
} 

/* 
 * 2.6. Put multiple bytes into the buffer.
 * 
 * Note: This define assumes: nbytes <= ring->size - ring->count.
 *
 * Two cases:
 *
 *   1. No wrap:
 *
 *      Ex: size  wr_pos  nbytes 
 *           512     510       2
 *
 *          wr_pos_stop1: 512
 *          wr_pos      : 510,511
 *
 *   2. Wrap:
 *
 *      Ex: size  wr_pos  nbytes
 *           512     510       5
 *
 *          wr_pos_stop1: 512
 *          wr_pos_stop2: 3
 *          wr_pos      : 510,511,0,1,2
 *
 */
#define RING_PUTC_MULTIPLE(ring, buffer, nbytes)\
{\
    UNS_32 wr_pos_stop1;\
    UNS_32 wr_pos_stop2;\
    wr_pos_stop1 = ((RING_T*)ring)->wr_pos + (nbytes);\
    if (wr_pos_stop1 <= ((RING_T*)ring)->size)\
    {\
        while (((RING_T*)ring)->wr_pos < wr_pos_stop1)\
        {\
            ((RING_T*)ring)->data[((RING_T*)ring)->wr_pos++] = *(buffer)++;\
        }\
    }\
    else\
    {\
        wr_pos_stop2 = wr_pos_stop1 - ((RING_T*)ring)->size;\
        wr_pos_stop1 = ((RING_T*)ring)->size;\
        while (((RING_T*)ring)->wr_pos < wr_pos_stop1)\
        {\
            ((RING_T*)ring)->data[((RING_T*)ring)->wr_pos++] = *(buffer)++;\
        }\
        ((RING_T*)ring)->wr_pos = 0;\
        while (((RING_T*)ring)->wr_pos < wr_pos_stop2)\
        {\
            ((RING_T*)ring)->data[((RING_T*)ring)->wr_pos++] = *(buffer)++;\
        }\
    }\
    ((RING_T*)ring)->count += (nbytes);\
}

/* 
 * 2.7. Get multiple bytes from the buffer.
 * 
 * Note: This define assumes: nbytes <= ring->count.
 *
 * Two cases:
 *
 *   1. No wrap:
 *
 *      Ex: size  rd_pos  nbytes 
 *           512     510       2
 *
 *          rd_pos_stop1: 512
 *          rd_pos      : 510,511
 *
 *   2. Wrap:
 *
 *      Ex: size  rd_pos  nbytes
 *           512     510       5
 *
 *          rd_pos_stop1: 512
 *          rd_pos_stop2: 3
 *          rd_pos      : 510,511,0,1,2
 *
 */
#define RING_GETC_MULTIPLE(ring, buffer, nbytes)\
{\
    UNS_32 rd_pos_stop1;\
    UNS_32 rd_pos_stop2;\
    rd_pos_stop1 = ((RING_T*)ring)->rd_pos + (nbytes);\
    if (rd_pos_stop1 <= ((RING_T*)ring)->size)\
    {\
        while (((RING_T*)ring)->rd_pos < rd_pos_stop1)\
        {\
            *(buffer)++ = ((RING_T*)ring)->data[((RING_T*)ring)->rd_pos++];\
        }\
    }\
    else\
    {\
        rd_pos_stop2 = rd_pos_stop1 - ((RING_T*)ring)->size;\
        rd_pos_stop1 = ((RING_T*)ring)->size;\
        while (((RING_T*)ring)->rd_pos < rd_pos_stop1)\
        {\
            *(buffer)++ = ((RING_T*)ring)->data[((RING_T*)ring)->rd_pos++];\
        }\
        ((RING_T*)ring)->rd_pos = 0;\
        while (((RING_T*)ring)->rd_pos < rd_pos_stop2)\
        {\
            *(buffer)++ = ((RING_T*)ring)->data[((RING_T*)ring)->rd_pos++];\
        }\
    }\
    ((RING_T*)ring)->count -= (nbytes);\
}

#ifdef __cplusplus
}
#endif

#endif // ABL_RING_H

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?