diff options
author | Karl Palsson <karlp@tweak.net.au> | 2017-09-08 15:44:52 +0000 |
---|---|---|
committer | Paul Fertser <fercerpav@gmail.com> | 2018-01-13 09:32:43 +0000 |
commit | 9cd74c113c3a92dd41485ad4d9ba0a275682712b (patch) | |
tree | f48e39ce4ea54b3ab251b6b7a7a22bf78fb64e5a | |
parent | 4e0371bf718c9eb3a862e3c9b113c95cd4c3a479 (diff) | |
download | riscv-openocd-9cd74c113c3a92dd41485ad4d9ba0a275682712b.zip riscv-openocd-9cd74c113c3a92dd41485ad4d9ba0a275682712b.tar.gz riscv-openocd-9cd74c113c3a92dd41485ad4d9ba0a275682712b.tar.bz2 |
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>
-rw-r--r-- | src/target/target.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/target/target.c b/src/target/target.c index a9907b0..d6781a3 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -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); |