| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| GiG 
 
 
 Joined: 03 Sep 2021
 Posts: 39
 
 
 
			    
 
 | 
			
				| Out of ROM, A segment or the program is too large |  
				|  Posted: Sun Sep 26, 2021 1:14 am |   |  
				| 
 |  
				| Hello again I have a strange problem for a few days.
 This problem occurs while compiling and just only 30% RAM and ROM occupied.
 This gives me a strange error about the segment.
 The problem is solved when I delete a few commands or, for example, convert Int16 to Int8 or deleting floats.
 Any idea ?
 
 
  	  | Code: |  	  | >>> Warning 203 "Finally_done.c" Line 2103(1,1): Condition always TRUE *** Error 71 "Finally_done.c" Line 2133(1,2): Out of ROM, A segment or the program is too large    set_timer
 Seg 0001E-007FF, 0392 left, need 0079C
 Seg 00800-00FFF, 0800 left, need 00808
 Seg 01000-017FF, 0800 left, need 00808
 Seg 01800-01FFF, 0800 left, need 00808
 Seg 02000-027FF, 0800 left, need 00808
 Seg 02800-02FFF, 0800 left, need 00808
 Seg 03000-037FF, 0800 left, need 00808
 Seg 03800-03FFF, 0800 left, need 00808
 Seg 00000-00002, 0000 left, need 00808 Reserved
 Seg 00003-00003, 0001 left, need 00808
 Seg 00004-0001D, 0000 left, need 00808 Reserved
 Seg 0001E-007FF, 0392 left, need 00808
 
 1 Errors,  1 Warnings.
 | 
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Sep 26, 2021 1:47 am |   |  
				| 
 |  
				| This says what the problem is: 
  	  | Quote: |  	  | 0800 left, need 00808 | 
 One of your functions is too large to fit in a hardware code page
 by 8 words.   Split it into two functions.
 
 If the problem function is main(), then make some of the code in
 main() into one or more functions, and then call them from main().
 |  |  
		|  |  
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9587
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Sep 26, 2021 6:47 am |   |  
				| 
 |  
				| 'Classic' problem, covered in the CCS C Manual, in the FAQ section. Sometimes rearanging the order of the functions as coded helps, but if one function won't fit into a memory segment, it HAS to be split up, as PCM P says. 
 I see a hint of ' floating point math' ( delete floats). PICs are not good at floating point math. OK, they do it, but it takes a LOT of codespace and time. You should start using 'scaled integers'. They require less code space, are more accurate and  a LOT faster. So you'll get more program into a PIC, better numbers and done at warp speed !
 
 Jay
 |  |  
		|  |  
		| GiG 
 
 
 Joined: 03 Sep 2021
 Posts: 39
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Sep 26, 2021 7:56 am |   |  
				| 
 |  
				|  	  | temtronic wrote: |  	  | 'Classic' problem, covered in the CCS C Manual, in the FAQ section. Sometimes rearanging the order of the functions as coded helps,but if one function won't fit into a memory segment, it HAS to be split up, as PCM P says. 
 I see a hint of ' floating point math' ( delete floats). PICs are not good at floating point math. OK, they do it, but it takes a LOT of codespace and time. You should start using 'scaled integers'. They require less code space, are more accurate and  a LOT faster. So you'll get more program into a PIC, better numbers and done at warp speed !
 
 Jay
 | 
 
 
 Thank you I'm using  integers now.
 But what do you mean with "scaled integers"?!
 Any way to use integers in a way that uses less memory?
 |  |  
		|  |  
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9587
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Sep 26, 2021 8:09 am |   |  
				| 
 |  
				| use 'search' here to find posting about scaled integers. 
 One quick example.
 Say you have a 'battery guage' program. The battery voltage is 14.25. As a FP number it'll be 14.25, but as a scaled integer it'll be 14250.
 
 
 Jay
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19962
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Sep 26, 2021 9:24 am |   |  
				| 
 |  
				| and the point is that a single floating point multiplication uses many times the code size of an integer multiplication (and time).
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Sep 26, 2021 3:49 pm |   |  
				| 
 |  
				| I don't think he needs to worry about floats or scaled integers, because (based on a previous thread) he's using a 16F1939 and
 it's got 16K of ROM and he's not using most of it:
 
  	  | Quote: |  	  | Seg 0001E-007FF, 0392 left, need 0079C
 Seg 00800-00FFF, 0800 left, need 00808
 Seg 01000-017FF, 0800 left, need 00808
 Seg 01800-01FFF, 0800 left, need 00808
 Seg 02000-027FF, 0800 left, need 00808
 Seg 02800-02FFF, 0800 left, need 00808
 Seg 03000-037FF, 0800 left, need 00808
 Seg 03800-03FFF, 0800 left, need 00808
 
 | 
 7 out of 8 segments are empty.  The segments are 2K each.
 
 He just needs to break his code up into routines and call them.
 |  |  
		|  |  
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19962
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Sep 26, 2021 11:19 pm |   |  
				| 
 |  
				| Agreed. After posting, I thought 'given he is only using 30%, splitting is all that
 is really needed'. However as a general comment, using scaled integers is
 a much better way to be working anyway...
   His big key thing is to look at the actual layout of the code, and how to
 split it into smaller parts.
 |  |  
		|  |  
		| rnielsen 
 
 
 Joined: 23 Sep 2003
 Posts: 852
 Location: Utah
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Oct 01, 2021 3:52 pm |   |  
				| 
 |  
				| The PIC's memory space is like a book. You have several pages in the book but your code(function) has to fit on each page and cannot carry over to the next page. Even though your compiler says you are only using 30% of the available ROM the code that's in your Main() is too large. Try breaking your program into smaller functions that can be called individually and have the same effect. |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |