David Brownell identified a few more important sites of non-trivial amounts of working memory allocated on stack.
Change to dynamic allocation. -- Øyvind Harboe http://www.zylin.com/zy1000.html ARM7 ARM9 ARM11 XScale Cortex JTAG debugger and flash programmer
From aacc5b583c6415fe8d3e6fc99066d6ef819fa22c Mon Sep 17 00:00:00 2001 From: =?utf-8?q?=C3=98yvind=20Harboe?= <oyvind.har...@zylin.com> Date: Sun, 22 Nov 2009 18:58:42 +0100 Subject: [PATCH 1/2] target: reduce stack usage MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit 4096 byte buffer allocated dynamically. Better for embedded OS's. Signed-off-by: Øyvind Harboe <oyvind.har...@zylin.com> --- src/target/target.c | 26 ++++++++++++++++++++------ 1 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/target/target.c b/src/target/target.c index 70fd8f2..55adcce 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -3145,7 +3145,6 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, uint32_t count; uint32_t v; const char *varname; - uint8_t buffer[4096]; int n, e, retval; uint32_t i; @@ -3227,14 +3226,20 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, /* index counter */ n = 0; + + size_t buffersize = 4096; + uint8_t *buffer = malloc(buffersize); + if (buffer == NULL) + return JIM_ERR; + /* assume ok */ e = JIM_OK; while (len) { /* Slurp... in buffer size chunks */ count = len; /* in objects.. */ - if (count > (sizeof(buffer)/width)) { - count = (sizeof(buffer)/width); + if (count > (buffersize/width)) { + count = (buffersize/width); } retval = target_read_memory(target, addr, width, count, buffer); @@ -3268,6 +3273,8 @@ static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, } } + free(buffer); + Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); return JIM_OK; @@ -3331,7 +3338,6 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, int argc, uint32_t count; uint32_t v; const char *varname; - uint8_t buffer[4096]; int n, e, retval; uint32_t i; @@ -3415,12 +3421,18 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, int argc, n = 0; /* assume ok */ e = JIM_OK; + + size_t buffersize = 4096; + uint8_t *buffer = malloc(buffersize); + if (buffer == NULL) + return JIM_ERR; + while (len) { /* Slurp... in buffer size chunks */ count = len; /* in objects.. */ - if (count > (sizeof(buffer)/width)) { - count = (sizeof(buffer)/width); + if (count > (buffersize/width)) { + count = (buffersize/width); } v = 0; /* shut up gcc */ @@ -3454,6 +3466,8 @@ static int target_array2mem(Jim_Interp *interp, struct target *target, int argc, } } + free(buffer); + Jim_SetResult(interp, Jim_NewEmptyStringObj(interp)); return JIM_OK; -- 1.6.3.3
From 0c4016941da7aa32719704a790ab66c5a2c53f30 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?=C3=98yvind=20Harboe?= <oyvind.har...@zylin.com> Date: Sun, 22 Nov 2009 19:06:44 +0100 Subject: [PATCH 2/2] flash: dynamically allocate working storage MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Allocate working memory rather than using stack. Signed-off-by: Øyvind Harboe <oyvind.har...@zylin.com> --- src/flash/flash.c | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/flash/flash.c b/src/flash/flash.c index ef6c6da..b65ce0a 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -728,24 +728,40 @@ COMMAND_HANDLER(handle_flash_fill_command) uint32_t address; uint32_t pattern; uint32_t count; - uint8_t chunk[1024]; - uint8_t readback[1024]; uint32_t wrote = 0; uint32_t cur_size = 0; uint32_t chunk_count; struct target *target = get_current_target(CMD_CTX); uint32_t i; uint32_t wordsize; + int retval = ERROR_OK; + + static size_t const chunksize = 1024; + uint8_t *chunk = malloc(chunksize); + if (chunk == NULL) + return ERROR_FAIL; + + uint8_t *readback = malloc(chunksize); + if (readback == NULL) + { + free(chunk); + return ERROR_FAIL; + } + if (CMD_ARGC != 3) - return ERROR_COMMAND_SYNTAX_ERROR; + { + retval = ERROR_COMMAND_SYNTAX_ERROR; + goto done; + } + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], address); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], pattern); COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], count); if (count == 0) - return ERROR_OK; + goto done; switch (CMD_NAME[4]) { @@ -759,7 +775,8 @@ COMMAND_HANDLER(handle_flash_fill_command) wordsize = 1; break; default: - return ERROR_COMMAND_SYNTAX_ERROR; + retval = ERROR_COMMAND_SYNTAX_ERROR; + goto done; } chunk_count = MIN(count, (1024 / wordsize)); @@ -795,15 +812,22 @@ COMMAND_HANDLER(handle_flash_fill_command) bank = get_flash_bank_by_addr(target, address); if (bank == NULL) { - return ERROR_FAIL; + retval = ERROR_FAIL; + goto done; } err = flash_driver_write(bank, chunk, address - bank->base + wrote, cur_size); if (err != ERROR_OK) - return err; + { + retval = err; + goto done; + } err = target_read_buffer(target, address + wrote, cur_size, readback); if (err != ERROR_OK) - return err; + { + retval = err; + goto done; + } unsigned i; for (i = 0; i < cur_size; i++) @@ -812,7 +836,8 @@ COMMAND_HANDLER(handle_flash_fill_command) { LOG_ERROR("Verfication error address 0x%08" PRIx32 ", read back 0x%02x, expected 0x%02x", address + wrote + i, readback[i], chunk[i]); - return ERROR_FAIL; + retval = ERROR_FAIL; + goto done; } } } @@ -823,7 +848,12 @@ COMMAND_HANDLER(handle_flash_fill_command) " in %fs (%0.3f kb/s)", wrote, address, duration_elapsed(&bench), duration_kbps(&bench, wrote)); } - return ERROR_OK; + + done: + free(readback); + free(chunk); + + return retval; } COMMAND_HANDLER(handle_flash_write_bank_command) -- 1.6.3.3
_______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development