新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機的FIFO(先入先出)循環隊列實現

        單片機的FIFO(先入先出)循環隊列實現

        作者: 時間:2016-11-28 來源:網絡 收藏
        //////////////////////////////////////////////////////////
        // 文件:config.h
        //////////////////////////////////////////////////////////
        #ifndef __CONFIG_H
        #define __CONFIG_H
        //這一段無需改動
        //This segmentshould not be modified
        #ifndef TRUE
        #define TRUE1
        #endif
        #ifndef FALSE
        #define FALSE 0
        #endif
        typedef unsigned charuint8;
        typedef signedcharint8;
        typedef unsigned short uint16;
        typedef signedshort int16;
        typedef unsigned intuint32;
        typedef signedintint32;
        typedef floatfp32;

        #i nclude "FIFOQUEUE.h"
        #endif
        //////////////////////////////////////////////////////////
        // 文件:FIFOQUEUE.h
        //////////////////////////////////////////////////////////
        #ifndef _FIFOQUEUE_H
        #define _FIFOQUEUE_H
        #define ElemTypeuint8
        #define QueueSize20 //fifo隊列的大小
        #define QueueFull0 //fifo滿置0
        #define QueueEmpty1 //FIFO空置1
        #define QueueOperateOk 2 //隊列操作完成 賦值為2
        struct FifoQueue
        {
        uint16 front; //隊列頭
        uint16 rear; //隊列尾
        uint16 count; //隊列計數
        ElemType dat[QueueSize];
        };
        //Queue Initalize
        extern void QueueInit(struct FifoQueue *Queue);
        // Queue In
        extern uint8 QueueIn(struct FifoQueue *Queue,ElemType sdat);
        // Queue Out
        extern uint8 QueueOut(struct FifoQueue *Queue,ElemType *sdat);
        #endif
        //////////////////////////////////////////////////////////
        // 文件:FIFOQUEUE.C
        //////////////////////////////////////////////////////////
        #i nclude "config.h"
        //Queue Init
        void QueueInit(struct FifoQueue *Queue)
        {
        Queue->front = Queue->rear;//初始化時隊列頭隊列首相連
        Queue->count = 0; //隊列計數為0
        }
        // Queue In
        uint8 QueueIn(struct FifoQueue *Queue,ElemType sdat) //數據進入隊列
        {
        if((Queue->front == Queue->rear) && (Queue->count == QueueSize))
        {// full //判斷如果隊列滿了
        return QueueFull; //返回隊列滿的標志
        }else
        {// in
        Queue->dat[Queue->rear] = sdat;
        Queue->rear = (Queue->rear + 1) % QueueSize;
        Queue->count = Queue->count + 1;
        return QueueOperateOk;
        }
        }
        // Queue Out
        uint8 QueueOut(struct FifoQueue *Queue,ElemType *sdat)
        {
        if((Queue->front == Queue->rear) && (Queue->count == 0))
        {// empty
        return QueueEmpty;
        }else
        {// out
        *sdat = Queue->dat[Queue->front];
        Queue->front = (Queue->front + 1) % QueueSize;
        Queue->count = Queue->count - 1;
        return QueueOperateOk;
        }
        }
        //////////////////////////////////////////////////////////
        // 文件:Main.C
        //////////////////////////////////////////////////////////
        #i nclude
        #i nclude "config.h"
        void main(void)
        {
        struct FifoQueue MyQueue;
        ElemType sh;
        uint8 i;
        QueueInit(&MyQueue);
        while(1)
        {
        for(i = 0;i < 30;i++)
        {
        if(QueueIn(&MyQueue,i) == QueueFull) break;
        }
        for(i = 0;i < 30;i++)
        {
        if(QueueOut(&MyQueue,&sh) == QueueEmpty) break;
        }
        }
        while(1);
        }

        隊列是一種先進先出(first infirst out,縮寫為FIFO)的線性表。它只允許在標的一端進行插入,而在另一端刪除元素。這和我們日常生活中的排隊是一致的,最早進入隊列的元素最早離開。在隊列中,允許插入的一端叫做隊尾(rear),允許刪除的一端則稱為對頭(front)(排隊買票,窗口一端叫對頭,末尾進隊叫隊尾)。


        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 麻城市| 巴林左旗| 肇州县| 仪征市| 武威市| 义马市| 保德县| 楚雄市| 闽清县| 华池县| 农安县| 邵武市| 兴仁县| 望城县| 碌曲县| 收藏| 沧州市| 隆化县| 久治县| 米林县| 康定县| 宜昌市| 安陆市| 上蔡县| 盐城市| 临西县| 农安县| 宣汉县| 诸城市| 焉耆| 黄龙县| 天峨县| 福建省| 洱源县| 连江县| 都江堰市| 碌曲县| 东至县| 聊城市| 龙门县| 东港市|