|
|
View previous topic :: View next topic |
Author |
Message |
Laurent Chouinard
Joined: 12 Sep 2003 Posts: 43
|
PCH optimization of unused functions |
Posted: Mon Oct 15, 2007 12:16 pm |
|
|
I am currently writing code to add to my programs the ability to receive a new firmware through TCP/IP.
I made various elegant hacks to achieve this, such as faking boot code, freezing rom areas to replace with my own boot loaders, and such and such.
All is good and dandy, except for ROM optimization. Since the boot loader code cannot possibly be called by the program itself, it lies somewhere in the ROM but it never "used". This is good, I want that. But by playing with that, I came to the conclusion that the compiler will actually compile any function found, regardless of use.
This is good for my bootloader, since I want it to be compiled into ROM even though the program does not call it, but realizing this, I wonder about the rest of my code. Since this project is vast and I've been working on it for a year, how many functions do I have lying around, not used because I changed my mind along the way, and that are still compiled into the ROM and using valuable space?
Is there a way to find a list of "Unused functions"? The compiler already warns me about unused RAM variables, so I always read those and then proceed to, if applicable, remove them to free up space. What about functions? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Oct 15, 2007 12:31 pm |
|
|
Quote: |
I came to the conclusion that the compiler will actually compile
any function found, regardless of use. |
That's not true.
Compile the following test program. I used vs. 4.058, but any version
will work for this test.
Code: |
#include <18F452.h>
#fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
#use delay(clock=4000000)
int8 test(void)
{
char c;
c = 0x55;
return(c);
}
//==========================
void main()
{
while(1);
} |
Here's the .LST file output. The test() function is not compiled.
Code: |
0000: GOTO 0004
... #include <18F452.h>
... // Standard Header file for the PIC18F452 device //
... #device PIC18F452
... #list
...
... #fuses XT,NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP
... #use delay(clock=4000000)
...
... int8 test(void)
... {
... char c;
...
... c = 0x55;
...
... return(c);
... }
...
...
... //====================================
... void main()
... {
0004: CLRF FF8
0006: BCF FD0.7
0008: CLRF FEA
000A: CLRF FE9
000C: BSF FC1.0
000E: BSF FC1.1
0010: BSF FC1.2
0012: BCF FC1.3
...
...
...
... while(1);
0014: BRA 0014
... } |
|
|
|
Laurent Chouinard
Joined: 12 Sep 2003 Posts: 43
|
|
Posted: Mon Oct 15, 2007 12:52 pm |
|
|
I understand your test shows exactly what should be happening, but why would a whole include file loaded with 5 functions that are never referenced to anywhere would still be compiled?
One thing to mention, I specify ROM locations for these functions such as:
Code: | #org 0x1e000, 0x1fffe default
void LotsOfStuffHere(void) {
...
}
#org default |
Does that force the compiler to compile the code regardless of calls? Because I am absolutely positive that the code is not called and it is compiled because the ROM size is considerable larger, the HEX file shows my functions located at the expected addresses, and the LST file shows all the functions compiled nicely in the rom range specified as well. |
|
|
Laurent Chouinard
Joined: 12 Sep 2003 Posts: 43
|
|
Posted: Mon Oct 15, 2007 12:56 pm |
|
|
Update:
Yes. That is exactly why. I just tried it with a blank test program and, indeed, if rom locations are specified, code is compiled. Otherwise, if function is not called, it's not compiled.
So thank you, my question is answered. |
|
|
|
|
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
|