/****************************************************************************** 版权所有: 文件名称: 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; } /*------------------------------ 内部函数 ------------------------------------- 内部函数以下划线‘_’开头,不需要检查参数的合法性. */ /*------------------------------ 测试函数 ------------------------------------- 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数). */ /*------------------------------ 文件结束 ------------------------------------- */