我已经嵌入了带有结构和相关“机器”的 C 代码,用于在中断(填充缓冲区)和用户代码(清空缓冲区)之间实现乒乓缓冲方案。该结构由两个缓冲区和一些管理数据组成,如下所示:
#define PINGPONG_BUF_SIZE 1024
typedef struct
{
volatile unsigned char active_buf; // 0: buf0, 1: buf1
volatile unsigned int idx;
// [...misc. other management data snipped...]
union
{
volatile uint16_t asInt[PINGPONG_BUF_SIZE/2];
volatile char asChar[PINGPONG_BUF_SIZE];
}buf0;
union
{
volatile uint16_t asInt[PINGPONG_BUF_SIZE/2];
volatile char asChar[PINGPONG_BUF_SIZE];
}buf1;
} pingpong;
“机械”由带有指向“乒乓球”的指针的函数组成,例如 pp_write_sample(pingpong * buf, uint16_t data)。
到目前为止很容易。现在我想回收那个“机器”来处理具有不同静态缓冲区大小(在编译时设置)的多个这样的乒乓结构。缓冲区大小可以作为管理数据的一部分存储,并且结构的管理部分的大小将始终相同。最干净的方法是什么?
它适用于内存非常有限的嵌入式系统,因此创建最大大小的缓冲区并且“不使用所有缓冲区”不是解决方案。如果可能的话,避免动态分配也很好(如果它甚至可用于该平台)。
请注意,我对在运行时动态分配或调整任何内容不感兴趣,只能在编译时以最少的复制+粘贴代码或其他丑陋来定义不同大小的“乒乓球”。我能想到的一些方法是使 buf0/buf1 指针指向已单独分配的缓冲区(有点难看),或者创建单独的例如'pingpong2048','pingpong_tiny',......结构并将它们转换为'pingpong'每次使用它们(也很丑),但我想知道是否有更好的方法我不知道邻接。
谢谢!