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.
 
 
 
 

151 lines
4.4 KiB

/******************************************************************************
版权所有 (C), 2018-2099, Radkil_Std
******************************************************************************
文 件 名 : ringbuffer.h
版 本 号 : 初稿
作 者 : Radkil
生成日期 : 2023年3月26日
最近修改 :
功能描述 : ringbuffer.c 的头文件
修改历史 :
1.日 期 : 2023年3月26日
作 者 : 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__ */