| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- /******************************************************************************
- 版权所有:
- 文件名称: rt_fifo.c
- 文件版本: 01.01
- 创建作者:
- 创建日期:
- 功能说明: 实时FIFO,采用免锁算法,只支持单进单出。
- 其它说明:
- 修改记录:
- */
- /*------------------------------- 头文件 --------------------------------------
- */
- #include "rt.h"
- #include "rt_fifo.h"
- /*------------------------------- 宏定义 --------------------------------------
- */
- /*------------------------------ 类型结构 -------------------------------------
- */
- /*------------------------------ 全局变量 -------------------------------------
- */
- /*------------------------------ 函数声明 -------------------------------------
- */
- /*------------------------------ 外部函数 -------------------------------------
- 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
- */
- /******************************************************************************
- 函数名称: rt_fifo_init
- 函数版本: 01.01
- 创建作者: sunxi
- 创建日期: 2020-06-18
- 函数说明: rt_fifo初始化
- 参数说明:
- fifo: 要初始化的rt_fifo结构的指针
- buffer 需要和fifo相连接的buffer
- size buffer的大小,必须是2的n次方
- 返回值:
- 0: 成功
- 其它: 失败
- 修改记录:
- */
- int rt_fifo_init(struct rt_fifo *fifo, unsigned char *buffer, unsigned int size)
- {
- // size 必须是2的n次方
- if(!is_power_of_2(size) && buffer == NULL)
- {
- fifo->buffer = 0;
- fifo->size = 0;
- fifo->in = fifo->out = 0;
-
- return -1;
- }
- fifo->buffer = buffer;
- fifo->size = size;
- fifo->in = fifo->out = 0;
- return 0;
- }
- /******************************************************************************
- 函数名称: rt_fifo_get
- 函数版本: 01.01
- 创建作者: sunxi
- 创建日期: 2020-06-18
- 函数说明: 从fifo中读出数据
- 参数说明:
- fifo: rt_fifo结构的指针
- buffer 读出buffer的指针
- len 读出buffer的大小
- 返回值: 读出数据的长度
- 修改记录:
- */
- unsigned int rt_fifo_get(struct rt_fifo *fifo,unsigned char *buffer, unsigned int len)
- {
- unsigned int l;
- // 得到需要读出的数据长度
- len = min(len, fifo->in - fifo->out);
- // 处理buffer尾部环绕问题
- // 读尾部数据
- l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
- memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l);
- // 读头部数据
- memcpy(buffer + l, fifo->buffer, len - l);
- // 修正出偏移
- fifo->out += len;
- return len;
- }
- /******************************************************************************
- 函数名称: rt_fifo_put
- 函数版本: 01.01
- 创建作者: sunxi
- 创建日期: 2020-06-18
- 函数说明: 往fifo中写入数据
- 参数说明:
- fifo: rt_fifo结构的指针
- buffer 写入buffer的指针
- len 写入buffer的大小
- 返回值: 写入数据的长度
- 修改记录:
- */
- unsigned int rt_fifo_put(struct rt_fifo *fifo,unsigned char *buffer, unsigned int len)
- {
- unsigned int l;
- // 得到需要写入的数据长度
- len = min(len, fifo->size - fifo->in + fifo->out);
- // 处理buffer尾部环绕问题
- // 写尾部数据
- l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
- memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
- //写头部数据
- memcpy(fifo->buffer, buffer + l, len - l);
- // 修正进偏移
- fifo->in += len;
- return len;
- }
- /*------------------------------ 内部函数 -------------------------------------
- 内部函数以下划线‘_’开头,不需要检查参数的合法性.
- */
- /*------------------------------ 测试函数 -------------------------------------
- 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
- 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
- */
- /*------------------------------ 文件结束 -------------------------------------
- */
|