通过函数调用分配内存给buffer

Allocate memory to buffer through function call

我有一个函数 f(q15_t *x, inst *z) 它有一个输入 x 和一个实例 z:

typedef struct {
q15_t * pbuff;
}inst;

inst z;

我想要一个能够分配内存 space 并将其地址放置到 z.pbuff 的初始化函数,例如(我的努力):

instance_initiator(inst *instance,uint16_t buffSize)
{
q15_t a[buffSize];
instance->pbuff=a;
}

我正在寻找正确的方法来做到这一点,因为我认为在启动器函数完成后,分配的缓冲区 spaces 将会消失,而且我们似乎需要全局变量,而这不可能发生可能是通过使 a 静态化?我希望能够做到这一点。

请注意,初始化将 运行 一次,函数将被调用多次。

正如来自莫斯科的 Vlad 所说 malloc 很好,但我担心这是否会减慢算法?也许一种方法是通过宏设置静态数组的大小a

我找到了一个解决方案,但我不知道是否有人为这个解决方案命名:

#define SIZEOFBUF 500

typedef struct {
q15_t * pbuff;
}inst;

typedef struct {
q15_t buff[SIZEOFBUF];
}instScratch;

inst_initiator(instScratch* scr,inst* z)
{
    inst->pbuff =instScratch->buff
}

void main(void)
{
    static instScratch scr;
    inst z;
    inst_initiator(&inst,&scr);

loop
{
f(x, &z);
}
}

这个解决方案是可行的,因为假定静态变量的大小在编译时已知,如果不是,并且缓冲区的大小仅在 运行 时确定,EZ 解决方案是使用 malloc但是(正如 Lundin 所说)嵌入式禁止动态分配,您可以使用 Lundin 的静态内存池解决方案。

使用 malloc() 分配。测试成功。

// Return error flag
bool instance_initiator(inst *instance, uint16_t buffSize) {
  if (instance == NULL) {
    return true;
  }
  instance->pbuff = malloc(sizeof instance->pbuff[0] * buffSize);
  return instance->pbuff == NULL && buffSize == 0;
}

malloc is good but I feel fear if that is slowing algorithm?

不要害怕。评论 Is premature optimization really the root of all evil?.

如果您仍然觉得 malloc() 很慢,post 代码可以证明这一点。