10

我正在和一些朋友学习(并尝试教授)电子/编程。我们决定使用启动板为我们的任务构建一个 LED 立方体。

这是我们遇到的问题:

对于我们的动画,我们将它们存储在一个二维数组中。如果我们将数组定义为常量,我们会得到错误

我不希望这个数组在 RAM 中,因为我们没有太多可用的。

编辑:代码见下文

我希望这是张贴在正确的地方。
不是时候(我认为?)我是否正在更改任何数组,它们都是手动设置一次并循环播放。我不确定要(隐式?)转换什么

如果需要信息:

MSP430G2553 16kB 闪存 0.5kB RAM

谢谢你的帮助

更新:HansPassant 告诉我为什么会出现这个错误。但我仍然遇到 RAM 溢出(显然它没有存储在闪存中?)

我尝试的另一件事是,我也将其声明为 const,而不是 #define RON (Row ON)。(因此,当创建动画数组时,它是仅使用常量显式创建的)我曾希望将其存储在闪存中。

如果需要,这是完整的代码:

#define povDelay delayMicroseconds(200) // POV Delay

const int CON = LOW;
const int COFF = HIGH;
const int RON = HIGH;
const int ROFF = LOW;

const int col[9] = {P1_0, P1_1, P1_2, P1_3, P1_4, P1_5, P2_0, P2_1, P2_2};
const int row[3] = {P1_6, P1_7, P2_3};

void setup()
{
 // Serial.begin(9600);
  for (int i = 0; i < 9; i++)
  {
    pinMode(col[i], OUTPUT);
    digitalWrite(col[i], COFF);
  }
  for (int i = 0; i < 3; i++)
  {
    pinMode(row[i], OUTPUT);
    digitalWrite(row[i], ROFF);
  }
}

void sideToSide(int delayTime)
{
  int sideDelay = 1000;
  // Left Frame
  const int leftFrame[3][9] = {
     {CON, COFF, COFF, CON, COFF, COFF, CON, COFF, COFF},
     {CON, COFF, COFF, CON, COFF, COFF, CON, COFF, COFF},
     {CON, COFF, COFF, CON, COFF, COFF, CON, COFF, COFF}
   };
  // Middle Frame
  const int middleFrame[3][9] = {
     {COFF, CON, COFF, COFF, CON, COFF, COFF, CON, COFF},
     {COFF, CON, COFF, COFF, CON, COFF, COFF, CON, COFF},
     {COFF, CON, COFF, COFF, CON, COFF, COFF, CON, COFF}
    };
  // Right Frame
  const int rightFrame[3][9] = {
     {COFF, COFF, CON, COFF, COFF, CON, COFF, COFF, CON},
     {COFF, COFF, CON, COFF, COFF, CON, COFF, COFF, CON},
     {COFF, COFF, CON, COFF, COFF, CON, COFF, COFF, CON}
   };




  // Display this animation 3 times (Frame 1, Frame 2, Frame 3, Frame 2)
  for (int i = 0; i < 4; i++)
  {
    displayFrame(leftFrame, delayTime);
    displayFrame(middleFrame, delayTime);
    displayFrame(rightFrame, delayTime);
    displayFrame(middleFrame, delayTime);
  }
  // Last animation
  displayFrame(leftFrame, delayTime);



} // ############ END SIDE TO SIDE

void frontToBack(int delayTime)
{
    // Left Frame
  const int frontFrame[3][9] = {
     {CON, CON, CON, COFF, COFF, COFF, COFF, COFF, COFF},
     {CON, CON, CON, COFF, COFF, COFF, COFF, COFF, COFF},
     {CON, CON, CON, COFF, COFF, COFF, COFF, COFF, COFF}
   };
  // Middle Frame
  const int middleFrame[3][9] = {
     {COFF, COFF, COFF, CON, CON, CON, COFF, COFF, COFF},
     {COFF, COFF, COFF, CON, CON, CON, COFF, COFF, COFF},
     {COFF, COFF, COFF, CON, CON, CON, COFF, COFF, COFF}
    };
  // Right Frame
  const int backFrame[3][9] = {
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, CON, CON},
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, CON, CON},
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, CON, CON}
   };




  // Display this animation 3 times (Frame 1, Frame 2, Frame 3, Frame 2)
  for (int i = 0; i < 4; i++)
  {
    displayFrame(frontFrame, delayTime);
    displayFrame(middleFrame, delayTime);
    displayFrame(backFrame, delayTime);
    displayFrame(middleFrame, delayTime);
  }
  // Last animation
  displayFrame(frontFrame, delayTime);


}  // ############# END FRONT TO BACK


void diagFunctionOne(int delayTime)
{
  const int firstFrame[3][9] = {
     {CON, COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF},
     {CON, COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF},
     {CON, COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF}
  };
  const int secondFrame[3][9] = {
     {COFF, CON, COFF, CON, COFF, COFF, COFF, COFF, COFF},
     {COFF, CON, COFF, CON, COFF, COFF, COFF, COFF, COFF},
     {COFF, CON, COFF, CON, COFF, COFF, COFF, COFF, COFF}
  };
  const int thirdFrame[3][9] = {
     {COFF, COFF, CON, COFF, CON, COFF, CON, COFF, COFF},
     {COFF, COFF, CON, COFF, CON, COFF, CON, COFF, COFF},
     {COFF, COFF, CON, COFF, CON, COFF, CON, COFF, COFF}
  };
  const int forthFrame[3][9] = {
     {COFF, COFF, COFF, COFF, COFF, CON, COFF, CON, COFF},
     {COFF, COFF, COFF, COFF, COFF, CON, COFF, CON, COFF},
     {COFF, COFF, COFF, COFF, COFF, CON, COFF, CON, COFF}
  };
  const int fifthFrame[3][9] = {
     {COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF, CON},
     {COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF, CON},
     {COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF, CON}
  };
  // Start from 7
  const int sixthFrame[3][9] = {
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, COFF, COFF},
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, COFF, COFF},
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, COFF, COFF}
  };
  const int seventhFrame[3][9] = {
     {COFF, COFF, COFF, CON, COFF, COFF, COFF, CON, COFF},
     {COFF, COFF, COFF, CON, COFF, COFF, COFF, CON, COFF},
     {COFF, COFF, COFF, CON, COFF, COFF, COFF, CON, COFF}
  };
  const int eighthFrame[3][9] = {
     {CON, COFF, COFF, COFF, CON, COFF, COFF, COFF, CON},
     {CON, COFF, COFF, COFF, CON, COFF, COFF, COFF, CON},
     {CON, COFF, COFF, COFF, CON, COFF, COFF, COFF, CON}
  };
  const int ninthFrame[3][9] = {
     {COFF, CON, COFF, COFF, COFF, CON, COFF, COFF, COFF},
     {COFF, CON, COFF, COFF, COFF, CON, COFF, COFF, COFF},
     {COFF, CON, COFF, COFF, COFF, CON, COFF, COFF, COFF}
  };
  const int tenthFrame[3][9] = {
     {COFF, COFF, CON, COFF, COFF, COFF, COFF, COFF, COFF},
     {COFF, COFF, CON, COFF, COFF, COFF, COFF, COFF, COFF},
     {COFF, COFF, CON, COFF, COFF, COFF, COFF, COFF, COFF}
  };

    for (int i = 0; i < 4; i++)
  {
    displayFrame(firstFrame, delayTime);
    displayFrame(secondFrame, delayTime);
    displayFrame(thirdFrame, delayTime);
    displayFrame(forthFrame, delayTime);
    displayFrame(fifthFrame, delayTime);
    displayFrame(sixthFrame, delayTime);
    displayFrame(seventhFrame, delayTime);
    displayFrame(eighthFrame, delayTime);
    displayFrame(ninthFrame, delayTime);
    displayFrame(tenthFrame, delayTime);
  }
}



/*

#####################################################
#####################################################
#####################################################
######################################################
#######################################################


*/






// Takes a frame and displays it for the length of animation delay (in ms)
void displayFrame(const int frame[3][9], int animationDelay)
{
 // Serial.println("displayFrame called");
 unsigned long currentTime = millis();

 while (1) // Do this continually until animationDelay is met
 {
 int i, j;
 // Rows
 for (i = 0; i < 3; i++)
 {
   // Turn correct ROW on
   digitalWrite(row[i], RON);

   // Columns
   for (j = 0; j < 9; j++)
   {
     // Turn correct COLUMNS on
     digitalWrite(col[j], frame[i][j]);

   } // End J loop

   povDelay;
   digitalWrite(row[i], ROFF);

 } // End I Loop

 if ((millis() - currentTime) >= animationDelay)
 {
   delay(10);
   // Cleanup, Turn all OFF
  for (int i = 0; i < 9; i++)
    {
      digitalWrite(col[i], COFF);
    }
    for (int i = 0; i < 3; i++)
    {
      digitalWrite(row[i], ROFF);
    }

   delay(10); // timefix?

   return;

 } // End time test if statement

 }


}


void loop()
{
  diag(350);
  sideToSide(350);
  frontToBack(350);


//  for (int i = 0; i < 9; i++)
//  {
//    digitalWrite(col[i], CON);
//  }
//  for (int i = 0; i < 3; i++)
//  {
//    digitalWrite(row[i], RON);
//    delay(250);
//    digitalWrite(row[i], ROFF);
//  }

}

并且存在的错误:

c:/users/dan/appdata/local/energi~1/hardware/tools/msp430/bin/../lib/gcc/msp430/4.6.3/../../../../msp430/bin/ld.exe:

区域“ram”溢出 142 个字节 collect2:ld 返回 1 个退出状态

4

1 回答 1

3

不确定这会有所帮助,但您可以指定要使用的内存区域,请参阅文档

除此之外,您使用整数会浪费很多空间。减少内存的更简单方法:const int frontFrame[3][9]const BYTE frontFrame[3][9]声明typedef unsigned char BYTE.

如果您使用位来表示位,您可以节省更多:

#define ON(b) (1 << b)

const int frontFrame[3] = {
     {ON(8) | ON(7) | ON(6)},
     {ON(8) | ON(7) | ON(6)},
     {ON(8) | ON(7) | ON(6)}
};

您将使用(在 displayFrame 中)测试一下

for (int r = 0; r < ROWS_NUM; ++r)
  for (int c = 0; c < COLS_NUM; ++c)
    if (frame[r] & ON(c)) { ... }

我也会尝试static在数据声明之前添加,但很可能这对内存放置没有影响。

于 2013-03-23T07:06:16.420 回答