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
parent
64b0d5aac0
commit
4e0371bf71
|
@ -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) {
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue