Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Holding Arrays not in RAM

Tags:

arrays

c

ram

I am learning (and trying to teach) electronics/programming with some friends. We have decided to build a LED cube using a launchpad for our task.

Here's the issue we run into:

For our animations, we store them in a two dimensional array. We get error if we define array as constant

I don't want this array to be in RAM, because we don't have very much available.

EDIT: See below for code

I hope this is posted in the correct place.
At not time (I think?) am I changing any array, they are all set one time by hand and just looped over. I'm unsure of what is trying to be (implicitly?) converted

Info if needed:

MSP430G2553 16kB Flash 0.5kB RAM

Thanks for your help

UPDATE: Well HansPassant told me why that error was showing up. But I still get a RAM overflow (Apparently it isn't being stored in flash?)

Another thing I tried is instead of #define RON (Row ON) I declared it as const too. (so when an animation array was created, it was created explicitly with only constants) I had hoped that would store it in flash.

Here's the entirety of code if needed:

#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);
//  }

}

And the error that exists:

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

region `ram' overflowed by 142 bytes collect2: ld returned 1 exit status

like image 838
Dan Avatar asked Mar 23 '13 02:03

Dan


1 Answers

not sure this will help, but to ld you can specifiy the memory area to use, see the docs.

That apart, you're wasting much space for a bit, using an integer. The easier way to reduce memory: change const int frontFrame[3][9] to const BYTE frontFrame[3][9], after declaration of typedef unsigned char BYTE.

You can spare more if you use bits to represent bits:

#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)}
};

and you will test a bit (in displayFrame) using

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

I would also try to add static in front of data declaration, but most probably this would have no effect on memory placement.

like image 151
CapelliC Avatar answered Oct 14 '22 20:10

CapelliC