降低C中结构的RAM消耗

降低C中结构的RAM消耗,c,embedded,C,Embedded,我目前正在为微控制器开发固件。我在代码中使用以下结构: struct sub { uint16_t a1; uint16_t a2; uint16_t a3; uint16_t a4; uint16_t a5; uint16_t a6; uint16_t a7; uint16_t a8; uint8_t a9; uint8_t a10; }; struct state { struct sub sub1; struct sub sub2; struct sub sub3; struct sub

我目前正在为微控制器开发固件。我在代码中使用以下结构:

struct sub
{
uint16_t a1;
uint16_t a2;
uint16_t a3;
uint16_t a4;
uint16_t a5;
uint16_t a6;
uint16_t a7;
uint16_t a8;
uint8_t a9;
uint8_t a10;
};

struct state
{
struct sub sub1;
struct sub sub2;
struct sub sub3;
struct sub sub4;
};


typedef struct
{
uint16_t c1;
uint16_t c2;
uint16_t c3;
uint16_t c4;
struct state state1;
struct state state2;
struct state state3;
struct state state4;
struct state state5;
struct state state6;
struct state state7;
struct state state8;
} status
因此,层次结构是状态、状态和子状态。 你们中有人看到了减少这种结构所需的RAM大小的可能性吗?目前,如果所有变量未存储在结构中,它需要的空间大约是单个变量所需空间的两倍。

您可以为您的结构使用_属性_压缩,这将更改填充,然后减少结构所需的RAM

编辑:

这并不适用于所有的编译器,但您必须记住的是填充,您可以通过按类型对变量进行排序自然地做到这一点

例:

s_结构1的大小(字节):16


s_structure2的大小(以字节为单位):20

可能取决于微控制器的字对齐结构看看结构打包和填充,这很有帮助,但不会产生奇迹。在我的机器上,sizeofstatus是584。这正是sizeofsub 18*4*8+4*2的结果,因此当前语句所需的空间大约是所有变量(如果未存储在结构中)所需空间的两倍,这是不正确的。计算机上状态的实际大小是多少?所有变量各自需要的两倍空间:如果这是真的,则表明编译器正在生成32位对齐,这可能是真的,也可能不是真的。打包结构的选项取决于编译器/目标。在某些目标上,如果不支持未对齐的访问,打包结构可能会生成额外的访问代码。节省RAM使用通常是高级应用程序设计问题,而不是代码级技巧。例如,每个成员中存储的值的范围是什么?它们需要16位吗?您可以使用位域为例吗?如果不知道使用的具体系统和编译器,就无法回答有关优化的问题。填充为什么会创建一个两倍大的结构还很不明显。这只适用于gcc编译器__attribute__packed可以在多个编译器上工作,不仅仅是GCC,比如keil编译器,我认为通过提及打包的概念并参考GCC或pragma方法来指定它,答案可以很容易地变得更通用。这至少会给搜索引擎提供一些术语来引导人们获取更多信息。正如你在编辑中看到的,我说过填充是需要记住的重要思想
struct s_structure1 {
    int a;
    int b;
    char c;
    char d;
    float e;
}

struct s_structure2 {
    int a;
    char c;
    int b;
    float e;
    char d;
}