2013-05-03 88 views
7

(由于大多数Arduino板卡上的内存有限,我有时会遇到使用有效C/C++代码的问题,所以这个问题特别关注任何问题在使用Arduino上的结构。)澄清在Arduino中使用结构和在PROGMEM中存储结构

我见过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; 
+0

有趣的是,从来没有看到“宽”符号对于结构:)如果'byte'不'LED'在'LED_SECTION':将[]和的cols点后,像这样被refered到结构? – leppie 2013-05-03 15:04:48

+0

另外,128字节的“字节”?这是什么疯狂? – leppie 2013-05-03 15:06:43

+0

@leppie - 是的。复制/粘贴错误。感谢您指出 – 2013-05-03 16:21:19

回答

1
  1. 当使用分号语法,该结构的大小将是的总和它的领域。
  2. 我认为它可能使用此语法:(http://www.arduino.cc/en/Reference/PROGMEM

    LED leds PROGMEM; 
    
  3. 是的,他们是,语法是因为你在你的问题中写道。

  4. 是,您可以:

    typedef结构{ 结构otherStruct; };

  5. 是的,你可以使用口罩来做到这一点。例如:

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

关于你提到的这个答案最后的评论,我提出以下解决方案:

组织的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 
+0

谢谢!一个细节:是在引用struct instance's1'的内存地址的'(s1 << i)&1'中的'&1'?什么是这种类型的操作,所以我可以读它。我理解偏移的部分,只是为了给你的问题提供最好的答案,而不是'&1' – 2013-05-03 23:14:59

+0

,请问你需要什么你需要在led结构中的行和列的定义? – SatA 2013-05-04 07:32:29

+0

在我的项目中,LED由8x8多路复用器芯片(MAXIM7219)控制。为了解决单个LED问题,我需要知道它们的行(例如寄存器1-8)。 7219使用列值地址(1-256)。所以我需要存储至少两个值:寄存器和位掩码。由于我将使用PROGMEM,如果我需要存储状态,我会使用某种动态数组。 – 2013-05-04 12:57:30