持数组不在RAM中

时间:2013-03-23 02:43:53

标签: c arrays ram

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

以下是我们遇到的问题:

对于我们的动画,我们将它们存储在二维数组中。    如果我们将数组定义为常量

,则会出错

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

编辑:请参阅下面的代码

我希望这张贴在正确的地方 在没有时间(我想?)我正在改变任何阵列,他们都是手动设置一次并且只是循环。我不确定是什么(隐含地?)转换

如果需要,请提供信息:

MSP430G2553 16kB闪存 0.5kB RAM

感谢您的帮助

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

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

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

#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:
     

region`ram'溢出142个字节       collect2:ld返回1退出状态

1 个答案:

答案 0 :(得分:3)

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

除此之外,你使用整数浪费了很多空间。减少记忆的更简单方法:在声明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,但很可能这对内存放置没有影响。