搜索
bottom↓
回复: 12

如何用C语言实现一个1024点的单向循环链表,相当于FIFO

[复制链接]

出0入0汤圆

发表于 2009-9-3 15:33:14 | 显示全部楼层 |阅读模式
由于是中断中实现,所以要求简洁。
本来我用一个个移动的方式可以实现,但是时间太长了,超过了下次中断的时间。
谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-9-3 15:44:11 | 显示全部楼层
struct {
data date;
structpoint next;

加上个指针 即可

出0入0汤圆

 楼主| 发表于 2009-9-3 17:02:29 | 显示全部楼层
谢谢楼上的
正在看书
不知道还要不要用malloc()开辟一段内存?

出0入0汤圆

发表于 2009-9-3 17:07:10 | 显示全部楼层
直接用一个数组,两个指针,一个指首端,一个指尾端

出0入0汤圆

发表于 2009-9-3 18:33:44 | 显示全部楼层
像3楼的所说,注意队列空和满的判断。
我记得以前发过一个例子。

出0入0汤圆

发表于 2009-9-3 19:04:54 | 显示全部楼层
直接用一个数组,更省空间,速度更快

出0入0汤圆

发表于 2009-9-3 22:00:49 | 显示全部楼层
google一下“ring buffer”

出0入0汤圆

发表于 2009-9-6 10:22:52 | 显示全部楼层
楼主要实现的就是好循环队列,我这里有个程序,你可以看看。
点击此处下载 ourdev_478343.rar(文件大小:1K) (原文件名:CQueue.rar)

出0入0汤圆

发表于 2016-9-26 14:44:49 | 显示全部楼层
楼主这个问题解决了么?最近也遇到相同的问题。

出0入0汤圆

发表于 2016-9-26 15:27:10 | 显示全部楼层
/**
* @brief
*
* @param fifo    缓冲区的数据结构
* @param buffer
* @param size    缓冲区的大小
*/
void kfifo_init(struct kfifo *fifo, void *buffer, unsigned int size)
{
    /*housir: 检查时候是2的指数倍 */
    if (size & (size - 1))
    {
        size = roundup_pow_of_two(size);
    }

    fifo->buffer = buffer;
    fifo->size = size;

    fifo->in = fifo->out = 0;
}

/**
* @brief 加入缓冲队列
*
* @param fifo
* @param from
* @param len
*
* @return 实际放入缓冲区的长度(可能小于len或者为0)
*/
unsigned int kfifo_in(struct kfifo *fifo, const void *from, unsigned int len)
{
    unsigned int l, off;

    /*housir: min(大小 - 已经用了的 , len) 计算剩余可用空间 好代码 */
    len = min(fifo->size - (fifo->in - fifo->out), len);
    /*计算索引(0 ... size-1)*/
    off = (fifo->in + 0) & (fifo->size - 1);/*==> (in+0) % size*/
    /*housir: 分成2段,1.当前位置到size-1 2.0到0或者0到len-l(剩余的) */
    l = min(len, fifo->size - off);
    memcpy(fifo->buffer + off, from, l);

    /*housir: 将剩余的copy到buffer,如果len == l则啥也不干,好代码 */
    memcpy(fifo->buffer, (char *) from + l, len - l);

    fifo->in += len;

    return len;
}

/**
* @brief
*
* @param fifo
* @param to
* @param len
*
* @return 实际读出缓冲区的长度(可能小于len,或者为0)
*/
unsigned int kfifo_out(struct kfifo *fifo, void *to, unsigned int len)
{
    unsigned int out, off;
    unsigned int l;
    /*housir:验证len是否大于缓冲区存的值  */
    len = min(fifo->in - fifo->out, len);

    off = (fifo->out + 0) & (fifo->size - 1);/*==> (out+0) % size*/
    /* first get the data from fifo->out until the end of the buffer */
    l = min(len, fifo->size - off);
    memcpy(to, fifo->buffer + off, l);
    /* then get the rest (if any) from the beginning of the buffer */
    memcpy((char *) to + l, fifo->buffer, len - l);

    fifo->out += len;

    return len;
}

出0入0汤圆

发表于 2016-9-26 15:27:39 | 显示全部楼层
#define min(a,b)  ((a)>(b) ? (b) : (a))

#define roundup_pow_of_two(n)   \
    (1UL    <<                             \
        (                                  \
            (                              \
            (n) & (1UL << 31) ? 31 :       \
            (n) & (1UL << 30) ? 30 :       \
            (n) & (1UL << 29) ? 29 :       \
            (n) & (1UL << 28) ? 28 :       \
            (n) & (1UL << 27) ? 27 :       \
            (n) & (1UL << 26) ? 26 :       \
            (n) & (1UL << 25) ? 25 :       \
            (n) & (1UL << 24) ? 24 :       \
            (n) & (1UL << 23) ? 23 :       \
            (n) & (1UL << 22) ? 22 :       \
            (n) & (1UL << 21) ? 21 :       \
            (n) & (1UL << 20) ? 20 :       \
            (n) & (1UL << 19) ? 19 :       \
            (n) & (1UL << 18) ? 18 :       \
            (n) & (1UL << 17) ? 17 :       \
            (n) & (1UL << 16) ? 16 :       \
            (n) & (1UL << 15) ? 15 :       \
            (n) & (1UL << 14) ? 14 :       \
            (n) & (1UL << 13) ? 13 :       \
            (n) & (1UL << 12) ? 12 :       \
            (n) & (1UL << 11) ? 11 :       \
            (n) & (1UL << 10) ? 10 :       \
            (n) & (1UL <<  9) ?  9 :       \
            (n) & (1UL <<  8) ?  8 :       \
            (n) & (1UL <<  7) ?  7 :       \
            (n) & (1UL <<  6) ?  6 :       \
            (n) & (1UL <<  5) ?  5 :       \
            (n) & (1UL <<  4) ?  4 :       \
            (n) & (1UL <<  3) ?  3 :       \
            (n) & (1UL <<  2) ?  2 :       \
            (n) & (1UL <<  1) ?  1 :       \
            (n) & (1UL <<  0) ?  0 : -1    \
            ) + 1                          \
        )                                  \
)

typedef struct kfifo
{
    unsigned char *buffer;/*housir:  the buffer holding the data */
    unsigned int size;/*housir:  the size of the allocated buffer */
    unsigned int in;/*housir:  data is added at offset (in % size) */
    unsigned int out;/*housir:  data is extracted from off. (out % size) */
};

出0入0汤圆

发表于 2016-9-26 15:28:24 | 显示全部楼层
github 提取的一段  一直用 很稳定

出0入0汤圆

发表于 2016-9-26 15:41:44 | 显示全部楼层
4楼方法挺好的,简单实用,单个数据类型的就用这个就行了。程序简单。速度快。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 05:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表