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 ROM ! [solved]

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



Joined: 08 Sep 2008
Posts: 84

View user's profile Send private message

out of ROM ! [solved]
PostPosted: Wed Sep 23, 2009 2:52 pm     Reply with quote

Hi,

I was out of ROM when I added those two instructions to my program:

Code:

printf("\n\r Buffer full");     
buffer[5]=0;






in the previous compiling, the program used only 65% of the ROM and 22% of RAM. How can two instructions overflow the ROM then ?

is there a limit for the number of lines in the main ?


PICmicro : 16F876
CCS version : PCW 4.057


thanks for any clarification.


Last edited by Salenko on Fri Sep 25, 2009 1:50 pm; edited 2 times in total
Ttelmah
Guest







PostPosted: Wed Sep 23, 2009 2:58 pm     Reply with quote

A search on the forum, would find lots of answers about this.

Not directly a limit on 'main', but a limit on any _single_ block in the program. The 876, has it's ROM organised in pages. Four in all. No one consecutive block of code can be larger than a page. Since the pages are 25% of the actual ROM size, it suggests your code is pretty much one lump, rather than being written in sections, so is all going into one page, and you are running out of space, when effectively, it grows to > 25%.

You need to split your code into subroutines, and flag these as #separate, so the compiler can split the program up.

Best Wishes
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Sep 23, 2009 3:03 pm     Reply with quote

Break up the code in main() into two or more smaller routines, and
call them from main().

By using several routines, instead of one big main(), the compiler can
fit the routines into the available ROM space in the PIC. The 16F876
has 4 ROM pages that can each hold 2K words. A routine (a function) can
not be larger than 1 ROM page. That's a requirement of the CCS
compiler. So, the solution is to break up your main() into smaller
routines, and let the compiler put them into the available ROM pages.

--
Edit:
Ttelmah, you are fast on the draw today. Beat me by 5 minutes.
rnielsen



Joined: 23 Sep 2003
Posts: 852
Location: Utah

View user's profile Send private message

PostPosted: Wed Sep 23, 2009 3:31 pm     Reply with quote

Just to add another perspective:

The memory, in each PIC, is organized like a blank book with dividers already placed in it. You can write whatever you want into each section but once that section is full you must start writing in another section. One problem is that you can't simply carry over into the next section. If the topic, that you are writing about, won't fit into the section that you've been writing to then you have to start writing into a different section.

If a function, or main(), is too large to fit into one bank(section) then it must be split up into smaller portions so they can fit somewhere. The functions cannot bleed over the physical bounderies of the memory bank.

Ronald
Guest








PostPosted: Wed Sep 23, 2009 7:18 pm     Reply with quote

What does #separate ACTUALLY guarantee -
If your program is already broken up into sub functions - from the get go ?

How does it exactly help ?
SherpaDoug



Joined: 07 Sep 2003
Posts: 1640
Location: Cape Cod Mass USA

View user's profile Send private message

PostPosted: Wed Sep 23, 2009 8:30 pm     Reply with quote

If a function is only called once the compiler will try to optimize things by converting it from a subroutine to inline code. A subroutine call can cross page boundaries but the inline code can't, so this defeats the purpose of splitting the code into parts to use multiple pages. The #separate directive prevents the compiler from inlineing the code.
_________________
The search for better is endless. Instead simply find very good and get the job done.
Salenko



Joined: 08 Sep 2008
Posts: 84

View user's profile Send private message

PostPosted: Fri Sep 25, 2009 11:04 am     Reply with quote

thank you all the participants of this thread, thank you Ttelamh and PCM for being part of this forum.

I understood and did what you recommend me. I broke up the main() into five procedures and called them, but the error remains (OUT OF MAIN). So I put #separate before the two longest procedures and compiled without warnings with 64% of ROM used.

a question pops into my mind : can I use #separate as much as I like ?


with all my respect.
Ttelmah
Guest







PostPosted: Fri Sep 25, 2009 2:39 pm     Reply with quote

The keyword is in SherpaDoug's reply _optimise_. It takes slightly more space, and time, to call a routine that is actually 'separate', than the same code 'embedded' as an 'inline block inside an existing routine. Hence the compiler tries to inline everything, and leaves it up to you to separate as needed/wanted. Doing it unecessarily, will cost perfromance.

Best Wishes
Salenko



Joined: 08 Sep 2008
Posts: 84

View user's profile Send private message

PostPosted: Fri Sep 25, 2009 3:26 pm     Reply with quote

Ttelmah wrote:
The keyword is in SherpaDoug's reply _optimise_. It takes slightly more space, and time, to call a routine that is actually 'separate', than the same code 'embedded' as an 'inline block inside an existing routine. Hence the compiler tries to inline everything, and leaves it up to you to separate as needed/wanted. Doing it unecessarily, will cost perfromance.

Best Wishes


Thank you again Ttelmah, now it's more clear.
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