fifo在嵌入式里面用的相当多,一般用到的通讯如iic, spi, uart,都会有一个fifo。fifo实现起来也比较简单,一般就是用一个数组,设置两个指针,读指针和写指针。相比之前的filo实现不同,这里我把错误标志直接设置在了fifo对象里面,这样也方便在应用中使用多个fifo而不会相互干扰。
main.c
#include <stdio.h>
#include "cfifo.h"
int main(void)
{
struct fifo_t *myfifo = fifo_create(100);
if(myfifo == NULL)
return 0;
int i;
for(i = 0; i < 102; i++){
myfifo->push(myfifo, i);
if(myfifo->is_err(myfifo)){
break;
}
}
myfifo->print(myfifo);
for(i = 0; i < 102; i++){
printf("<%d>: %d\n", i, myfifo->pop(myfifo));
if(myfifo->is_err(myfifo)){
break;
}
}
return 0;
}
cfifo.h
#ifndef CFIFO_H_
#define CFIFO_H_
#define MAX_FIFO_DEPTH 1024u
// fifo object
struct fifo_t {
unsigned int depth; // fifo depth
unsigned int free_size; // fifo free size
int fifo_err; // fifo operation err flag
int *fifo_head; // fifo array head
int *fifo_tail; // fifo array tail
int *phead; // fifo head
int *ptail; // fifo tail
void(*push)(struct fifo_t *p, int num); // push a num to fifo
int(*pop)(struct fifo_t *p); // pop a num from fifo
void(*print)(struct fifo_t *p); // print all num in fifo
unsigned int(*get_free_size)(struct fifo_t *p); // get free size of fifo
int(*is_err)(struct fifo_t *p); // judge fifo err happened or not
};
void fifo_push(struct fifo_t *p, int num);
int fifo_pop(struct fifo_t *p);
unsigned int fifo_get_free_size(struct fifo_t *p);
void fifo_print(struct fifo_t *p);
int fifo_is_err(struct fifo_t *p);
struct fifo_t *fifo_create(unsigned int fifo_depth);
#endif /* CFIFO_H_ */
cfifo.c
#include <stdio.h>
#include <stdlib.h>
#include "cfifo.h"
// push a num to fifo tail
void fifo_push(struct fifo_t *p, int num)
{
if(p->free_size == 0){ // fifo is full
p->fifo_err = -1;
printf("the fifo is full\n");
return ;
}
if(p->ptail == NULL ){ // first num push to fifo
p->ptail = p->fifo_head;
p->phead = p->fifo_head;
}
else if(p->ptail == p->fifo_tail){ // have moved to tail of array
p->ptail = p->fifo_head;
}
else{
p->ptail++;
}
*(p->ptail) = num;
p->free_size--;
p->fifo_err = 0;
}
// pop the fifo head num
int fifo_pop(struct fifo_t *p)
{
if(p->free_size == p->depth){ // fifo is empty
p->fifo_err = -1;
printf("the fifo is empty\n");
return 0;
}
int ret;
ret = *(p->phead);
if(p->phead == p->fifo_tail){ // head moved to tail of array
p->phead = p->fifo_head;
}
else{
p->phead++;
}
p->free_size++;
p->fifo_err = 0;
return ret;
}
unsigned int fifo_get_free_size(struct fifo_t *p)
{
return p->free_size;
}
void fifo_print(struct fifo_t *p)
{
if(p->free_size == p->depth){ // fifo is empty
printf("NULL\n");
p->fifo_err = -1;
return ;
}
int i;
int *ptmp = p->phead;
for(i = 0; i < (p->depth - p->free_size); i++ ){
printf("<%d>: %d\n",i, *ptmp);
if(ptmp == p->fifo_tail){
ptmp = p->fifo_head;
}
else{
ptmp++;
}
}
p->fifo_err = 0;
}
int fifo_isfifoerr(struct fifo_t *p)
{
if(p->fifo_err < 0){
return 1;
}
else{
return 0;
}
}
struct fifo_t *fifo_create(unsigned int fifo_depth)
{
if(fifo_depth <= 0 || fifo_depth > MAX_FIFO_DEPTH){
printf("fifo depth err\n");
return NULL;
}
struct fifo_t *p = (struct fifo_t *)malloc(sizeof(struct fifo_t));
// init fifo element
p->depth = fifo_depth;
p->free_size = fifo_depth;
p->fifo_err = 0;
p->fifo_head = (int *)malloc(sizeof(int) * fifo_depth); // array head
p->fifo_tail = p->fifo_head + fifo_depth - 1; // array tail
p->phead = NULL;
p->ptail = NULL;
p->get_free_size = fifo_get_free_size;
p->pop = fifo_pop;
p->print = fifo_print;
p->push = fifo_push;
p->is_err = fifo_isfifoerr;
return p;
}
相关推荐
在C语言中,队列是一种线性数据结构,它遵循“先进先出”(FIFO,First In First Out)的原则。队列常被用于数据处理、任务调度等场景,其基本操作包括入队(enqueue)和出队(dequeue)。在给定的“c语言实现队列...
在实际应用中,C语言实现的FIFO可以广泛应用于各种场景,例如多线程通信中的消息队列、数据缓存管理,或者在硬件接口(如串口通信)的数据传输中。通过自定义大小,可以根据具体需求调整FIFO的存储容量,以优化内存...
下面我们将深入探讨FIFO算法及其在C语言中的实现。 FIFO页面替换算法的基本思想是,当物理内存(页框)不足,需要替换页面时,选择最早进入内存的页面进行淘汰。这种算法假设最近使用的页面在未来也最可能被使用,...
本项目利用C语言,通过数组实现了一个软件FIFO,下面将详细阐述这个实现方式及其相关知识点。 1. **FIFO的基本原理**: FIFO数据结构遵循“先进先出”的原则,意味着最早添加到队列中的元素将在所有其他元素之前被...
本项目是用C语言实现的栈和队列,提供了可加载和使用的源代码,这对于理解这两种数据结构的工作原理以及在C语言中如何实现它们非常有帮助。 首先,让我们详细了解栈和队列的概念: 1. 栈(Stack):栈是一种后进先...
一共有三个接口 //P_FIFO_T FIFO_Creat(int nNodeMax, int nNodeSize); //void FIFO_Push(P_FIFO_T hFifo, void *pvBuff); //char * FIFO_Pop(P_FIFO_T hFifo); 在下不才,如有不对,请大家评论啊。
根据给定的C语言代码,我们可以深入探讨队列这一数据结构以及如何在C语言中实现队列的基本操作。队列是一种先进先出(First In First Out, FIFO)的数据结构,这意味着最先加入队列的元素将最先被移除。在计算机科学...
在C语言中,实现消息队列通常涉及到操作系统提供的API,如POSIX消息队列或Windows的消息队列API。本节将深入探讨如何使用C语言构建消息队列,以及其在实时消息共享和传输中的应用。 首先,我们需要理解消息队列的...
在Windows操作系统下,C语言是一种常用的编程语言,用于开发系统级程序,如线程调度、消息队列和信号...而"SAMPLE_QUENE"文件则可能提供了关于如何在C语言中实现队列的具体示例,这对于学习和实践这些概念非常有帮助。
总的来说,这个项目提供了一个基础的C语言实现队列的例子,它涵盖了队列的基本操作,并考虑了多字节和单字节的处理。这对于学习数据结构和C语言编程是非常有价值的实践。通过理解这个实现,你可以进一步扩展它以适应...
本文将详细介绍如何使用C语言实现一个块队列,以及如何通过提供的`queue_dt_init`、`queue_dt_in`和`queue_dt_out`函数来操作这个队列。 队列是一种先进先出(FIFO,First In First Out)的数据结构,它的主要特点...
在本教程中,我们将深入探讨如何使用C语言来实现队列。 一、队列的基本概念 队列是一种线性数据结构,其中元素按照特定顺序(FIFO)进行操作。在队列中,新元素在队尾(rear)加入,而旧元素在队头(front)移除。...
在C语言中,FIFO的实现通常涉及对进程通信的支持,例如使用管道(pipe)或者有名管道(named pipe)。下面将详细探讨FIFO的原理、C语言中的实现以及相关的编程技巧。 首先,理解FIFO的基本概念。FIFO是一种特殊的...
本文将深入探讨如何使用C语言实现51单片机的串口接收,并结合队列的数据结构来处理接收到的数据。队列作为一种先进先出(FIFO)的数据结构,非常适合用于串口接收中的数据缓冲,可以有效避免数据丢失和处理冲突。 ...
总结起来,C语言实现队列主要涉及链表节点的定义、队列结构体的定义以及队列基本操作的实现。通过这种方式,我们可以灵活地在各种场景下使用队列,如任务调度、数据缓冲等。理解并熟练掌握这一基础知识,对于进一步...
在本教程中,我们将深入探讨如何使用C语言来实现队列的基本操作,包括创建空队列、插入元素(入队)以及删除元素(出队)。 首先,我们需要定义队列的结构。在C语言中,这通常通过结构体来实现。队列可以由两个指针...
在给定的"**FIFO.rar_c fifo_fifo_队列fifo**"文件中,我们可以看到两个关键文件:`FIFO.c`和`FIFO.h`,这通常表示一个C语言实现的FIFO队列。下面将详细解释FIFO队列的概念及其在C语言中的实现。 FIFO队列是线性...
本篇文章将深入探讨用C语言实现的软件FIFO,并基于标题和描述中的信息,讨论V1.1版本相对于V1.0版本的改进。 首先,C语言是系统级编程的首选语言,它的低级特性使得直接操作内存成为可能,因此非常适合实现FIFO这样...
在C语言中实现环形队列,需要理解和掌握以下几个核心概念和技巧: 1. **数据结构基础**:环形队列是线性数据结构队列的一种变体,具有先进先出(FIFO, First In First Out)的特点。在环形队列中,元素存储在一个...
本项目的目标是用C语言来实现一个可支持任意大小的FIFO队列。在C语言中,我们可以借助数组、链表等数据结构来实现队列。这里我们将讨论如何用C语言构建一个动态调整大小的FIFO队列。 首先,我们需要定义队列的...