有效地使用具有不同大小的内部阵列的C结构?

有效地使用具有不同大小的内部阵列的C结构?,c,arrays,static,struct,size,C,Arrays,Static,Struct,Size,我已经嵌入了C代码,其结构和相关的“机制”用于在和中断(填充缓冲区)和用户代码(清空缓冲区)之间实现乒乓缓冲方案。结构由两个缓冲区和一点管理数据组成,如下所示: #define PINGPONG_BUF_SIZE 1024 typedef struct { volatile unsigned char active_buf; // 0: buf0, 1: buf1 volatile unsigned int idx; // [...misc. other man

我已经嵌入了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_样本(乒乓球*buf,uint16_t数据)

到目前为止很容易。现在我想循环使用这些“机器”来处理多个具有不同静态缓冲区大小(在编译时设置)的乒乓球结构。缓冲区大小可以作为管理数据的一部分存储,并且结构的管理部分的大小将始终相同。最干净的方法是什么

它适用于内存非常有限的嵌入式系统,因此创建最大大小的缓冲区并且“不使用所有缓冲区”不是一个解决方案。如果可能的话,避免动态分配也是很好的(如果这个平台可以使用的话)

注意,我对在运行时动态分配或调整大小不感兴趣,只能够在编译时用最少的复制+粘贴代码或其他丑陋的东西定义不同大小的“乒乓球”。我能想到的一些方法是使buf0/buf1指针指向单独分配的缓冲区(有点难看),或者创建单独的缓冲区,例如“pingpong2048”、“pingpong_tiny”。。。每次使用它们时,都会构造并将它们投射到“乒乓球”中(也很难看),但我想知道是否有更好的方法我不知道


谢谢

我认为这是直C,类型安全规则相当宽松,没有类开销,等等

所以。。。您可以声明不同的结构并给它们一个公共头

struct ManagementHeader 
{ 
    ... 
};
然后声明不同的消息类型

struct MessageType1
{ 
    ManagementHeader header; 
    SomeData body;
}

struct MessageType2
{
    ManagementHeader header;
    SomeOtherData body;
}

union PingPongMessage
{
    ManagementHeader header;
    MessageType1     type1;
    MessageType2     type2;
}
现在,您可以分配消息类型1或消息类型2,并将其作为指向乒乓消息的指针传递到乒乓球中,检查乒乓消息的标头以确定消息类型,并使用类型1或类型2消歧属性访问字段。因此,您不会动态分配更改的块大小,也不会分配乒乓消息并浪费大量空间,但您可以使用乒乓消息作为进程的接口