0

我已经嵌入了带有结构和相关“机器”的 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'每次使用它们(也很丑),但我想知道是否有更好的方法我不知道邻接。

谢谢!

4

1 回答 1

2

我假设这是直接的 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 并将其作为指向 PingPongMessage 的指针传递给 ping-pong,检查 PingPongMessage 的标头以确定消息类型是什么并使用 type1 或 type2 消歧属性来访问字段. 因此,您没有动态分配不断变化的块大小,也没有分配 PingPongMessage 并浪费大量空间,但您可以使用 PingPongMessage 作为进程的接口。

于 2013-04-12T17:07:48.903 回答