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

时间:2013-05-03 15:02:24

标签: c arduino

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

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

  1. 结构的大小是否只是其字段数据类型的总和?
  2. 在PROGMEM中存储结构是一个选项吗?是否存在访问速度问题?
  3. 结构的字段是否可写(例如s1.LED1.state = 0;下面的示例)(当然,如果存储在PROGMEM中则不存在)。
  4. 我可以将结构的字段定义为另一个(不同类型)结构吗?
  5. 是否可以使用for..in或索引迭代结构?
  6. 我的用例是我有64个LED由MAX7219芯片驱动。由于物理布线布局的要求,使用结构以更合理的方式组织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 个答案:

答案 0 :(得分:1)

  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) {
        ....
    }
    
  6. 关于您对此答案的最后评论,请允许我提出以下解决方案:

    组织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个项目,因此行将由[]和点后面的cols引用,如下所示:

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