Committed.

tinkered a bit with performance for Cortex flash programming. Mainly
make it easier to profile as a start.


### Eclipse Workspace Patch 1.0
#P openocd
Index: src/target/cortex_swjdp.c
===================================================================
--- src/target/cortex_swjdp.c   (revision 1374)
+++ src/target/cortex_swjdp.c   (working copy)
@@ -5,6 +5,9 @@
  *   Copyright (C) 2008 by Spencer Oliver                                  *
  *   [email protected]                                                  *
  *                                                                         *
+ *   Copyright (C) 2009 by Oyvind Harboe                                   *
+ *   [email protected]                                               *
+ *                                                                             
                                                                   *
  *   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;
                        }
-               }
-               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;
                }
-
-               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 */
Index: src/target/target.c
===================================================================
--- src/target/target.c (revision 1374)
+++ src/target/target.c (working copy)
@@ -1700,32 +1700,41 @@
        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);


-- 
Øyvind Harboe
PayBack incident management system
Reduce costs and increase quality, free Starter Edition
http://www.payback.no/index_en.html
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to