This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

auto segment too large

i get the error "main() auto segment too large" for the given program which should be run on atmet 89c51 how to fix it
thanks.........

#include <reg51.h>
void Delay();
char serialsend(char []);

void main ()
{ char z;
char command1[]={"AT+CGATT=1\r"};
char command2[]={"AT+CSTT= \"ufone.pinternet\"\r" };
char command3[]={"AT+CIICR\r"};
char command4[]={"AT+CIFSR\r"};
char command5[]={"AT+CIPSTART=\"TCP\"\"121.52.147.94\"800\r"};
char command6[]={"AT+CIPSEND\r"};
char command7[]={"GPRS is Activated"};
char command8[]={"26"};
TMOD = 0x20;
TH1 = 0xFD;
SCON = 0x50;
TR1 = 1;
serialsend(command1);
Delay();
serialsend(command2);
Delay();
serialsend(command3);
for(z=0; z<3; z++)
{ Delay(); }
serialsend(command4);
Delay();
serialsend(command5);
for(z=0; z<10; z++)
{ Delay();
} serialsend(command6);
for(z=0; z<5; z++)
{ Delay(); }
serialsend(command7);
serialsend(command8);

}
char serialsend(char array[])
{ int i=0;
while(array[i] != '\0')
{ SBUF = array[i];
while(TI == 0);
TI = 0;
i++;
} }

void Delay()
{ unsigned char x;
for(x=0; x<40; x++)
{ TMOD=0x10;
TL1=0xFE;
TH1=0xA5;
TR1=1;
while (TF1==0);
TR1=0;
TF1=0;
} }

Parents
  • Also besides the Timer1 mis-re-initialization
    in the above code the strings (array of chars) must be declared as code segment

    code char command1[]={"AT+CGATT=1\r"};
    


    so that these bytes be stored in code memory that is at leat 4K even for 89C51.
    by the current use compiler is trying to store them in DATA segment that is not
    enough.

    If the system has 256bytes of IRAM then instead of code they could be stored to idata
    if this is convenient.

    There is no need to change to "large model" for this particular reason.

Reply
  • Also besides the Timer1 mis-re-initialization
    in the above code the strings (array of chars) must be declared as code segment

    code char command1[]={"AT+CGATT=1\r"};
    


    so that these bytes be stored in code memory that is at leat 4K even for 89C51.
    by the current use compiler is trying to store them in DATA segment that is not
    enough.

    If the system has 256bytes of IRAM then instead of code they could be stored to idata
    if this is convenient.

    There is no need to change to "large model" for this particular reason.

Children