From ab2b97c9981345fadbcd2a6e82c84643bc471543 Mon Sep 17 00:00:00 2001 From: Nélio Laranjeiro Date: Wed, 28 Jan 2009 23:43:25 +0100 Subject: tal/avr/modules/trace: Implement the correct version of the trace (See #59). --- digital/avr/modules/trace/test/test_host/Makefile | 10 ++- digital/avr/modules/trace/test/test_host/events.h | 36 ++++++++ .../avr/modules/trace/test/test_host/flash_stub.c | 56 ------------- .../avr/modules/trace/test/test_host/test-trace.c | 71 +++++++++++----- digital/avr/modules/trace/trace.c | 97 +++++++++++++--------- digital/avr/modules/trace/trace.h | 4 +- 6 files changed, 154 insertions(+), 120 deletions(-) create mode 100644 digital/avr/modules/trace/test/test_host/events.h delete mode 100644 digital/avr/modules/trace/test/test_host/flash_stub.c (limited to 'digital/avr/modules/trace') 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/events.h b/digital/avr/modules/trace/test/test_host/events.h new file mode 100644 index 00000000..d5a972a1 --- /dev/null +++ b/digital/avr/modules/trace/test/test_host/events.h @@ -0,0 +1,36 @@ +#ifndef events_h +#define events_h +/* events_h */ +/* {{{ + * + * Copyright (C) 2008 APBTeam + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +enum events_t +{ + TRACE_ASSERV__RIGHT_MOTOR, + TRACE_ASSERV__LEFT_MOTOR, + TRACE_IA__IA_CMD, + TRACE_NB +}; + +#endif /* events_h */ diff --git a/digital/avr/modules/trace/test/test_host/flash_stub.c b/digital/avr/modules/trace/test/test_host/flash_stub.c deleted file mode 100644 index 849e3b34..00000000 --- a/digital/avr/modules/trace/test/test_host/flash_stub.c +++ /dev/null @@ -1,56 +0,0 @@ -/* flash_stub.c */ -/* avr.trace - AVR TRACE use. {{{ - * - * Copyright (C) 2008 Nélio Laranjeiro - * - * APBTeam: - * Web: http://apbteam.org/ - * Email: team AT apbteam DOT org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * }}} */ -#include "modules/flash/flash.h" -#include - -uint8_t -flash_init (void) -{ - return 0x1; -} - -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) -{ -} 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 +#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. -- cgit v1.2.3