怎么用C在单片机中实现数据的FIFO?

[复制链接]
3694|13
 楼主| fengxu0217 发表于 2008-10-30 08:56 | 显示全部楼层 |阅读模式
99st 发表于 2008-10-30 09:56 | 显示全部楼层

在外围加个FIFO芯片可以不?

Tony.J 发表于 2008-10-30 10:58 | 显示全部楼层

用“尾”追“头”的方法

sodwell 发表于 2008-10-30 11:18 | 显示全部楼层

re

搞个数组环,你追我赶.
 楼主| fengxu0217 发表于 2008-10-30 22:34 | 显示全部楼层

数组环具体怎么来实现呢

 
呆板书生 发表于 2008-10-31 08:44 | 显示全部楼层

去看看数据结构方面的书

Ice_River 发表于 2008-10-31 09:51 | 显示全部楼层

环形缓冲区即可!

uchar data_out(coid)
{
    while (Uart1RingInPtr == Uart1RingOutPtr)        
   { 
   等待延时
     }

    UartRingOutPtr = (UartRingOutPtr + 1) % RING_LEN; 

    return  UartRing[UartRingOutPtr];
}
void data_in(uchar c)
{
     if (((Uart1RingInPtr + 1) % UART_RING_LEN) !=Uart1RingOutPtr) 
    {
        UartRingInPtr = (UartRingInPtr + 1) %RING_LEN;
        UartRxRing[UartRingInPtr] = c;
        }
}
machunshui 发表于 2008-10-31 09:55 | 显示全部楼层

我写的一个

#ifndef _COMMON_DATA_STRUCTRUE
#define _COMMON_DATA_STRUCTRUE

typedef struct _COMMONF_QUE
{
    unsigned char *pBuf;
    unsigned short len;
    unsigned short head;
    unsigned short tail;
    unsigned short maxLen;
}COMMON_QUE2;


void InitCommQue(COMMON_QUE2 *pCommDataStru,unsigned char *ppBuf1,unsigned maxLen1);
unsigned char GetCommQueHdStatus(COMMON_QUE2 *pCommDataStru);
unsigned char GetCommQueTlStatus(COMMON_QUE2 *pCommDataStru);
void RefreshCommQueHead(COMMON_QUE2 *pCommDataStru);
void RefreshCommQueTail(COMMON_QUE2 *pCommDataStru);

#endif












#include "common_data_structure.h"

void InitCommQue(COMMON_QUE2 *pCommDataStru,unsigned char *ppBuf1,unsigned maxLen1)
{
    pCommDataStru ->pBuf = pBuf1;
    pCommDataStru ->maxLen = maxLen1;
}

unsigned char GetCommQueHdStatus(COMMON_QUE2 *pCommDataStru)
{
    if(pCommDataStru ->len < pCommDataStru ->maxLen)
        return 1;
    else
        return 0;
}

unsigned char GetCommQueTlStatus(COMMON_QUE2 *pCommDataStru)
{
    if(pCommDataStru ->len > 0)
        return 1;
    else
        return 0;
}

void RefreshCommQueHead(COMMON_QUE2 *pCommDataStru)
{
    if(pCommDataStru ->head == pCommDataStru ->maxLen -1)
        pCommDataStru ->head = 0;
    else
        pCommDataStru ->head ++;

    pCommDataStru ->len++;
}

void RefreshCommQueTail(COMMON_QUE2 *pCommDataStru)
{
    if(pCommDataStru ->tail == pCommDataStru ->maxLen -1)
        pCommDataStru ->tail = 0;
    else
        pCommDataStru ->tail ++;

    pCommDataStru ->len--;
}

s46410864 发表于 2008-10-31 14:40 | 显示全部楼层

学习

...................
 楼主| fengxu0217 发表于 2008-10-31 15:47 | 显示全部楼层

多谢各位

多谢,问题解决啦,向各位致敬
ayb_ice 发表于 2008-10-31 21:59 | 显示全部楼层

自己写个队列程序即可

linqing171 发表于 2008-11-1 11:43 | 显示全部楼层

7楼的没有关中断

中断和 主程序 相当于是两个线程。
在操作系统中,两个线程操作一个数据的话,需要加锁的。
machunshui 发表于 2008-11-1 12:23 | 显示全部楼层

12楼说得正确,我写的也有问题,加volatile更正

#ifndef _COMMON_DATA_STRUCTRUE
#define _COMMON_DATA_STRUCTRUE

typedef struct _COMMONF_QUE
{
    unsigned char *pBuf;
   volatile unsigned short len;
    unsigned short head;
    unsigned short tail;
    unsigned short maxLen;
}COMMON_QUE2;


void InitCommQue(COMMON_QUE2 *pCommDataStru,unsigned char *ppBuf1,unsigned maxLen1);
unsigned char GetCommQueHdStatus(COMMON_QUE2 *pCommDataStru);
unsigned char GetCommQueTlStatus(COMMON_QUE2 *pCommDataStru);
void RefreshCommQueHead(COMMON_QUE2 *pCommDataStru);
void RefreshCommQueTail(COMMON_QUE2 *pCommDataStru);

#endif












#include "common_data_structure.h"

void InitCommQue(COMMON_QUE2 *pCommDataStru,unsigned char *ppBuf1,unsigned maxLen1)
{
    pCommDataStru ->pBuf = pBuf1;
    pCommDataStru ->maxLen = maxLen1;
}

unsigned char GetCommQueHdStatus(COMMON_QUE2 *pCommDataStru)
{
    if(pCommDataStru ->len < pCommDataStru ->maxLen)
        return 1;
    else
        return 0;
}

unsigned char GetCommQueTlStatus(COMMON_QUE2 *pCommDataStru)
{
    if(pCommDataStru ->len > 0)
        return 1;
    else
        return 0;
}

void RefreshCommQueHead(COMMON_QUE2 *pCommDataStru)
{
    if(pCommDataStru ->head == pCommDataStru ->maxLen -1)
        pCommDataStru ->head = 0;
    else
        pCommDataStru ->head ++;

    pCommDataStru ->len++;
}

void RefreshCommQueTail(COMMON_QUE2 *pCommDataStru)
{
    if(pCommDataStru ->tail == pCommDataStru ->maxLen -1)
        pCommDataStru ->tail = 0;
    else
        pCommDataStru ->tail ++;

    pCommDataStru ->len--;
}
 楼主| fengxu0217 发表于 2008-11-1 22:36 | 显示全部楼层

佩服

     看了各位高手的解答,感到惭愧啊,看来还有很多东西要学习啊,加油……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

70

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部