freeRTOS操作系统机器人实现
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
4.4 KiB

3 days ago
/******************************************************************************
(C), 2018-2099, Radkil_Std
******************************************************************************
: ringbuffer.h
: 稿
: Radkil
: 2023326
:
: ringbuffer.c
:
1. : 2023326
: Radkil
:
******************************************************************************/
/*----------------------------------------------*
* *
*----------------------------------------------*/
/*----------------------------------------------*
* *
*----------------------------------------------*/
/*----------------------------------------------*
* *
*----------------------------------------------*/
/*----------------------------------------------*
* *
*----------------------------------------------*/
/*----------------------------------------------*
* *
*----------------------------------------------*/
/*----------------------------------------------*
* *
*----------------------------------------------*/
/*----------------------------------------------*
* *
*----------------------------------------------*/
#ifndef __RINGBUFFER_H__
#define __RINGBUFFER_H__
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
/*==============================================*
* include header files *
*----------------------------------------------*/
#include <stddef.h>
#include "common.h"
/*==============================================*
* constants or macros define *
*----------------------------------------------*/
typedef struct TRingBuffer rd_ringbuf_t;
struct TRingBuffer
{
unsigned short m_bReadMirror : 1;
unsigned short m_sReadIndex : 15;
unsigned short m_bWriteMirror : 1;
unsigned short m_sWriteIndex : 15;
int m_iBufsize;
char *m_pcBufPtr;
};
enum ERingBufState
{
RINGBUFFER_EMPTY,
RINGBUFFER_FULL,
RINGBUFFER_HALFFULL,
};
int rd_RingbufferDataLen(rd_ringbuf_t *rb);
/**
* @brief Get the buffer size of the ring buffer object.
*
* @param rb A pointer to the ring buffer object.
*
* @return Buffer size.
*/
rd_inline int rd_RingbufferGetSize(rd_ringbuf_t *rb)
{
if(NULL == rb)
{
return -1;
}
return rb->m_iBufsize;
}
rd_inline enum ERingBufState rd_RingbufferStatus(rd_ringbuf_t *rb)
{
if (rb->m_sReadIndex == rb->m_sWriteIndex)
{
if (rb->m_bReadMirror == rb->m_bWriteMirror)
return RINGBUFFER_EMPTY;
else
return RINGBUFFER_FULL;
}
return RINGBUFFER_HALFFULL;
}
/** return the size of empty space in rb */
#define rd_RingbufferSpaceLen(rb) ((rb)->m_iBufsize - rd_RingbufferDataLen(rb))
/*==============================================*
* project-wide global variables *
*----------------------------------------------*/
/*==============================================*
* routines' or functions' implementations *
*----------------------------------------------*/
extern rd_ringbuf_t *rd_RingbufferCreate(int size);
extern int rd_RingbufferDataLen(rd_ringbuf_t *rb);
extern void rd_RingbufferDestroy(rd_ringbuf_t *rb);
extern int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length);
extern int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch);
extern void rd_RingbufferInit(rd_ringbuf_t *rb, char *pool, int size);
extern int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr);
extern int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length);
extern int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch);
extern int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch);
extern int rd_RingbufferPutForce(rd_ringbuf_t *rb, const char *ptr, int length);
extern void rd_RingbufferReset(rd_ringbuf_t *rb);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* __RINGBUFFER_H__ */