打印

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

[复制链接]
2594|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

搞个数组环,你追我赶.

使用特权

评论回复
5
fengxu0217|  楼主 | 2008-10-30 22:34 | 只看该作者

数组环具体怎么来实现呢

 

使用特权

评论回复
6
呆板书生| | 2008-10-31 08:44 | 只看该作者

去看看数据结构方面的书

使用特权

评论回复
7
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;
        }
}

使用特权

评论回复
8
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--;
}

使用特权

评论回复
9
s46410864| | 2008-10-31 14:40 | 只看该作者

学习

...................

使用特权

评论回复
10
fengxu0217|  楼主 | 2008-10-31 15:47 | 只看该作者

多谢各位

多谢,问题解决啦,向各位致敬

使用特权

评论回复
11
ayb_ice| | 2008-10-31 21:59 | 只看该作者

自己写个队列程序即可

使用特权

评论回复
12
linqing171| | 2008-11-1 11:43 | 只看该作者

7楼的没有关中断

中断和 主程序 相当于是两个线程。
在操作系统中,两个线程操作一个数据的话,需要加锁的。

使用特权

评论回复
13
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--;
}

使用特权

评论回复
14
fengxu0217|  楼主 | 2008-11-1 22:36 | 只看该作者

佩服

     看了各位高手的解答,感到惭愧啊,看来还有很多东西要学习啊,加油……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

70

帖子

0

粉丝