aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Selkirk <paul@psgd.org>2017-05-06 13:07:59 -0400
committerPaul Selkirk <paul@psgd.org>2017-09-07 18:11:01 -0400
commitb2858c0eabeb2aba36ad7b5a964d52e51711c8df (patch)
tree608954d9d84342594c1bc998d8d652095af869ca
parent358d038067b10330011ef4e6596ae37842d516fe (diff)
Correct offset to get the PC.
A previous version of this code ran over the RTOS, where threads used the Process Stack, while the SysTick interrupt used the Main Stack. Now everything's on the main stack, so we need to account for 2 extra words that SysTick_Handler pushes on the stack at entry.
-rw-r--r--libraries/libprof/README.txt4
-rw-r--r--libraries/libprof/profil.c2
2 files changed, 3 insertions, 3 deletions
diff --git a/libraries/libprof/README.txt b/libraries/libprof/README.txt
index da138c2..9db27a6 100644
--- a/libraries/libprof/README.txt
+++ b/libraries/libprof/README.txt
@@ -53,8 +53,8 @@ In the OpenOCD console, enable semihosting:
In the CLI, type `profile start`, then start the unit test or whatever
will be exercising the hsm. Afterwards, in the CLI, type `profile stop`.
-After invoking `profile stop`, it takes almost 2 minutes to write gmon.out
-over OpenOCD to the host.
+After invoking `profile stop`, it can take several minutes to write
+gmon.out over OpenOCD to the host.
In the projects/hsm directory, run gprof to analyse the gmon.out file:
diff --git a/libraries/libprof/profil.c b/libraries/libprof/profil.c
index 07761dd..004af77 100644
--- a/libraries/libprof/profil.c
+++ b/libraries/libprof/profil.c
@@ -30,7 +30,7 @@ extern void set_SysTick_hook(void (*hook)(void));
/* sample the current program counter */
static void SysTick_hook(void) {
- size_t pc = (size_t)((uint32_t *)__get_MSP())[5];
+ size_t pc = (size_t)((uint32_t *)__get_MSP())[7];
if (pc >= prof.lowpc && pc < prof.highpc) {
size_t idx = PROFIDX (pc, prof.lowpc, prof.scale);
prof.counter[idx]++;