From ee5a468417fb6810a5bbe4d46617618a9ddb588a Mon Sep 17 00:00:00 2001 From: NĂ©lio Laranjeiro Date: Thu, 7 May 2009 10:07:49 +0200 Subject: * digital/avr/modules/trace: (See #67) * Adapted the trace module to: * Find the last trace in order to start the new one, trace_i = trace_i-1 + 1 * A quarter of the flash is completely erased on the trace init to be used in the future. * Removed the start code useless from now. * tools/trace: * Update the python scripts to use the new trace implementation. --- .../modules/trace/test/test_target/test-trace.c | 112 +++++++++++---------- digital/avr/modules/trace/trace.c | 102 ++++++++++--------- 2 files changed, 113 insertions(+), 101 deletions(-) (limited to 'digital/avr/modules/trace') diff --git a/digital/avr/modules/trace/test/test_target/test-trace.c b/digital/avr/modules/trace/test/test_target/test-trace.c index 4dbbebf4..7938103b 100644 --- a/digital/avr/modules/trace/test/test_target/test-trace.c +++ b/digital/avr/modules/trace/test/test_target/test-trace.c @@ -33,49 +33,48 @@ #include "modules/utils/byte.h" #include "modules/uart/uart.h" -void -flash_dump_full (void) -{ - uint8_t buffer [BUFFER_SIZE]; - uint32_t i; - uint8_t state; - - /* Initialise the flash memory to read .*/ - state = flash_init (); - proto_send1b ('s', state); - - if (state) - { - for (i = 0; i < FLASH_ADDRESS_HIGH + 1; - i += sizeof (buffer)) - { - flash_read_array (i, buffer, sizeof (buffer)); - proto_send ('r', sizeof(buffer), buffer); - } - } -} +#include "events.h" void -flash_dump_sector (uint32_t addr) +flood (void) { - uint8_t buffer [BUFFER_SIZE]; - uint32_t i; - uint8_t state; + uint32_t addr; + uint32_t count; + + uint32_t speed; + uint32_t position; + uint16_t acc; + uint16_t arg1; + uint16_t arg2; + uint32_t arg3; + + /* Initialise the trace module. */ + trace_init (); - /* Initialise the flash memory to read .*/ - state = flash_init (); - proto_send1b ('s', state); + /* Get the start page address of the trace module. */ + addr = trace_addr_current (); + proto_send3b ('a', addr >> 16, addr >> 8, addr); - if (state) + /* Flood the flash memory with traces. */ + /* A little more than 3 memory sectors, a sector is 4 kbytes. */ + for (count = 0; count < 2000; count ++) { - for (i = FLASH_PAGE (addr); i < FLASH_PAGE (addr) + FLASH_PAGE_SIZE; - i += sizeof (buffer)) - { - flash_read_array (i, buffer, sizeof (buffer)); - proto_send ('r', sizeof(buffer), buffer); - } + /* Right motor. */ + speed = 1; + position = 2; + acc = 3; + arg1 = 1; + arg2 = 2; + arg3 = 3; + TRACE (TRACE_ASSERV__RIGHT_MOTOR, speed, position, acc); + TRACE (TRACE_ASSERV__LEFT_MOTOR, speed, position, acc); + TRACE (TRACE_IA__IA_CMD, arg1, arg2, arg3); } + + /* Print the end of the address. */ + addr = trace_addr_current (); + proto_send3b ('a', addr >> 16, addr >> 8, addr); } void @@ -84,6 +83,7 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) /* May be unused. */ uint32_t addr = v8_to_v32 (0, args[0], args[1], args[2]); uint8_t buf[16]; + uint8_t error = 0; #define c(cmd, size) (cmd << 8 | size) switch (c (cmd, size)) { @@ -95,10 +95,10 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) /* Erase full */ flash_erase (FLASH_ERASE_FULL, 0); break; - case c ('e', 3): - /* Erase 4k: - * - 3b: address. */ - flash_erase (FLASH_ERASE_4K, addr); + case c ('e', 4): + /* Erase the flash from the address addr and with the hexa code to + * erase.*/ + flash_erase (args[3], addr); break; case c ('i', 0): /* Initialise the trace module. */ @@ -107,14 +107,6 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) addr = trace_addr_current (); proto_send3b ('a', addr >> 16, addr >> 8, addr); break; - case c ('d', 0): - /* Dump full memory. */ - flash_dump_full (); - break; - case c ('d', 3): - /* Dump a full sector. */ - flash_dump_sector (addr); - break; case c ('t', 2): /* Trace data: * - 1b: id. @@ -131,20 +123,32 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) * - 3b: address. * - 1b: number of bytes. */ if (args[3] > sizeof (buf)) - { - proto_send0 ('?'); - return; - } + { + proto_send0 ('?'); + return; + } else { flash_read_array (addr, buf, args[3]); proto_send ('r', args[3], buf); } break; + case c ('f', 0): + /* Flood the memory with 3 sectors. + */ + flood (); + break; default: - /* Error */ - proto_send0 ('?'); - return; + if (cmd == 'l') + { + error = flash_log (size, args); + } + else if (error || (cmd != 'l')) + { + /* Error */ + proto_send0 ('?'); + return; + } } /* Acknowledge what has been done */ proto_send (cmd, size, args); diff --git a/digital/avr/modules/trace/trace.c b/digital/avr/modules/trace/trace.c index e904c2fa..37288ee1 100644 --- a/digital/avr/modules/trace/trace.c +++ b/digital/avr/modules/trace/trace.c @@ -23,51 +23,33 @@ * * }}} */ #include "common.h" +#include "modules/utils/utils.h" #include "modules/utils/byte.h" +#include "modules/proto/proto.h" #include "modules/flash/flash.h" #include "trace.h" -#define TRACE_CODE_START FLASH_LOG_CODE - #define TRACE_ARGS_MAX 6 #define TRACE_MAX_ARGS (TRACE_ARGS_MAX * TRACE_ARGS_MAX) +#define TRACE_BLOCK_SIZE_BYTES 65536 +#define TRACE_PAGE 0x80000 +#define TRACE_PAGE_BLOCKS (TRACE_PAGE / TRACE_BLOCK_SIZE_BYTES) +#define TRACE_PAGE_PAGE_NB (FLASH_SIZE / TRACE_PAGE) + struct trace_t { - /** Flash status. */ +/** Flash status. */ trace_status_t status; /** Flash start address */ const uint32_t addr_start; /** Flash address. */ uint32_t addr; - /** Flash next sector */ - uint32_t next_sector; }; typedef struct trace_t trace_t; static trace_t trace_global; -/** Erase the next sector on the Flash memory. - */ -static void -trace_erase_next_sector (void) -{ - /* 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)) - { - 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; - } -} - void trace_print_arg_1(uint8_t arg) { @@ -90,31 +72,62 @@ trace_print_arg_4(uint32_t arg) trace_print (arg); } +static inline void +trace_erase_page (uint32_t addr) +{ + uint8_t i; + while (flash_is_busy ()); + for (i = 0; i < TRACE_PAGE_BLOCKS; i++) + { + flash_erase (FLASH_ERASE_64K, addr); + addr += TRACE_BLOCK_SIZE_BYTES; + } +} uint8_t trace_init (void) { int8_t i; + uint8_t new_trace_val = 0x0; + uint32_t new_trace_addr = 0; + trace_global.status = flash_init (); /* Get the first sector to write. */ if (trace_global.status) { - 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 the first one in the memory erase it. */ - trace_erase_next_sector (); + uint8_t val = 0; + /* Find the possible traces. */ + for (i = 0; i < TRACE_PAGE_PAGE_NB; i++) + { + val = flash_read (i * TRACE_PAGE); + if (lesseq_mod8(new_trace_val, val)) + { + proto_send0 ('e'); + new_trace_val = val; + new_trace_addr = i * TRACE_PAGE; + } + } + new_trace_addr &= FLASH_ADDRESS_HIGH; - /* Store the start code. */ - for (i = 4; i; i--) + /* Flash not empty */ + if (!((new_trace_val == 0x0) && (new_trace_addr == 0))) { - flash_write (trace_global.addr, v32_to_v8(TRACE_CODE_START, i-1)); - trace_global.addr = FLASH_ADDRESS_INC(trace_global.addr); + proto_send0 ('h'); + new_trace_addr = (new_trace_addr + TRACE_PAGE) + & FLASH_ADDRESS_HIGH; + + /* Erase it. */ + trace_erase_page (new_trace_addr); } + new_trace_val ++; + proto_send1b ('v', new_trace_val); + *((uint32_t*) &trace_global.addr_start) = new_trace_addr; + + /* Store the trace val. */ + flash_write (new_trace_addr, new_trace_val); + trace_global.addr = new_trace_addr + 1; + return TRACE_STATUS_ON; } return TRACE_STATUS_OFF; @@ -126,16 +139,11 @@ trace_print (uint8_t arg) /* Store the arg on flash */ if (trace_global.status) { - 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 (); + trace_global.addr ++; + + if (trace_global.addr == (trace_global.addr_start + TRACE_PAGE)) + trace_global.status = TRACE_STATUS_OFF; } } -- cgit v1.2.3