c - Arduino模式数组崩溃



我使用Arduino Uno来控制两个led。目标是能够轻松地创建flash模式(在数组中),并让它们循环播放。

我目前使用这个数组来存储模式:

int patterns[][64][3] = {
  {
    {HIGH, LOW, 500}, 
    {LOW, HIGH, 500},
  },
  {
    {HIGH, LOW, 250}, 
    {LOW, HIGH, 250},
  },
  {
    {HIGH, LOW, 125}, 
    {LOW, HIGH, 125},
  },
  {
    {HIGH, LOW, 250}, 
    {LOW, LOW, 250},
    {HIGH, LOW, 250}, 
    {LOW, LOW, 250},
    {LOW, HIGH, 250}, 
    {LOW, LOW, 250},
    {LOW, HIGH, 250}, 
    {LOW, LOW, 250},
  },
//  {
//    {HIGH, LOW, 125}, 
//    {LOW, LOW, 125},
//    {HIGH, LOW, 125}, 
//    {LOW, LOW, 125},
//    
//    {LOW, HIGH, 125}, 
//    {LOW, LOW, 125},
//    {LOW, HIGH, 125}, 
//    {LOW, LOW, 125},
//  },
};

最后一个模式被注释掉,因为当我添加它时,Arduino不能很好地运行。输出通常看起来像这样:

Using data from EEPROM
CurrentPattern: 0, PatternPosition: 0
CurrentPattern: 0, PatternPosition: 1
CurrentPattern: 0, PatternPosition: 0
CurrentPattern: 0, PatternPosition: 1
CurrentPattern: 0, PatternPosition: 0
CurrentPattern: 0, PatternPosition: 1
CurrentPattern: 0, PatternPosition: 0
CurrentPattern: 0, PatternPosition: 1

现在看起来像这样:

00
00
00
00
00
00
00
01

我想这可能是某种内存问题…但似乎即使我使用像这样的模式数组:

int patterns[][64][3] = {
  {
    {HIGH, LOW, 500}, 
    {LOW, HIGH, 500},
  },
  {
    {HIGH, LOW, 250}, 
    {LOW, HIGH, 250},
  },
  {
    {HIGH, LOW, 125}, 
    {LOW, HIGH, 125},
  },
  {
    {HIGH, LOW, 125}, 
    {LOW, HIGH, 125},
  },
  {
    {HIGH, LOW, 125}, 
    {LOW, HIGH, 125},
  },
};

我也有同样的问题

第一个数组(最后一个模式注释掉)使用4 * 64 * 3 * sizeof(int)字节。假设你有一个16位板,那是1536字节。如果取消最后一个模式的注释,则数组使用5*64*3*2 = 1920字节。另一个数组(在问题末尾附近)也使用1920字节。因此,如果内存是问题,那么两个数组将有相同的问题。

如果你想要减少内存的使用,那么你就需要另一种方式来存储模式。一种解决方案是创建一个2D数组的数组,其中每个2D数组的大小仅为必要的大小。例如,下面是声明为2D数组的五个模式。注意,内存使用只有(3+3+3+9+9) * 3 * 2 = 162字节。

int pattern0[][3] =
{
    {HIGH, LOW, 500},
    {LOW, HIGH, 500},
    {0,      0,   0}
};
int pattern1[][3] =
{
    {HIGH, LOW, 250},
    {LOW, HIGH, 250},
    {0,      0,   0}
};
int pattern2[][3] =
{
    {HIGH, LOW, 125},
    {LOW, HIGH, 125},
    {0,      0,   0}
};
int pattern3[][3] =
{
    {HIGH, LOW, 250},
    {LOW, LOW, 250},
    {HIGH, LOW, 250},
    {LOW, LOW, 250},
    {LOW, HIGH, 250},
    {LOW, LOW, 250},
    {LOW, HIGH, 250},
    {LOW, LOW, 250},
    {0,     0,   0}
};
int pattern4[][3] =
{
    {HIGH, LOW, 125},
    {LOW, LOW, 125},
    {HIGH, LOW, 125},
    {LOW, LOW, 125},
    {LOW, HIGH, 125},
    {LOW, LOW, 125},
    {LOW, HIGH, 125},
    {LOW, LOW, 125},
    {0,     0,   0}
};

由于2D数组的大小不尽相同,因此需要一种方法来识别每个数组的末尾。这可以通过哨兵值来完成。在上面的示例中,我在第三列中使用了值0作为哨兵。

假设arduino编译器足够聪明,可以理解数组指针的数组,您可以将所有2D数组分组为单个数组,如下所示。生成的数组可以像您已经拥有的3D数组一样使用。

int (*patterns[])[3] =
{
    pattern0,
    pattern1,
    pattern2,
    pattern3,
    pattern4,
    NULL
};

下面是一些测试代码,通过打印出串行端口上的模式来证明/反驳数组是否正确设置。

void loop()
{
    int i, j;
    for ( i = 0; patterns[i] != NULL; i++ )
    {
        Serial.print( "Pattern " );
        Serial.println( i + 1 );
        for ( j = 0; patterns[i][j][2] != 0; j++ )
        {
            if ( patterns[i][j][0] == HIGH )
                Serial.print( "HIGH " );
            else
                Serial.print( "LOW  " );
            if ( patterns[i][j][1] == HIGH )
                Serial.print( "HIGH " );
            else
                Serial.print( "LOW  " );
            Serial.println( patterns[i][j][2] );
        }
        Serial.println( "" );
        delay( 500 );
    }
}

最新更新