`
wx1569484809
  • 浏览: 63771 次
文章分类
社区版块
存档分类
最新评论

c语言实现队列fifo

 
阅读更多

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;
}

 

 

 

 

转载于:https://my.oschina.net/u/3464640/blog/1507169

分享到:
评论

相关推荐

    c语言实现队列功能

    在C语言中,队列是一种线性数据结构,它遵循“先进先出”(FIFO,First In First Out)的原则。队列常被用于数据处理、任务调度等场景,其基本操作包括入队(enqueue)和出队(dequeue)。在给定的“c语言实现队列...

    FIFO_c语言fifo_fifo_

    在实际应用中,C语言实现的FIFO可以广泛应用于各种场景,例如多线程通信中的消息队列、数据缓存管理,或者在硬件接口(如串口通信)的数据传输中。通过自定义大小,可以根据具体需求调整FIFO的存储容量,以优化内存...

    用C语言实现的FIFO虚拟内存页面切换算法

    下面我们将深入探讨FIFO算法及其在C语言中的实现。 FIFO页面替换算法的基本思想是,当物理内存(页框)不足,需要替换页面时,选择最早进入内存的页面进行淘汰。这种算法假设最近使用的页面在未来也最可能被使用,...

    用C语言数组实现的软件FIFO

    本项目利用C语言,通过数组实现了一个软件FIFO,下面将详细阐述这个实现方式及其相关知识点。 1. **FIFO的基本原理**: FIFO数据结构遵循“先进先出”的原则,意味着最早添加到队列中的元素将在所有其他元素之前被...

    C语言实现栈与队列

    本项目是用C语言实现的栈和队列,提供了可加载和使用的源代码,这对于理解这两种数据结构的工作原理以及在C语言中如何实现它们非常有帮助。 首先,让我们详细了解栈和队列的概念: 1. 栈(Stack):栈是一种后进先...

    C语言实现的 通用FIFO 先进先出队列

    一共有三个接口 //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语言代码,我们可以深入探讨队列这一数据结构以及如何在C语言中实现队列的基本操作。队列是一种先进先出(First In First Out, FIFO)的数据结构,这意味着最先加入队列的元素将最先被移除。在计算机科学...

    queue_C语言消息队列_

    在C语言中,实现消息队列通常涉及到操作系统提供的API,如POSIX消息队列或Windows的消息队列API。本节将深入探讨如何使用C语言构建消息队列,以及其在实时消息共享和传输中的应用。 首先,我们需要理解消息队列的...

    windows下面c语言实现的队列

    在Windows操作系统下,C语言是一种常用的编程语言,用于开发系统级程序,如线程调度、消息队列和信号...而"SAMPLE_QUENE"文件则可能提供了关于如何在C语言中实现队列的具体示例,这对于学习和实践这些概念非常有帮助。

    c语言实现基本队列功能

    总的来说,这个项目提供了一个基础的C语言实现队列的例子,它涵盖了队列的基本操作,并考虑了多字节和单字节的处理。这对于学习数据结构和C语言编程是非常有价值的实践。通过理解这个实现,你可以进一步扩展它以适应...

    用C语言实现(块)队列

    本文将详细介绍如何使用C语言实现一个块队列,以及如何通过提供的`queue_dt_init`、`queue_dt_in`和`queue_dt_out`函数来操作这个队列。 队列是一种先进先出(FIFO,First In First Out)的数据结构,它的主要特点...

    队列的C语言实现

    在本教程中,我们将深入探讨如何使用C语言来实现队列。 一、队列的基本概念 队列是一种线性数据结构,其中元素按照特定顺序(FIFO)进行操作。在队列中,新元素在队尾(rear)加入,而旧元素在队头(front)移除。...

    fifo 的C语言实现

    在C语言中,FIFO的实现通常涉及对进程通信的支持,例如使用管道(pipe)或者有名管道(named pipe)。下面将详细探讨FIFO的原理、C语言中的实现以及相关的编程技巧。 首先,理解FIFO的基本概念。FIFO是一种特殊的...

    51单片机串口接收使用队列C语言实现

    本文将深入探讨如何使用C语言实现51单片机的串口接收,并结合队列的数据结构来处理接收到的数据。队列作为一种先进先出(FIFO)的数据结构,非常适合用于串口接收中的数据缓冲,可以有效避免数据丢失和处理冲突。 ...

    C语言实现队列

    总结起来,C语言实现队列主要涉及链表节点的定义、队列结构体的定义以及队列基本操作的实现。通过这种方式,我们可以灵活地在各种场景下使用队列,如任务调度、数据缓冲等。理解并熟练掌握这一基础知识,对于进一步...

    利用C语言实现队列的基本功能

    在本教程中,我们将深入探讨如何使用C语言来实现队列的基本操作,包括创建空队列、插入元素(入队)以及删除元素(出队)。 首先,我们需要定义队列的结构。在C语言中,这通常通过结构体来实现。队列可以由两个指针...

    FIFO.rar_c fifo_fifo_队列fifo

    在给定的"**FIFO.rar_c fifo_fifo_队列fifo**"文件中,我们可以看到两个关键文件:`FIFO.c`和`FIFO.h`,这通常表示一个C语言实现的FIFO队列。下面将详细解释FIFO队列的概念及其在C语言中的实现。 FIFO队列是线性...

    用C语言数组实现的软件FIFO V1.1更新先前的算法

    本篇文章将深入探讨用C语言实现的软件FIFO,并基于标题和描述中的信息,讨论V1.1版本相对于V1.0版本的改进。 首先,C语言是系统级编程的首选语言,它的低级特性使得直接操作内存成为可能,因此非常适合实现FIFO这样...

    C语言环形队列(front rear).zip

    在C语言中实现环形队列,需要理解和掌握以下几个核心概念和技巧: 1. **数据结构基础**:环形队列是线性数据结构队列的一种变体,具有先进先出(FIFO, First In First Out)的特点。在环形队列中,元素存储在一个...

    FIFO实现任意大小队列FIFO

    本项目的目标是用C语言来实现一个可支持任意大小的FIFO队列。在C语言中,我们可以借助数组、链表等数据结构来实现队列。这里我们将讨论如何用C语言构建一个动态调整大小的FIFO队列。 首先,我们需要定义队列的...

Global site tag (gtag.js) - Google Analytics