我想声明一个可在所有源文件中访问的结构实例。更确切地说,我有一个代表环形缓冲区的结构。我的程序的两个部分可以写入缓冲区,所以我需要以某种方式在源文件之间共享相同的缓冲区实例。这是我的想法,但它不起作用:
在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;
}
}
答案 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
意味着其他文件无法通过名称访问它,但是它们可以调用函数来获取指向变量的指针然后访问它。
似乎我每次写作:
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;
而不分配内存的代码也令人担忧。我无法说出它是否是错的;您没有显示足够的代码或结构的详细定义。
你是如何对环形缓冲区代码进行单元测试的?所有诊断打印语句在哪里告诉您正在正确处理缓冲区?如果您不能或拒绝添加打印代码,您是否在调试器中运行该功能?环形缓冲区的设计到底是什么?