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.
|