summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--digital/avr/modules/trace/test/test_host/Makefile10
-rw-r--r--digital/avr/modules/trace/test/test_host/events.h (renamed from digital/avr/modules/trace/test/test_host/flash_stub.c)44
-rw-r--r--digital/avr/modules/trace/test/test_host/test-trace.c71
-rw-r--r--digital/avr/modules/trace/trace.c97
-rw-r--r--digital/avr/modules/trace/trace.h4
5 files changed, 130 insertions, 96 deletions
diff --git a/digital/avr/modules/trace/test/test_host/Makefile b/digital/avr/modules/trace/test/test_host/Makefile
index cc22a863..71ec0899 100644
--- a/digital/avr/modules/trace/test/test_host/Makefile
+++ b/digital/avr/modules/trace/test/test_host/Makefile
@@ -2,9 +2,13 @@ BASE = ../../../..
HOST_PROGS = test-trace
-test-trace_SOURCES = test-trace.c flash_stub.c
+test-trace_SOURCES = test-trace.c
-MODULES = trace
-OPTIMIZE = -O2
+MODULES = trace flash/stub
+#OPTIMIZE = -O2
+OPTIMIZE =
include $(BASE)/make/Makefile.gen
+
+all:
+ touch flash.apb
diff --git a/digital/avr/modules/trace/test/test_host/flash_stub.c b/digital/avr/modules/trace/test/test_host/events.h
index 849e3b34..d5a972a1 100644
--- a/digital/avr/modules/trace/test/test_host/flash_stub.c
+++ b/digital/avr/modules/trace/test/test_host/events.h
@@ -1,7 +1,9 @@
-/* flash_stub.c */
-/* avr.trace - AVR TRACE use. {{{
+#ifndef events_h
+#define events_h
+/* events_h */
+/* {{{
*
- * Copyright (C) 2008 NĂ©lio Laranjeiro
+ * Copyright (C) 2008 APBTeam
*
* APBTeam:
* Web: http://apbteam.org/
@@ -22,35 +24,13 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* }}} */
-#include "modules/flash/flash.h"
-#include <stdio.h>
-uint8_t
-flash_init (void)
+enum events_t
{
- return 0x1;
-}
+ TRACE_ASSERV__RIGHT_MOTOR,
+ TRACE_ASSERV__LEFT_MOTOR,
+ TRACE_IA__IA_CMD,
+ TRACE_NB
+};
-uint32_t
-flash_sector_next(uint32_t addr)
-{
- return 0;
-}
-
-void
-flash_write (uint32_t addr, uint8_t arg)
-{
- printf ("%s -- %x\n", __FUNCTION__, arg);
- printf ("addr : %x\n", addr);
-}
-
-uint8_t
-flash_read (uint32_t addr)
-{
- return 0;
-}
-
-void
-flash_erase (uint8_t cmd, uint32_t addr)
-{
-}
+#endif /* events_h */
diff --git a/digital/avr/modules/trace/test/test_host/test-trace.c b/digital/avr/modules/trace/test/test_host/test-trace.c
index e56be24f..aabd8e16 100644
--- a/digital/avr/modules/trace/test/test_host/test-trace.c
+++ b/digital/avr/modules/trace/test/test_host/test-trace.c
@@ -24,39 +24,72 @@
* }}} */
#include "common.h"
#include "../../trace.h"
+#include "modules/flash/flash.h"
#include <stdio.h>
+#include "events.h"
-int
-main (void)
+void
+flood (void)
{
- uint8_t val1 = 0xEF;
- uint16_t val2 = 0x1234;
- uint32_t val3 = 0x456789AB;
+ uint8_t cmd;
+ uint32_t addr;
+ uint32_t count;
+
+ uint32_t speed;
+ uint32_t position;
+ uint16_t acc;
+
+ uint16_t arg1;
+ uint8_t arg2;
+ uint32_t arg3;
trace_init ();
- printf ("First trace\n");
- TRACE (val1);
+ /* Flood the flash memory with traces. */
+ /* A little more than 3 memory sectors, a sector is 4 kbytes. */
+ for (count = 0; count < 2000; count ++)
+ {
+ /* Right motor. */
+ speed = 10;
+ position = 11;
+ acc = 12;
+ arg1 = 10;
+ arg2 = 11;
+ arg3 = 12;
- printf ("Second trace\n");
- TRACE (val2);
+ cmd = TRACE_ASSERV__RIGHT_MOTOR;
+ TRACE (cmd, speed, position, acc);
+ cmd = TRACE_ASSERV__LEFT_MOTOR;
+ TRACE (cmd, speed, position, acc);
+ cmd = TRACE_IA__IA_CMD;
+ TRACE (cmd, arg1, arg2, arg3);
+ }
+}
- printf ("Third trace\n");
- TRACE (val3);
+void
+dump (void)
+{
+ uint8_t status;
+ uint32_t addr;
- printf ("Fourth trace\n");
- TRACE (val1, val2);
+ status = flash_init ();
- printf ("Fifth trace\n");
- TRACE (val1, val3);
+ for (addr = 0; addr < FLASH_ADDRESS_HIGH; addr ++)
+ {
+ printf ("%02x", flash_read (addr));
+ }
+}
- printf ("sixth one\n");
- TRACE (val1, val2, val3);
+int
+main (void)
+{
+ uint8_t i;
- printf ("last one\n");
- TRACE (val3, val1, val2);
+ for (i = 0; i < 30; i++)
+ flood ();
+ dump();
return 0;
}
diff --git a/digital/avr/modules/trace/trace.c b/digital/avr/modules/trace/trace.c
index ac113f17..4fa01af8 100644
--- a/digital/avr/modules/trace/trace.c
+++ b/digital/avr/modules/trace/trace.c
@@ -32,36 +32,45 @@
#define TRACE_ARGS_MAX 6
#define TRACE_MAX_ARGS (TRACE_ARGS_MAX * TRACE_ARGS_MAX)
+enum trace_status_t
+{
+ TRACE_STATUS_OFF,
+ TRACE_STATUS_ON
+};
+
struct trace_t
{
/** Flash status. */
- uint8_t flash_status;
+ trace_status_t status;
+ /** Flash start address */
+ const uint32_t addr_start;
/** Flash address. */
- uint32_t flash_addr;
+ uint32_t addr;
/** Flash next sector */
- uint32_t flash_next_sector;
+ uint32_t next_sector;
};
typedef struct trace_t trace_t;
static trace_t trace_global;
-
-/** Verify the stat of the next sector.
- * If the next sector is not empty it shall send an erase command on the
- * sector of the flash memory.
+/** Erase the next sector on the Flash memory.
*/
static void
-trace_next_sector_prepare (void)
+trace_erase_next_sector (void)
{
- uint32_t addr_next;
- uint8_t data;
- if (trace_global.flash_status)
+ /* If the flash is enable and the start sector is not reached yet erase
+ * the sector. */
+ if (trace_global.status
+ && (flash_read (trace_global.next_sector) != 0xFF))
{
- addr_next = FLASH_PAGE(trace_global.flash_addr) + FLASH_PAGE_SIZE;
- data = flash_read (addr_next);
-
- if (data != 0XFF)
- flash_erase (FLASH_ERASE_4K, addr_next);
+ if (trace_global.next_sector != trace_global.addr_start)
+ {
+ /* Flash page size is equal to 4k. */
+ flash_erase (FLASH_ERASE_4K, trace_global.next_sector);
+ }
+ else
+ /* Disable the flash. */
+ trace_global.status = TRACE_STATUS_OFF;
}
}
@@ -91,27 +100,29 @@ trace_print_arg_4(uint32_t arg)
void
trace_init (void)
{
- uint8_t i;
- trace_global.flash_status = flash_init ();
+ int8_t i;
+ trace_global.status = flash_init ();
/* Get the first sector to write. */
- if (trace_global.flash_status)
+ if (trace_global.status)
{
- trace_global.flash_addr = flash_first_sector();
- trace_global.flash_next_sector =
- FLASH_PAGE (trace_global.flash_addr + FLASH_PAGE_SIZE);
+ trace_global.addr = flash_first_sector();
+ *((uint32_t *) &trace_global.addr_start) =
+ FLASH_PAGE(trace_global.addr);
+ trace_global.next_sector =
+ FLASH_PAGE (trace_global.addr + FLASH_PAGE_SIZE);
- /* If the next sector is not empty erase it. */
- trace_next_sector_prepare ();
+ /* If the next sector is the first one in the memory erase it. */
+ trace_erase_next_sector ();
/* Store the start code. */
- for (i = 0; i < 4; i ++)
- {
- flash_write (trace_global.flash_addr,
- v32_to_v8(TRACE_CODE_START, i));
- trace_global.flash_addr =
- FLASH_ADDRESS_INC(trace_global.flash_addr);
- }
+ for (i = 24; i >= 0; i -= 8)
+ {
+ flash_write (trace_global.addr,
+ TRACE_CODE_START >> i);
+ trace_global.addr =
+ FLASH_ADDRESS_INC(trace_global.addr);
+ }
}
}
@@ -119,24 +130,28 @@ void
trace_print (uint8_t arg)
{
/* Store the arg on flash */
- if (trace_global.flash_status)
+ if (trace_global.status)
{
- flash_write (trace_global.flash_addr, arg);
- trace_global.flash_addr = FLASH_ADDRESS_INC(trace_global.flash_addr);
+ uint32_t curr_sector;
+ flash_write (trace_global.addr, arg);
+ trace_global.addr = FLASH_ADDRESS_INC(trace_global.addr);
+
+ /* Compute the next sector address. */
+ curr_sector = trace_global.next_sector;
+ trace_global.next_sector = FLASH_PAGE (trace_global.addr +
+ FLASH_PAGE_SIZE);
+ if (curr_sector != trace_global.next_sector)
+ trace_erase_next_sector ();
}
-
- if ((trace_global.flash_next_sector - trace_global.flash_addr)
- < TRACE_MAX_ARGS)
- trace_next_sector_prepare ();
}
/** Get the current status of the trace module.
* \return 0x1 if the module is activate, 0x0 if the module is not active.
*/
-uint8_t
+trace_status_t
trace_status (void)
{
- return trace_global.flash_status;
+ return trace_global.status;
}
/** Get the current address.
@@ -145,5 +160,5 @@ trace_status (void)
uint32_t
trace_addr_current (void)
{
- return trace_global.flash_addr;
+ return trace_global.addr;
}
diff --git a/digital/avr/modules/trace/trace.h b/digital/avr/modules/trace/trace.h
index 7c3d8d5f..937e49a9 100644
--- a/digital/avr/modules/trace/trace.h
+++ b/digital/avr/modules/trace/trace.h
@@ -84,6 +84,8 @@
else if (sizeof(arg) == sizeof(uint32_t)) trace_print_arg_4(arg);\
}while (0)
+/* Forward declaration. */
+typedef enum trace_status_t trace_status_t;
/** Print an argument of one byte.
* \param arg the one byte argument to print.
@@ -119,7 +121,7 @@ trace_print (uint8_t arg);
/** Get the current status of the trace module.
* \return 0x1 if the module is activate, 0x0 if the module is not active.
*/
-uint8_t
+trace_status_t
trace_status (void);
/** Get the current address.