summaryrefslogtreecommitdiff
path: root/src/target/target.c
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-02-23 21:26:11 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-02-23 21:26:11 +0000
commit39d80bad9bb405dab262ab2c4bedaef18d8c1df8 (patch)
treea9bc66ad9fa3e84a367ec15d5d07584a82f8e738 /src/target/target.c
parentba9d608df3ddbda5d8e451a26ee7e2cbe99d6938 (diff)
downloadopenocd+libswd-39d80bad9bb405dab262ab2c4bedaef18d8c1df8.tar.gz
openocd+libswd-39d80bad9bb405dab262ab2c4bedaef18d8c1df8.tar.bz2
openocd+libswd-39d80bad9bb405dab262ab2c4bedaef18d8c1df8.tar.xz
openocd+libswd-39d80bad9bb405dab262ab2c4bedaef18d8c1df8.zip
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
Diffstat (limited to 'src/target/target.c')
-rw-r--r--src/target/target.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/target/target.c b/src/target/target.c
index cc1d48a8..70660e3b 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);