C编程 - 全球见过的实例

时间:2015-03-08 18:48:04

标签: c buffer

我想声明一个可在所有源文件中访问的结构实例。更确切地说,我有一个代表环形缓冲区的结构。我的程序的两个部分可以写入缓冲区,所以我需要以某种方式在源文件之间共享相同的缓冲区实例。这是我的想法,但它不起作用:

在buf.h文件中将buffer的实例声明为extern,并使函数ringBuf_get()返回指向我缓冲区实例的指针。

extern ringBuf buf_frames;
ringBuf *ringBuf_get(void);

所以我会在ringBuf_get()中实现buf.c

ringBuf *ringBuf_get(void)
{
    return &buf_frames;
}

然后每当我想对缓冲区进行一些操作时,我首先会调用ringBuf_get来获取缓冲区的实例,然后我会进行操作。但似乎我做错了什么。随意评论。

bool ringBuf_write(ringBuf *_this, uint8_t *mac_protocol_data_unit, uint8_t length)
{
    if(_this->write->alloc == false)
    {
        _this->write->alloc = true;
        _this->write->len = length;
        memcpy(_this->write->data, mac_protocol_data_unit, length);
        if(_this->write == &_this->buf_pool[MAX_BUF_POOL_SIZE])
            _this->write = &_this->buf_pool[0];
        else
            _this->write++;
        xil_printf("\n\n Write Suceeded! \n\n");
        return true;
    }
    else
    {
        if (ringBuf_full(_this))
        {
           xil_printf("\n\n BUFFER IS FULL! \n\n");
        }
        return false;
    }
}

2 个答案:

答案 0 :(得分:1)

你还没有向我们展示过很多代码,但是这个陈述(或其他人!)会打破一个数组吗?

if(_this->write == &_this->buf_pool[MAX_BUF_POOL_SIZE])

通常,当您定义数组的SIZE时,可以在0..(SIZE-1)范围内对其进行索引。我提出这个问题,因为你的一个问题就是只有4个就可以编写第5个缓冲区。

答案 1 :(得分:1)

标题无需声明

extern ringBuf buf_frames;

该函数已足够 - 最好只公开函数而不是全局变量。实际上,变量应该在定义它的文件中static(并且必须有这样的文件;可能是buf.c)。变量static意味着其他文件无法通过名称访问它,但是它们可以调用函数来获取指向变量的指针然后访问它。

Auxilliary Q& A

  

似乎我每次写作:

ringBuf_write(ringBuf_get(), packet1, 127);
ringBuf_write(ringBuf_get(), packet2, 64);
ringBuf_write(ringBuf_get(), packet1, 127);
     

我通过调用ringBuf_get()获得了一个新实例。因此,我不是移动指针并写入缓冲区中的另一帧,而是写入同一帧。此外,缓冲区不记得我已经分配了,例如,帧0。

然后你需要检查你的问题并解释出现了什么问题,最好是使用MCVE(How to create a Minimal, Complete, and Verifiable Example?)或SSCCE(Short, Self-Contained, Correct Example) - 两个名称和相同基本想法的链接。

您编写了ringBuf_get()函数,每次都返回指向同一数据结构的指针。这可能是正确的,但我不清楚你的意思是通过调用ringBuf_get()'来获得新实例。每次都会获得相同的实例。如果您没有正确更新该实例,或者每次都需要指向其他实例,则需要修复代码。

目前尚不清楚在哪里检查要复制到_this->write->data的内存是否足够小。

此外,尚不清楚_this->buf_pool数组有多大。如果它的大小不是MAX_BUF_POOL_SIZE+1,那么在代码中写出超出边界时会遇到问题:

    if(_this->write == &_this->buf_pool[MAX_BUF_POOL_SIZE])
        _this->write = &_this->buf_pool[0];
    else
        _this->write++;

可以说损坏是在memcpy()之前完成的。设置_this->alloc = true;而不分配内存的代码也令人担忧。我无法说出它是否是错的;您没有显示足够的代码或结构的详细定义。

你是如何对环形缓冲区代码进行单元测试的?所有诊断打印语句在哪里告诉您正在正确处理缓冲区?如果您不能或拒绝添加打印代码,您是否在调试器中运行该功能?环形缓冲区的设计到底是什么?