View Single Post
  #14   Spotlight this post!  
Unread 17-02-2004, 00:43
WillyC's Avatar
WillyC WillyC is offline
"handy"
#1347
Team Role: Engineer
 
Join Date: Jan 2004
Location: Ottawa, Canada
Posts: 29
WillyC is on a distinguished road
Re: How to measure execution time? And code size?

Quote:
Originally Posted by Mark McLeod
A memory map can be generated by MPLAB whenever you compile your code. You have to turn it on by going to Project -> Build Options... -> Project then click on the "MPLINK Linker" tab, then click on "Generater map file". After you build your project look in the project directory for a text file ending in ".map" just a little way down the file it will have a section that looks like:
Code:
                              Program Memory Usage 
                               Start         End      
                           ---------   ---------      
                            0x000800    0x000837      
                            0x0008d4    0x0033d8      
                            0x0033da    0x003511      
                            0x300000    0x30000d      
            11395 out of 33816 program addresses used, program memory utilization is 33%
This gives you the program or rom space used. For the data or ram space it's a little harder. After the section above all space used will be listed by address. You'll see your familiar variables listed. You have to check the maximum addresses used by the data portion of your code.
Code:
e.g.,
    I   0x0007b7       data     static C:\mcc18\Projects\FrcCode\FrcCode\ifi_library.c
count   0x0007b8       data     static C:\mcc18\Projects\FrcCode\FrcCode\ifi_library.c
 temp   0x0007b9       data     static C:\mcc18\Projects\FrcCode\FrcCode\ifi_library.c
Thanks for this info Mark! This is helpful. I've just been looking at the .map file for my latest build and trying to calculate how much RAM I'm using up. I looked in the .map file in the section where it's sorted by address and noticed something interesting:

Code:
                              Symbols - Sorted by Address
                     Name    Address   Location    Storage File                     
                ---------  ---------  ---------  --------- ---------                
__tmp_0   0x000000     data     static D:\Code\Comp\v1\ifi_utilities.c
...
nullStr   0x0007da        data     extern D:\Code\Comp\v1\printf_lib.c
RCSTA2   0x000f6b      data     extern C:\FIRST\SRC\PROC\p18f8520.asm
...
TOSU   0x000fff          data     extern C:\FIRST\SRC\PROC\p18f8520.asm
I put the "..." in there to condense the info. But the interesting thing is the transition from C variables to assembly variables. The C variables occupy 2010 bytes of memory (0x000000 up to 0x0007da). Then there's a bunch of empty space from 0x0007db on up to 0x000f6a, and then the assembly variables occupy 0x000f6b up to 0x000fff. There are 4095 (FFF) bytes of RAM available in total, but it looks like all the IFI assembly defs and unions occupy the last 148 bytes from 0x000f6b up to 0x000fff.

To truly measure how many bytes you're using, you have to take the hex difference between the first assembly variable address (in all cases I think this will be 0x000f6b) and the last C variable address (in my case 0x0007da). Convert this number to decimal and subtract it from 4095 and the result is how many bytes of RAM your code uses.

It's also worth keeping in mind then that we really have 3946 bytes (up to 0x000f6a) of useable RAM since the IFI assembly stuff reserves the last 148 bytes. It will be hard to use that much RAM, but it's still worth noting.

Last edited by WillyC : 17-02-2004 at 00:52.