我已经嵌入了具有结构和相关“机制”的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)。
到目前为止,很容易发现。现在我想回收那个“机器”来处理具有不同静态缓冲区大小(在编译时设置)的多个这样的乒乓结构。缓冲区大小可以存储为管理数据的一部分,结构的管理部分的大小将始终相同。最干净的方法是什么?这是一个非常受内存限制的嵌入式系统,因此创建最大尺寸的缓冲区并且“不使用所有缓冲区”不是解决方案。如果可能的话,也可以避免动态分配(如果它甚至可用于此平台)。
注意,我不想在运行时动态分配或调整任何内容,只能在编译时使用最少量的复制+粘贴代码或其他丑陋来定义不同大小的“pingpongs”。我能想到的一些方法是将buf0 / buf1指针指向已经单独分配的缓冲区(有点难看),或创建单独的缓冲区。 'pingpong2048','pingpong_tiny',...每次使用它们时都会将它们组合成'乒乓球'(也很丑陋),但我想知道是否有更好的方法我不知道是不是。
谢谢!
答案 0 :(得分: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的指针传递给乒乓,检查PingPongMessage的标头以确定消息类型是什么,并使用type1或type2消歧属性访问字段。因此,您没有动态分配更改块大小,您没有分配PingPongMessage并浪费大量空间,但您可以使用PingPongMessage充当该进程的接口。