Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
08/21/05 18:02
Modified:
  08/21/05 18:04

Read: times


 
#99780 - Keil C51-optimization & Pointers
Hi all, I am using Keil uVision 2 IDE with c51 V 7.20 compiler. I am developing a project called Vehicle Info System, which has now grown to almost 7800bytes of hex file from C code. Now the problem is, I use 89S52 which has 8KB of flash, so I stand in the edge of Flash. More sorrow is, I am yet to add some more functionalities, which would obviously increase the code size.

The C51 compiler, when operated at optimization level 9 generates just 5300bytes of codes, but most of my pointers are behaving weirdly. Sometimes, the whole chip gets into a weird loop which just puts garbage in the display.

Optimisation level 1 does the job fine, my code is running properly yet it ends up with 7.8kB of asm. I searched for keil compiler optimization here but dint find something to solve my problem. What is happening? What am I supposed to do?

I suspect the problem is with pointers and accessing methods. My strings are located in the direct 128 byte ram and I am declaring a pointer simply as:

char buf[6]="abcde";
char* ptr=buf;

What should I do? I am putting those erratic string related functions here for your reference:


/*give integer as input get a string as output. 
returned strlen is fixed,=5*/
char* tostr(unsigned int num)
{
	unsigned int base;
	unsigned char rem,x;
	char buff[6];
	char *ptr=buff;
	for(x=4;x>0;--x)
	{
		base=rpt(10,x);
				
		rem=num/base;
		
		*ptr=(char)rem+0x30;
		num-=rem*base;
		ptr++;
	 }
	 *ptr=(char)num+0x30;
	 buff[6]='';
	 return buff;
}


/* function used for generating
10000, 1000, 100, 10 successively
must be used in conjuction with 
tostr function*/
unsigned int rpt(unsigned int x,unsigned char y)
{
	unsigned char i;
	unsigned int temp=1;
	for(i=1;i<=y;i++)
	temp*=x;
	return temp;
}


/*give string as input
string will have 5 charaters
get the string with leading zeros blanked
returned strlen is constant and =5*/
char* rippleinsert(char* str)
{
	unsigned char i=0;
	while((*str==(char)0x30))
	{
		*str=(char)' ';
		str++;i++;
	 }
return(str-i);
} 


/*str= 5 byte wide string given as input
pos=number of positions required from lsb
eg: str=01000, pos=4, returns=1000
eg: str=23456, pos=2, returns=56
same as rippleinsert
but we can specify the string length*/

char* ripplepos(char *str,unsigned char pos)
{
	pos=5-pos;
	while(pos--) str++;
	return str;
}


Had this issue raised here before, I am sorry for the redundancy.

Thanks and Regards,
Vignesh

List of 18 messages in thread
TopicAuthorDate
Keil C51-optimization & Pointers            01/01/70 00:00      
   Bad array index            01/01/70 00:00      
      oops!!            01/01/70 00:00      
         buff[] is auto, not static            01/01/70 00:00      
            Back to basics            01/01/70 00:00      
               Don't shoot the pianist!            01/01/70 00:00      
   Hex file size            01/01/70 00:00      
      Optimization pointers            01/01/70 00:00      
         sprintf() is fairly large            01/01/70 00:00      
         So start a new thread, then!            01/01/70 00:00      
         pls...help            01/01/70 00:00      
            I disagree            01/01/70 00:00      
      My dear Watson !            01/01/70 00:00      
         One size fits all            01/01/70 00:00      
   bin = hex / 2.8            01/01/70 00:00      
      hexmap            01/01/70 00:00      
      A bit of a sweeping generalisation!!            01/01/70 00:00      
   Keil C51-optimization & Pointers            01/01/70 00:00      

Back to Subject List