hla_target: allow non-intrusive profiling on cortex-m

Leverages the existing work that added profiling via DWT_PCSR.

hla_target doesn't have direct access to the mem_ap for doing a bulk
repeated read, but simply reading the DWT_PCSR register repeatedly is
still ~2 order of magnitude faster than halt/resume.

Change-Id: Ibe451aa95143694398370fdad6939cfb6191d56f
Signed-off-by: Karl Palsson <karlp@tweak.net.au>
Reviewed-on: http://openocd.zylin.com/4220
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
compliance_dev
Karl Palsson 2017-09-08 10:49:30 +00:00 committed by Paul Fertser
parent 64b0d5aac0
commit 4e0371bf71
3 changed files with 14 additions and 6 deletions

View File

@ -1707,7 +1707,7 @@ void cortex_m_deinit_target(struct target *target)
free(cortex_m); free(cortex_m);
} }
static int cortex_m_profiling(struct target *target, uint32_t *samples, int cortex_m_profiling(struct target *target, uint32_t *samples,
uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds) uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
{ {
struct timeval timeout, now; struct timeval timeout, now;
@ -1749,13 +1749,18 @@ static int cortex_m_profiling(struct target *target, uint32_t *samples,
for (;;) { for (;;) {
if (use_pcsr) { if (use_pcsr) {
if (armv7m && armv7m->debug_ap) {
uint32_t read_count = max_num_samples - sample_count; uint32_t read_count = max_num_samples - sample_count;
if (read_count > 1024) if (read_count > 1024)
read_count = 1024; read_count = 1024;
retval = mem_ap_read_buf_noincr(armv7m->debug_ap, retval = mem_ap_read_buf_noincr(armv7m->debug_ap,
(void *)&samples[sample_count], (void *)&samples[sample_count],
4, read_count, DWT_PCSR); 4, read_count, DWT_PCSR);
sample_count += read_count; sample_count += read_count;
} else {
target_read_u32(target, DWT_PCSR, &samples[sample_count++]);
}
} else { } else {
target_poll(target); target_poll(target);
if (target->state == TARGET_HALTED) { if (target->state == TARGET_HALTED) {

View File

@ -213,5 +213,7 @@ void cortex_m_enable_breakpoints(struct target *target);
void cortex_m_enable_watchpoints(struct target *target); void cortex_m_enable_watchpoints(struct target *target);
void cortex_m_dwt_setup(struct cortex_m_common *cm, struct target *target); void cortex_m_dwt_setup(struct cortex_m_common *cm, struct target *target);
void cortex_m_deinit_target(struct target *target); void cortex_m_deinit_target(struct target *target);
int cortex_m_profiling(struct target *target, uint32_t *samples,
uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds);
#endif /* OPENOCD_TARGET_CORTEX_M_H */ #endif /* OPENOCD_TARGET_CORTEX_M_H */

View File

@ -814,4 +814,5 @@ struct target_type hla_target = {
.remove_breakpoint = cortex_m_remove_breakpoint, .remove_breakpoint = cortex_m_remove_breakpoint,
.add_watchpoint = cortex_m_add_watchpoint, .add_watchpoint = cortex_m_add_watchpoint,
.remove_watchpoint = cortex_m_remove_watchpoint, .remove_watchpoint = cortex_m_remove_watchpoint,
.profiling = cortex_m_profiling,
}; };