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

Reply via email to