gpt4 book ai didi

c - 有效地使用具有不同大小的内部数组的 C 结构?

转载 作者:行者123 更新时间:2023-11-30 14:19:52 25 4
gpt4 key购买 nike

我嵌入了具有结构和关联“机器”的 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,并且类型安全规则相当宽松,没有类开销,等等......

所以...您可以声明不同的结构并给它们一个通用的 header ...

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 的 header 以找出消息类型是什么,并使用 type1 或 type2 消歧属性来访问字段。因此,您不会动态分配不断变化的 block 大小,也不会分配 PingPongMessage 并浪费大量空间,但您可以使用 PingPongMessage 充当该进程的接口(interface)。

关于c - 有效地使用具有不同大小的内部数组的 C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15976974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com