【问题标题】:Efficiently using C structures with internal arrays of different sizes?有效地使用具有不同大小内部数组的 C 结构?
【发布时间】:2013-04-12 16:59:59
【问题描述】:

我已经嵌入了带有结构和相关“机制”的 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 数据)。

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

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

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

谢谢!

【问题讨论】:

    标签: c arrays static struct size


    【解决方案1】:

    我假设这是直接 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 作为进程的接口。

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多