gpt4 book ai didi

澄清在 Arduino 中使用结构和在 PROGMEM 中存储结构

转载 作者:太空狗 更新时间:2023-10-29 17:13:38 26 4
gpt4 key购买 nike

(由于大多数 Arduino 板上的可用内存有限,我有时会在使用有效的 C/C++ 代码时遇到问题,所以这个问题专门针对在 Arduino 上使用结构的任何问题。)

我看过 example code of using structs in Arduino但没有讨论内存需求。

  1. 结构的大小是否只是其字段数据类型的总和?
  2. 在 PROGMEM 中存储结构是一个选项吗?是否存在访问速度问题?
  3. 结构的字段是否可写(例如下面的示例 s1.LED1.state = 0;)(当然如果存储在 PROGMEM 中则不可写)。
  4. 我可以将一个结构的字段定义为另一个(不同类型的)结构吗?
  5. 是否可以使用 for..in 或索引遍历结构?

我的用例是我有 64 个由 MAX7219 芯片驱动的 LED。由于物理布线布局的要求,为了使编程更容易/更连贯,使用结构以更逻辑的方式组织 LED 顺序会很方便。


  typedef struct {
byte row : 6;
byte col : 128;
byte state : 1;
} LED;

 typedef struct {
LED LED1 : {1,1,1};
LED LED2 : {1,2,1};
LED LED3 : {1,4,1};
LED LED4 : {1,8,1};
LED LED5 : {1,16,1};
LED LED6 : {1,32,1};
LED LED7 : {1,64,1};
LED LED8 : {1,128,1};
} LED_SECTION;

LED_SECTION s1;
s1.LED1.row = 1;

 s1.LED1.state = 0;

最佳答案

  1. 使用分号语法时,结构的大小将是其所有字段的总和。
  2. 我认为可以使用这种语法:( http://www.arduino.cc/en/Reference/PROGMEM )

    LED leds PROGMEM;
  3. 是的,语法与您在问题中所写的一样。

  4. 是的,您可以:

    typedef struct { struct otherStruct; };

  5. 是的,您可以使用面具来做到这一点。例如:

    for (int i = 0, byte cur = s1 & 1; ; i < numOfFieldsInStruct; i++, cur = (s1<<i)&1) {
    ....
    }

关于您对此答案的最后评论,让我提出以下解决方案:

以寻址它们不会占用内存的方式组织 LED(就像在问题中一样 - LED 结构需要内存来寻址)。相反,您可以使用 LED 在数组和结构中的位置来寻址 LED,如下所示:

typedef struct {
byte LED1 : 1;
byte LED2 : 1;
byte LED3 : 1;
byte LED4 : 1;
byte LED5 : 1;
byte LED6 : 1;
byte LED7 : 1;
byte LED8 : 1;
} LED_ROW;

LED_ROW leds[256];

leds[0].LED1 = 1; // turn led at row 0, col 0 to 1
leds[0].LED5 = 1; // turn led at row 4, col 0 to 1
led[100].LED3 = 1; // turn led at row 2, col 100 to 1
...
// and so on

您可以考虑以不同方式排列数组,结构中有 256 个项目,数组中有 8 个项目,因此行将由 [] 和点后的列引用,如下所示:

leds[0].LED3 = 1; // turn on led at row 0, col 2 to 1

关于澄清在 Arduino 中使用结构和在 PROGMEM 中存储结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16362007/

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