profiling: write "correct" sample rate to gmon output
This duration vs sample count is _significantly_ closer to the truth than simply declaring the value to be 100Hz. Change-Id: Ie8d8bdf1959e1aa7cead0631cd2c86afe77d1efc Signed-off-by: Karl Palsson <karlp@tweak.net.au> Reviewed-on: http://openocd.zylin.com/4221 Tested-by: jenkins Reviewed-by: Paul Fertser <fercerpav@gmail.com>
This commit is contained in:
parent
4e0371bf71
commit
9cd74c113c
|
@ -3838,7 +3838,7 @@ typedef unsigned char UNIT[2]; /* unit of profiling */
|
|||
|
||||
/* Dump a gmon.out histogram file. */
|
||||
static void write_gmon(uint32_t *samples, uint32_t sampleNum, const char *filename, bool with_range,
|
||||
uint32_t start_address, uint32_t end_address, struct target *target)
|
||||
uint32_t start_address, uint32_t end_address, struct target *target, uint32_t duration_ms)
|
||||
{
|
||||
uint32_t i;
|
||||
FILE *f = fopen(filename, "w");
|
||||
|
@ -3906,7 +3906,8 @@ static void write_gmon(uint32_t *samples, uint32_t sampleNum, const char *filena
|
|||
writeLong(f, min, target); /* low_pc */
|
||||
writeLong(f, max, target); /* high_pc */
|
||||
writeLong(f, numBuckets, target); /* # of buckets */
|
||||
writeLong(f, 100, target); /* KLUDGE! We lie, ca. 100Hz best case. */
|
||||
float sample_rate = sampleNum / (duration_ms / 1000.0);
|
||||
writeLong(f, sample_rate, target);
|
||||
writeString(f, "seconds");
|
||||
for (i = 0; i < (15-strlen("seconds")); i++)
|
||||
writeData(f, &zero, 1);
|
||||
|
@ -3955,6 +3956,7 @@ COMMAND_HANDLER(handle_profile_command)
|
|||
return ERROR_FAIL;
|
||||
}
|
||||
|
||||
uint64_t timestart_ms = timeval_ms();
|
||||
/**
|
||||
* Some cores let us sample the PC without the
|
||||
* annoying halt/resume step; for example, ARMv7 PCSR.
|
||||
|
@ -3966,6 +3968,7 @@ COMMAND_HANDLER(handle_profile_command)
|
|||
free(samples);
|
||||
return retval;
|
||||
}
|
||||
uint32_t duration_ms = timeval_ms() - timestart_ms;
|
||||
|
||||
assert(num_of_samples <= MAX_PROFILE_SAMPLE_NUM);
|
||||
|
||||
|
@ -3998,7 +4001,7 @@ COMMAND_HANDLER(handle_profile_command)
|
|||
}
|
||||
|
||||
write_gmon(samples, num_of_samples, CMD_ARGV[1],
|
||||
with_range, start_address, end_address, target);
|
||||
with_range, start_address, end_address, target, duration_ms);
|
||||
command_print(CMD_CTX, "Wrote %s", CMD_ARGV[1]);
|
||||
|
||||
free(samples);
|
||||
|
|
Loading…
Reference in New Issue