diff options
author | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2012-01-28 02:35:57 +0100 |
---|---|---|
committer | Øyvind Harboe <oyvindharboe@gmail.com> | 2012-01-30 19:09:53 +0000 |
commit | 61f3d4b7e42897fb1570bd4307137833cce0f7ba (patch) | |
tree | c6aded232d8abca9068a82e22067dc737a2e1278 | |
parent | fce4ac57140d4312dd229c7d5f149a340c92cda1 (diff) |
target: increase chunk size in dump_image
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>
-rw-r--r-- | src/target/target.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/target/target.c b/src/target/target.c index 67876d10..ab094f96 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -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; |