From 39d80bad9bb405dab262ab2c4bedaef18d8c1df8 Mon Sep 17 00:00:00 2001 From: oharboe Date: Mon, 23 Feb 2009 21:26:11 +0000 Subject: tinkered a bit with performance for Cortex flash programming. Mainly make it easier to profile as a start. git-svn-id: svn://svn.berlios.de/openocd/trunk@1380 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/target/target.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'src/target/target.c') diff --git a/src/target/target.c b/src/target/target.c index cc1d48a..70660e3 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -1700,32 +1700,41 @@ int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char return target_wait_state(target, TARGET_HALTED, ms); } +/* wait for target state to change. The trick here is to have a low + * latency for short waits and not to suck up all the CPU time + * on longer waits. + * + * After 500ms, keep_alive() is invoked + */ int target_wait_state(target_t *target, enum target_state state, int ms) { int retval; - struct timeval timeout, now; + long long then=0, cur; int once=1; - gettimeofday(&timeout, NULL); - timeval_add_time(&timeout, 0, ms * 1000); for (;;) { if ((retval=target_poll(target))!=ERROR_OK) return retval; - keep_alive(); if (target->state == state) { break; } + cur = timeval_ms(); if (once) { once=0; + then = timeval_ms(); LOG_DEBUG("waiting for target %s...", Jim_Nvp_value2name_simple(nvp_target_state,state)->name); } - gettimeofday(&now, NULL); - if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec))) + if (cur-then>500) + { + keep_alive(); + } + + if ((cur-then)>ms) { LOG_ERROR("timed out while waiting for target %s", Jim_Nvp_value2name_simple(nvp_target_state,state)->name); -- cgit v1.1