target: increase chunk size in dump_image
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>
Sat, 28 Jan 2012 01:35:57 +0000 (02:35 +0100)
committerØyvind Harboe <oyvindharboe@gmail.com>
Mon, 30 Jan 2012 19:09:53 +0000 (19:09 +0000)
Replace the big stack-allocated buffer with a much bigger heap-allocated.
There was no explanation for the apparently arbitrary chunk size, and
performance was improved by increasing it, leveling out at about 4k.

Change-Id: I3b06d4469092ec8d89d0ce05bff0b7cf213c5062
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/404
Tested-by: jenkins
Reviewed-by: Marti Bolivar <mbolivar@leaflabs.com>
Reviewed-by: Øyvind Harboe <oyvindharboe@gmail.com>
src/target/target.c

index 67876d10e52b3cdeb82f316afc7da0785e32650a..ab094f96775b5441e0b8374f60017b44584931f8 100644 (file)
@@ -2797,7 +2797,7 @@ COMMAND_HANDLER(handle_load_image_command)
 COMMAND_HANDLER(handle_dump_image_command)
 {
        struct fileio fileio;
-       uint8_t buffer[560];
+       uint8_t *buffer;
        int retval, retvaltemp;
        uint32_t address, size;
        struct duration bench;
@@ -2809,17 +2809,23 @@ COMMAND_HANDLER(handle_dump_image_command)
        COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], address);
        COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], size);
 
+       uint32_t buf_size = (size > 4096) ? 4096 : size;
+       buffer = malloc(buf_size);
+       if (!buffer)
+               return ERROR_FAIL;
+
        retval = fileio_open(&fileio, CMD_ARGV[0], FILEIO_WRITE, FILEIO_BINARY);
-       if (retval != ERROR_OK)
+       if (retval != ERROR_OK) {
+               free(buffer);
                return retval;
+       }
 
        duration_start(&bench);
 
-       retval = ERROR_OK;
        while (size > 0)
        {
                size_t size_written;
-               uint32_t this_run_size = (size > 560) ? 560 : size;
+               uint32_t this_run_size = (size > buf_size) ? buf_size : size;
                retval = target_read_buffer(target, address, this_run_size, buffer);
                if (retval != ERROR_OK)
                {
@@ -2836,6 +2842,8 @@ COMMAND_HANDLER(handle_dump_image_command)
                address += this_run_size;
        }
 
+       free(buffer);
+
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
                int filesize;