#10269 output file exceeds code size limit

cmsp430ti-ccstudio

Using Code Composer Studio and MSP430F5438A I get that error when compiling, but if I randomly delete some lines of the code, it will work fine.
The problem is that I have not finished yet and there is more coming!
What can I do?

EDIT:
The whole code is:

#include <msp430.h>
#include "hal_lcd.h"
#include "string.h"
#include "math.h"
char data;
int brcnfg=0, dbcnfg=0, prtycnfg=0, sbcnfg=0, getfile=0,sendfile=0, print=0, index=0,
    srescnfg=0,trescnfg=0, FrameLength=400, MatrixLength=200;

// Function prototypes
void BaudRateConfig(char data);
void DataBitsConfig(char data);
void ParityBitConfig(char data);
void StopBitConfig(char data);
/////////////////////////////////// Flash
char value;                                 // 8-bit value to write to seg C
void write_SegC(char value);
void read_SegC(char data);
void copy_C2D(void);
void erase();
void sqr();
void circ();
unsigned char * Flash_ptr = (unsigned char *) 0x10000;           // Initialize Flash pointer
long size[]={80000,80000,0,0,0,0,0,0,0};                                 // Files sizes
/////////////////////////////////// end Flash
int main(void)
{   WDTCTL = WDTPW | WDTHOLD;                         // Stop watchdog timer
P5SEL |= 0xC0;                                    // P3.4,5 = USCI_A0 TXD/RXD
UCA1CTL1 |= UCSWRST;
UCA1CTL0 |= UCMODE_0;
UCA1CTL1 = UCSSEL_1;                              // CLK = ACLK

UCA1CTL0 |= UC7BIT;                               // 7-bit characters
UCA1CTL0 &= ~UCSPB;                               // 1 StopBits
UCA1BR0 = 0x03;                                   // 32k/9600=3.41
UCA1BR1 = 0x00;                                   //
UCA1MCTL = UCBRS_3+UCBRF_0;                       // Modulation

UCA1CTL1 &= ~UCSWRST;                             // Release USCI state machine
UCA1IE |= UCRXIE;                                 // Enable USCI_A0 RX interrupt

halLcdInit();
halLcdClearScreen();



//   erase();

// Write the Square Path
sqr();

// Write the Circular Path
circ();

Flash_ptr = (unsigned char *) 0x10000;
FCTL3 = FWKEY;                            // Clear Lock bit

FCTL1 = FWKEY+ERASE;                      // Set Erase bit
*(unsigned int *)Flash_ptr = 0;           // Dummy write to erase Flash seg
while(!(WAIT & FCTL3));

FCTL3 = FWKEY+LOCK;                       // Set LOCK bit


__bis_SR_register(LPM0_bits + GIE);
__no_operation();
}

/*
 * main.c
 */

//=====================================================================================
//                          +++  USCI_A0_Interupt  +++
//=====================================================================================
#pragma vector = USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
if(__even_in_range(UCA1IV,18) == 0x02){          // Vector 2 - RXIFG
    data = UCA1RXBUF;
    // check if command
    if (data == '*')            // BaudRate Config.
        brcnfg=1;
    else if (data == '^')       // DataBits Config.
        dbcnfg=1;
    else if (data == '$')       // ParityBit Config.
        prtycnfg=1;
    else if (data == '#')       // StopBit Config.
        sbcnfg=1;
    else if (data == '%' || data == '{'){       // Get File from PC
        getfile=1;
        if(data=='{')
            print=1;
    }
    else if (data == '@'){      // EOF
        while(!(UCA1IFG & UCTXIFG));
        UCA1TXBUF='@';      // Send Acknowledge that the file has been received
        index++;
        getfile=0;   // Exit the file transfer mode
        print=0;
    }
    else if (data=='&'){ // Send File to PC
        sendfile=1;
    }
    else if(data=='<'){ // Finished sending the file to PC
        while(UCA1STAT & 0x01);
        halLcdPrint("PC: The file has been received",'2');
        halLcdScrollRow(1);
    }
    else if(data=='>') // Change square resolution
        srescnfg=1;
    else if(data=='}') // Change time resolution
        trescnfg=1;
    else{       // implement the command or just do echo
        if(brcnfg){            // BaudRate Config.
            while(UCA1STAT & 0x01);
            UCA1TXBUF='*';  // Send Acknowledge to PC
            while(UCA1STAT & 0x01);
            BaudRateConfig(data);
            brcnfg=0;
        }
        else if(dbcnfg){       // DataBit Config.
            while(UCA1STAT & 0x01);
            UCA1TXBUF='^';  // Send Acknowledge to PC
            while(UCA1STAT & 0x01);
            DataBitsConfig(data);
            dbcnfg=0;
        }
        else if(prtycnfg){     // Parity Bit Config.
            while(UCA1STAT & 0x01);
            UCA1TXBUF='$';  // Send Acknowledge to PC
            while(UCA1STAT & 0x01);
            ParityBitConfig(data);
            prtycnfg=0;
        }
        else if(sbcnfg){       // Stop Bit Config.
            while(UCA1STAT & 0x01);
            UCA1TXBUF='#';  // Send Acknowledge to PC
            while(UCA1STAT & 0x01);
            StopBitConfig(data);
            sbcnfg=0;
        }
        else if (getfile){  // Write to Flash
            /*while(!(UCA1IFG & UCTXIFG));
            UCA1TXBUF=data;
            if(print)
                halLcdPrint(data,'2');*/
            while(UCA1STAT & 0x01);    //   ???????
            write_SegC(data);
        }
        else if (sendfile)
            read_SegC(data);
        else if (srescnfg){  // srescnfg=SquareResolutionConfiguration // TEMPORARLY !!!!!!!!!!!!!!!!!!
            MatrixLength=sqrt(FrameLength*FrameLength/data);
            srescnfg=0;
            while(!(UCA1IFG & UCTXIFG));
            UCA1TXBUF='>'; // Send Ack for changing square resolution
        }
        else if (trescnfg){  // trescnfg=TimeResolutionConfiguration


            while(!(UCA1IFG & UCTXIFG));
            UCA1TXBUF='}'; // Send Ack for changing time resolution
        }
        else{
            /*while(UCA1STAT & 0x01);
            halLcdPrintLine("MCU: ",'2');*/    // Chat
            while(!(UCA1IFG & UCTXIFG));
            UCA1TXBUF=data;
        }
    }
}
}
void BaudRateConfig(char data){
if (data=='9'){  // 9600 BaudRate Configurations
    UCA1BR0 = 3;
    UCA1BR1 = 0;
    UCA1MCTL = UCBRS_3+UCBRF_0;
}
else if (data=='4'){  // 4800 BaudRate Configurations
    UCA1BR0 = 6;
    UCA1BR1 = 0;
    UCA1MCTL = UCBRS_7+UCBRF_0;
}
else if (data=='2'){  // 2400 BaudRate Configurations
    UCA1BR0 = 13;
    UCA1BR1 = 0;
    UCA1MCTL = UCBRS_6+UCBRF_0;
}
else if (data=='1'){  // 1200 BaudRate Configurations
    UCA1BR0 = 27;
    UCA1BR1 = 0;
    UCA1MCTL = UCBRS_2+UCBRF_0;
}
}
void DataBitsConfig(char data){
    if(data=='8')
        UCA1CTL0 &= ~UC7BIT;        //8-bit characters
    else if (data=='7')
        UCA1CTL0 |= UC7BIT;         //7-bit characters
}
void ParityBitConfig(char data){
    if(data=='N')
        UCA1CTL0 &= ~UCPEN;                 // Parity Disable
    else if(data=='E')
        UCA1CTL0 |= UCPEN + UCPAR;         // Parity Enable
    else if(data=='O'){
           UCA1CTL0 |= UCPEN;               // Parity Enable
           UCA1CTL0 &= ~UCPAR;
    }
}
void StopBitConfig(char data){
    if(data=='O')
        UCA1CTL0 &= ~UCSPB;             // 1 StopBits
    else if(data=='T')
        UCA1CTL0 |= UCSPB;              // 2 StopBits
}

//------------------------------------------------------------------------------
// Input = value, holds value to write to Seg C
//------------------------------------------------------------------------------
void write_SegC(char value)
{
  //__disable_interrupt();                  // 5xx Workaround: Disable global
                                            // interrupt while erasing. Re-Enable
                                            // GIE if needed

  FCTL3 = FWKEY;                            // Clear Lock bit

  FCTL1 = FWKEY+WRT;                        // Set WRT bit for write operation
  *Flash_ptr++ = data;                      // Write value to flash
  size[index]++;                            // Calculating the file size
  while(!(WAIT & FCTL3));

  FCTL1 = FWKEY;                            // Clear WRT bit
  FCTL3 = FWKEY+LOCK;                       // Set LOCK bit
}

void read_SegC(char data)
{
    char temp=data;
    unsigned char * Flash_ptrTemp;
    // Square Path
    if(temp==0)
    Flash_ptrTemp = (unsigned char *) 0x10000;
// Circular Path
else if(temp==1)
    Flash_ptrTemp = (unsigned char *) 0x23880;
else{
    Flash_ptrTemp = (unsigned char *) 0x27100;
    // Choose the right file to send to PC
    char k='0';
    while(temp!='2'){
        Flash_ptrTemp = Flash_ptrTemp + size[k-48];
        k++;
        temp--;
    }
}
long i;
// Send the file by sending char-by-char
for(i = 0; i < size[data-48]; i++)
{
    while(!(WAIT & FCTL3));
    while(!(UCA1IFG & UCTXIFG));
    UCA1TXBUF=*Flash_ptrTemp++;
    while(!(WAIT & FCTL3));
}
// Stop sending file mode
sendfile=0;
// Send EOF
while(!(UCA1IFG & UCTXIFG));
UCA1TXBUF='&';
}
void erase(){
    while(Flash_ptr < (unsigned char *)0x40000){
    FCTL3 = FWKEY;                            // Clear Lock bit

    FCTL1 = FWKEY+ERASE;                      // Set Erase bit
    *(unsigned int *)Flash_ptr = 0;           // Dummy write to erase Flash seg
    while(!(WAIT & FCTL3));

    FCTL3 = FWKEY+LOCK;                       // Set LOCK bit
    Flash_ptr += 0x200;
    }
    Flash_ptr = (unsigned char *) 0x10000;
}
void sqr(){
    unsigned char counter='0';
    unsigned char sqrMatrix[MatrixLength][2*MatrixLength];
    // First line
    int j;
    for(j=MatrixLength; j>5;j=j-2){
        sqrMatrix[counter][j]='@'; // 64 Decimal
        sqrMatrix[counter][j+1]=counter;
        counter++;
    }
    // Obstacle
    sqrMatrix[counter][5]='A'; // 65 Decimal
    sqrMatrix[counter][6]=counter;
    counter++;
    // Start the second line ;)
for(j=7;counter<255;j=j+2){
    sqrMatrix[counter][j]='@'; // 64 Decimal
    sqrMatrix[counter][j+1]=counter;
    counter++;
}

// The counter has reached 255->start filling also in the MSB bit.
for(j=0; j<MatrixLength;j=j+2){
    unsigned char MSB=counter/255;
    unsigned char LSB=counter%255;
    sqrMatrix[counter][j]='@'+MSB; // 64 Decimal
    sqrMatrix[counter][j+1]=LSB;
    counter++;
}
unsigned char backCount=counter;
// Obstacle
sqrMatrix[backCount][2*MatrixLength/2]='A'; // 65 Decimal
sqrMatrix[backCount][2*MatrixLength/2]=counter;
counter++;
backCount--;
// draw the 3rd line
for(j=(2*MatrixLength/2)+2;j<2*MatrixLength-5;j=j+2){
    unsigned char MSB=counter/255;
    unsigned char LSB=counter%255;
    sqrMatrix[backCount][j]='@'+MSB; // 64 Decimal
    sqrMatrix[backCount][j+1]=LSB;
    counter++;
    backCount--;
}
// Obstacle
sqrMatrix[backCount][2*MatrixLength/2-6]='A'; // 65 Decimal
sqrMatrix[backCount][2*MatrixLength/2-5]=counter;
backCount--;
// draw the last line
for(j=2*MatrixLength-7;j>2*MatrixLength/2;j=j-2){
    unsigned char MSB=counter/255;
    unsigned char LSB=counter%255;
    sqrMatrix[backCount][j]='@'+MSB; // 64 Decimal
    sqrMatrix[backCount][j+1]=LSB;
    counter++;
    backCount--;
}
int i;
for(i=0;i<MatrixLength;i++)
    for(j=0;j<MatrixLength*2;j++)
        write_SegC(sqrMatrix[i][j]);
}
void circ(){

}

Best Answer

Do you use a size restricted version of CCS?

If not, it appears you're running out of flash space on your uC. There are versions of your MSP family which go up to 512kbytes of Flash. Also, you might want to check if you are using large datastructures. I am not that familiar with CCS but I'm quite sure there is some way to see which parts of your program take up that much space (when using GCC the file is called MAP). Look for the largest sized object and try to reduce their size.