CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

out of RAM,,,,,,any advice??

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
ye



Joined: 11 May 2005
Posts: 57
Location: london

View user's profile Send private message

out of RAM,,,,,,any advice??
PostPosted: Wed Jul 06, 2005 4:00 am     Reply with quote

Hi,

I am working on a big project that has a LCD interface as well as a DSP interface. Though I am using 18f8722 which comes with huge in-chip RAM, I am running out of it because of the complication and the huge size of the code.... ( I look at the list file and on top of that it says RAM USED: 89%!!!! )


Can anybody give some advice on how to save some RAM and optimise the code?


Will it work by transferring local variables to global ones or by putting some variables into bank1,2,3 ????


I am just guessing, ,,,,,please give some deatiled methods...


Many thanks
Ttelmah
Guest







PostPosted: Wed Jul 06, 2005 4:22 am     Reply with quote

Manual placement, may sometimes help when trying to put large arrays into memory, but in general doesn't help.
The use of global or local variables, will depend on what you are doing. If (for instance), you have two routines that follow one another in your program sequence, and both use global variables without needing to (the values do not need to be maintained between subsequent calls - achievable by either global, or static variables, and the values do not need to pass to another routine), then using global variables, will _waste_ RAM. If local variables are used, the compiler can re-use this storage in the second routine, but if global variables are used, it is permanently reserved, and will make things worse...
Start by carefully listing what variables do need to be global. Follow this by those that need to be 'static'. Make sure that only variables that need to be global or static, are defined as such. Then see if you can split up functions. If (for instance), you have a single function, that performs three seperate blocks of operations, that do not connect to one another, ad do not need to hand variables to each other, split these into seperate functions, and use local variables in these. If for example, you had code that took a string, printed this, then did some arithmetic on an incoming number, then did some keyboard I/O, storage will be being used by all of these seperately. If the printing was put into one subroutine, then the arithmetic into another, and then the keyboard I/O into a third, the storage areas of each part, can use the same memory areas!...

Best Wishes
ye



Joined: 11 May 2005
Posts: 57
Location: london

View user's profile Send private message

PostPosted: Wed Jul 06, 2005 5:02 am     Reply with quote

Hi, Ttelmah,

First of all, thanks for your detailed explanations!

During the whole development time, I have been modularizing the part of the code so that individual functions don't carry out more than one task but never didn't know this would help save the memory space!! I did it on one function just now for testing and it worked!! But how come when you split up a funciton into pieces they would be sharing the same space? I can't figure out why really!! and Will this increase overhead of function callings?


The list file gives the general RAM usage, i am wondering where i can gain an idea of memory allocation, ie, how much of bank 0(the default bank) has been taken up and how much spare space are there in bank 2,3,4..........................do you think it would help by looking at this bit?



finally, can i end up with the conclusion that using global variables would cost more memory than using local ones?
Ttelmah
Guest







PostPosted: Wed Jul 06, 2005 5:28 am     Reply with quote

There is a 'pool' of memory.
Now if you have a function, that then calls another _inside itself_. then the second function cannot use any part of this pool that is 'in use' by the first, since the first function is still 'live', and expects things to be as they were when the second function returns. However if the two functions occur one after the other, then the second function can use the areas that have been used, and 'finished with' by the first function. Marking a variable as 'static', flags to the compiler, that this variable is never 'finished with', ad cannot be re-used. Marking it as 'global', has a similar effect.

So:
Code:

//Any memory area used for variables here cannot be re-used.

void sub_1() {
   //Any memory area declared for variables here, can be re-used
   //_once_ sub_1 has finished, provided it is not 'static'.
}

void sub_2() {
   //This can use the same memory area as sub_1
}

void sub_3() {
   //This also can use the areas used in sub_1 or sub_2, but _not_
   //in sub_4, because this is caled from sub_4
}

void sub_4() {
   //This can use the areas used in sub_1, and sub_2, but any areas
   //used hre, cannot be used in sub_3
   sub_3();
}
 

main () {
   //Any memory declared for variables here, cannot be re-used
   sub_1();
   sub_2();
   sub_4();
}


The key is to realise that normal variables are strictly 'temporary' storage, and they have a sequence 'life', as well as a physical location. Once sub_1, has completed, any temporary storage locations used (all normally declared variables), are once again available for the compiler to re-allocate.
This is why you have to be careful to declare counters tha you want to 'survive' between subsequent calls, as 'static', or as global variables. However the downside of these declarations is that the space cannot then be re-used... :-(

Best Wishes
ye



Joined: 11 May 2005
Posts: 57
Location: london

View user's profile Send private message

PostPosted: Wed Jul 06, 2005 5:39 am     Reply with quote

Ahha, I got it! This is brilliant. Many thanks mate Very Happy


What I will do is, I would modularize all the possible functions and carefully declare the global and local variables to see what benefits I would end up with( gosh, this would be long!! The code has thousands of lines!! )


I may pop up again if further compression/optimisation is needed

Thanks again mate
piedos



Joined: 14 Mar 2005
Posts: 5
Location: TURKEY/Ankara

View user's profile Send private message Send e-mail ICQ Number

thanks for perfect explanation
PostPosted: Wed Aug 10, 2005 3:16 am     Reply with quote

the sample code is really perfect for beginners

thank you Ttelmah
_________________
---------------------------------------------------------
The only thing that equally given mankind is time.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group