#ifndef __RINGFRAME_H #define __RINGFRAME_H /**@brief A FIFO instance structure. * @details Keeps track of which bytes to read and write next. * Also, it keeps the information about which memory is allocated for the buffer * and its size. This structure must be initialized by app_fifo_init() before use. */ typedef enum { ringframe_size_4 = 0x0004U, ringframe_size_8 = 0x0008U, ringframe_size_16 = 0x0010U, ringframe_size_32 = 0x0020U, ringframe_size_64 = 0x0040U, ringframe_size_128 = 0x0080U, ringframe_size_256 = 0x0100U, ringframe_size_512 = 0x0200U, ringframe_size_1024 = 0x0400U, ringframe_size_2048 = 0x0800U, ringframe_size_4096 = 0x1000U, ringframe_size_8192 = 0x2000U, ringframe_size_16384 = 0x4000U, ringframe_size_32768 = 0x8000U, }ringframe_size_t; typedef struct { volatile unsigned short front; //!< ringframe front index. volatile unsigned short back; //!< ringframe back index. void * p_buffer; //!< Pointer to the memory that is used as storage. ringframe_size_t size; //单位为字节 unsigned short element_count; unsigned short freespace; } ringframe_t; /******************************API 接口*************************************/ #define RINGFRAME_DEF( _name, _size) \ unsigned char _name##_ringframe_buffer[(_size)]; \ ringframe_t _name= \ { \ .front = 0, \ .back = 0, \ .p_buffer = _name##_ringframe_buffer, \ .size = (_size), \ .element_count = 0, \ .freespace = (_size)-1, \ } //返回0表示操作成功,否则失败 unsigned short ringframe_in(ringframe_t * p_ringframe, void * p_data,unsigned char data_size); //返回0表示操作成功,否则失败 unsigned short ringframe_out(ringframe_t * p_ringframe, void * p_data,unsigned char * data_size); void ringframe_reset(ringframe_t * p_ringframe); //返回0表示操作成功,否则失败 unsigned short ringframe_peek(ringframe_t * p_ringframe, void * p_data,unsigned char * data_size); //返回0表示操作成功,否则失败 unsigned short ringframe_throw(ringframe_t * p_ringframe); #endif