From: oharboe at B. <oh...@ma...> - 2009-02-23 22:26:12
|
Author: oharboe Date: 2009-02-23 22:26:11 +0100 (Mon, 23 Feb 2009) New Revision: 1380 Modified: trunk/src/target/cortex_swjdp.c trunk/src/target/target.c Log: tinkered a bit with performance for Cortex flash programming. Mainly make it easier to profile as a start. Modified: trunk/src/target/cortex_swjdp.c =================================================================== --- trunk/src/target/cortex_swjdp.c 2009-02-23 06:30:15 UTC (rev 1379) +++ trunk/src/target/cortex_swjdp.c 2009-02-23 21:26:11 UTC (rev 1380) @@ -5,6 +5,9 @@ * Copyright (C) 2008 by Spencer Oliver * * sp...@sp... * * * + * Copyright (C) 2009 by Oyvind Harboe * + * oyv...@zy... * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -178,7 +181,7 @@ int retval; u32 ctrlstat; - keep_alive(); + /* too expensive to call keep_alive() here */ /* Danger!!!! BROKEN!!!! */ scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); @@ -199,27 +202,33 @@ swjdp->ack = swjdp->ack & 0x7; - long long then=timeval_ms(); - while (swjdp->ack != 2) + if (swjdp->ack != 2) { - if (swjdp->ack == 1) + long long then=timeval_ms(); + while (swjdp->ack != 2) { - if ((timeval_ms()-then) > 1000) + if (swjdp->ack == 1) { - LOG_WARNING("Timeout (1000ms) waiting for ACK = OK/FAULT in SWJDP transaction"); + if ((timeval_ms()-then) > 1000) + { + LOG_WARNING("Timeout (1000ms) waiting for ACK = OK/FAULT in SWJDP transaction"); + return ERROR_JTAG_DEVICE_ERROR; + } + } + else + { + LOG_WARNING("Invalid ACK in SWJDP transaction"); return ERROR_JTAG_DEVICE_ERROR; } + + scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; + swjdp->ack = swjdp->ack & 0x7; } - else - { - LOG_WARNING("Invalid ACK in SWJDP transaction"); - return ERROR_JTAG_DEVICE_ERROR; - } - - scan_inout_check_u32(swjdp, SWJDP_IR_DPACC, DP_CTRL_STAT, DPAP_READ, 0, &ctrlstat); - if ((retval=jtag_execute_queue())!=ERROR_OK) - return retval; - swjdp->ack = swjdp->ack & 0x7; + } else + { + /* common code path avoids fn to timeval_ms() */ } /* Check for STICKYERR and STICKYORUN */ Modified: trunk/src/target/target.c =================================================================== --- trunk/src/target/target.c 2009-02-23 06:30:15 UTC (rev 1379) +++ trunk/src/target/target.c 2009-02-23 21:26:11 UTC (rev 1380) @@ -1700,33 +1700,42 @@ 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); return ERROR_FAIL; |