|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
|
|
Thread Tools | Rate Thread | Display Modes |
|
|
|
#1
|
|||||
|
|||||
|
How to measure execution time? And code size?
Can someone describe a simple way to measure how much of the 26 ms time budget is being used? As I add code I would like to know how close I am coming to the limit.
Also, how do I know how close I am to the memory limits for code and data? Thanks all, Norm |
|
#2
|
|||
|
|||
|
Re: How to measure execution time? And code size?
Add a breakpoint at the top of process_data_from_master_uP and at the bottom. Then use the simulator and the stopwatch to calculate the time different between the 2 breakpoints.
For the memory thing, use the simulator and just look at the memory map of program and data memory. |
|
#3
|
|||||
|
|||||
|
Re: How to measure execution time? And code size?
What simulator? I tried one in mplab, and it got stuck in one of the transmission loops!
|
|
#4
|
||||
|
||||
|
Re: How to measure execution time? And code size?
Quote:
|
|
#5
|
||||
|
||||
|
Re: How to measure execution time? And code size?
measureing timeing on the simulator wont tell you what you want to know, because the SW will be running on your PC, not on the target system (the RC) which is what really matters.
|
|
#6
|
|||||
|
|||||
|
Re: How to measure execution time? And code size?
Quote:
realExecutionTime = simulatedClockCycles * realClockPeriod I'll have to have a closer look at the simulator. At this point I feel like I don't have time to go up another learning curve. But I should probably do it anyway... |
|
#7
|
||||
|
||||
|
Re: How to measure execution time? And code size?
Quote:
|
|
#8
|
|||
|
|||
|
Re: How to measure execution time? And code size?
Yeah I didn't mean an actual stopwatch, there is a function in the simulator that keeps track of time based on chip speed. It's called the "stopwatch".
But the oscilloscope idea sounds easier (assuming you have an oscilloscope you can use). [EDIT]Oops... Last edited by Jay Lundy : 10-02-2004 at 01:50. |
|
#9
|
||||
|
||||
|
Re: How to measure execution time? And code size?
Quote:
![]() |
|
#10
|
||||||
|
||||||
|
Re: How to measure execution time? And code size?
Quote:
Some example code (place this at the very beginning of your code): static char TimingFlag; if (TimingFlag) TimingFlag = 0; else TimingFlag = 1; Then immediately set the digital I/O pin equal to TimingFlag. This code will produce a square wave on the scope. The time that the wave is high (or low) is your cycle time. I hope this helps. -Chris |
|
#11
|
||||||
|
||||||
|
Re: How to measure execution time? And code size?
Quote:
My first post only works if you're running the loop time as fast as possible. It doesn't work if you're setting your loop time with an interrupt. To measure this way do the following: 1) At the VERY BEGINNING of your loop, set a digital I/O pin high. 2) At the VERY END of your loop, set the same digital I/O pin low. 3) Measure the pin voltage on a scope. The amount of the the pin stays high is the amount of time that your code takes to run. (By the way, this is how code time is usually measured in industry.) |
|
#12
|
|||||
|
|||||
|
Re: How to measure execution time? And code size?
Quote:
Ooo, I like the idea of using a scope. Technology that I understand! But I think the code you suggest may not give me what I want. I think the code you suggest would toggle a pin with every 26 ms cycle of the code, so the high and low portions of each square wave cycle would each be 26 ms, regardless of how long my code was taking. Your code was: Code:
static char TimingFlag;
if (TimingFlag)
TimingFlag = 0;
else
TimingFlag = 1;
// Then immediately set the digital I/O pin equal to TimingFlag.
How about this instead, in main.c. Note the two lines with ***: Code:
while (1) /* This loop will repeat indefinitely. */
{
if (statusflag.NEW_SPI_DATA) /* 26.2ms loop area */
{ /* I'm slow! I only execute every 26.2ms because */
/* that's how fast the Master uP gives me data. */
rc_dig_out01 = 1; // *** look at this on a scope to see when loop starts
Process_Data_From_Master_uP(); /* You edit this in user_routines.c */
if (autonomous_mode) /* DO NOT CHANGE! */
{
User_Autonomous_Code(); /* You edit this in user_routines_fast.c */
}
}
Process_Data_From_Local_IO(); /* You edit this in user_routines_fast.c */
/* I'm fast! I execute during every loop.*/
rc_dig_out01 = 0; // *** look on scope to see how long it took!
} /* while (1) */
|
|
#13
|
|||||
|
|||||
|
Re: How to measure execution time? And code size?
Quote:
For the default code you get 112,840 to 112,892 loops per second or ~42 (THE_ANSWER) ticks per loop for the basic default program (results may vary). There are a couple of ways to check memory utilization. 1) When you open the .hex file in the IFI_Loader there is a text string at the bottom of the IFI_Loader window that tells you how much space the .hex file uses. For instance, the FRC default code will show: "Total Bytes 2C90, Erase Size B5, Flash 800-3510, MemSize 2D10" 2)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%
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
Last edited by Mark McLeod : 09-02-2004 at 11:17. |
|
#14
|
||||
|
||||
|
Re: How to measure execution time? And code size?
Quote:
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
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. |
|
#15
|
|||||
|
|||||
|
Re: How to measure execution time? And code size?
Another interesting file to take a look at is "18f8520user.lkr"
It's a script for the linker blocking off PIC memory. A bunch of the space is listed as PROTECTED and the highest unprotected address is END=0x7F3 |
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Interrupt timer, executing code asap? | SeanCassidy | Programming | 10 | 07-03-2004 01:47 |
| Actual execution time measurement | Dan | Technical Discussion | 5 | 24-03-2003 11:36 |
| Autonomous Code From Experience | EbonySeraphim | Programming | 7 | 14-03-2003 21:56 |
| Ok one problem | cantwell03 | Programming | 3 | 13-02-2003 07:28 |
| Solution to Timing Loops | Steven Carmain | Programming | 39 | 10-02-2003 13:33 |