diff --git a/Makefile.include b/Makefile.include index 023bb711b..fb215a404 100644 --- a/Makefile.include +++ b/Makefile.include @@ -60,8 +60,8 @@ CFLAGS += -DCONTIKI=1 -DCONTIKI_TARGET_$(TARGET_UPPERCASE)=1 include $(CONTIKI)/core/net/rime/Makefile.rime include $(CONTIKI)/core/net/mac/Makefile.mac -SYSTEM = process.c procinit.c autostart.c elfloader.c profile.c \ - timetable.c timetable-aggregate.c compower.c serial-line.c +SYSTEM = process.c procinit.c autostart.c elfloader.c \ + compower.c serial-line.c THREADS = mt.c LIBS = memb.c mmem.c timer.c list.c etimer.c ctimer.c energest.c rtimer.c stimer.c trickle-timer.c \ print-stats.c ifft.c crc16.c random.c checkpoint.c ringbuf.c settings.c diff --git a/core/sys/profile-aggregates.c b/core/sys/profile-aggregates.c deleted file mode 100644 index 93855474c..000000000 --- a/core/sys/profile-aggregates.c +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2007, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - */ - -/** - * \file - * Compuation of aggregates for the Contiki profiling system - * \author - * Adam Dunkels - */ - -#include "sys/profile.h" - -#include -#include - -struct aggregate { - const char *ptr; - unsigned short episodes; - unsigned long cycles; -}; - -#define DETAILED_AGGREGATES 0 - -#define MAX_CATEGORIES 32 -#define LIST_LEN 100 - -static struct aggregate aggregates[LIST_LEN]; - -static int aggregates_list_ptr = 0; - -/*---------------------------------------------------------------------------*/ -static struct aggregate * -find_aggregate_category(const uint16_t cat) -{ - int i; - uint16_t acat; - -/* printf("find_aggregate_category 0x%04x %c%c\n", */ -/* cat, cat >> 8, cat & 0xff); */ - - for(i = 0; i < aggregates_list_ptr; ++i) { - acat = (aggregates[i].ptr[0] << 8) + aggregates[i].ptr[1]; - -/* printf("acat 0x%04x %c%c\n", */ -/* acat, acat >> 8, acat & 0xff); */ - - if(acat == cat) { - return &aggregates[i]; - } - } - - if(i == LIST_LEN) { - return NULL; - } - - aggregates[aggregates_list_ptr].ptr = NULL; - return &aggregates[aggregates_list_ptr++]; -} -/*---------------------------------------------------------------------------*/ -#if DETAILED_AGGREGATES -static struct aggregate * -find_aggregate(const unsigned char *ptr) -{ - int i; - for(i = 0; i < aggregates_list_ptr; ++i) { - if(aggregates[i].ptr == ptr) { - return &aggregates[i]; - } - } - if(i == LIST_LEN) { - return NULL; - } - - return &aggregates[aggregates_list_ptr++]; -} -#endif /* DETAILED_AGGREGATES */ -/*---------------------------------------------------------------------------*/ -void -profile_aggregates_print(void) -{ - int i; - -#if DETAILED_AGGREGATES - for(i = 0; i < aggregates_list_ptr; ++i) { - printf("-- %s: %lu / %u = %lu\n", aggregates[i].ptr, - aggregates[i].cycles, - aggregates[i].episodes, - aggregates[i].cycles / aggregates[i].episodes); - } -#else - for(i = 0; i < aggregates_list_ptr; ++i) { - printf("-- %c%c: %lu / %u = %lu\n", - aggregates[i].ptr[0], aggregates[i].ptr[1], - aggregates[i].cycles, - aggregates[i].episodes, - aggregates[i].cycles / aggregates[i].episodes); - } -#endif - - printf("Memory for aggregates: %d * %d = %d\n", - (int)sizeof(struct aggregate), aggregates_list_ptr, - (int)sizeof(struct aggregate) * aggregates_list_ptr); -} -/*---------------------------------------------------------------------------*/ -#if DETAILED_AGGREGATES -static void -detailed_profile_aggregates_compute(void) -{ - int i; - rtimer_clock_t t; - /* const char *str = "profile_aggregates_compute"; - - PROFILE_TIMESTAMP(str);*/ - - t = profile_timestamps[0].time; - - for(i = 1; i < PROFILE_TIMESTAMP_PTR; ++i) { - struct aggregate *a; - a = find_aggregate(profile_timestamps[i - 1].ptr); - if(a == NULL) { - /* The list is full, skip this entry */ - printf("profile_aggregates_compute: list full\n"); - } else if(a->ptr == NULL) { - a->ptr = profile_timestamps[i - 1].ptr; - a->cycles = (unsigned long)(profile_timestamps[i].time - t); - a->episodes = 1; - } else { - a->cycles += (unsigned long)(profile_timestamps[i].time - t); - a->episodes++; - } - t = profile_timestamps[i].time; - } - - /* PROFILE_TIMESTAMP(str);*/ - - /*printf("Aggregating time %u, len %d, list len %d, overhead %d\n", - profile_timediff(str, str), PROFILE_TIMESTAMP_PTR, - aggregates_list_ptr, profile_timestamp_time);*/ - - - /* print_aggregates();*/ -} -#endif /* DETAILED_AGGREGATES */ -/*---------------------------------------------------------------------------*/ -static void -category_profile_aggregates_compute(void) -{ - int i,j; - rtimer_clock_t t; - uint16_t categories[MAX_CATEGORIES]; - int categories_ptr = 0; - /* const char *str = "profile_aggregates_compute"; - - PROFILE_TIMESTAMP(str);*/ - - t = profile_timestamps[0].time; - - for(i = 1; i < PROFILE_TIMESTAMP_PTR; ++i) { - struct aggregate *a; - uint16_t cat; - -/* printf("category_profile_aggregates_compute %s\n", */ -/* profile_timestamps[i - 1].ptr); */ - cat = (profile_timestamps[i - 1].ptr[0] << 8) + - (profile_timestamps[i - 1].ptr[1] & 0xff); - a = find_aggregate_category(cat); - if(a == NULL) { - /* The list is full, skip this entry */ - printf("profile_aggregates_compute: list full\n"); - } else if(a->ptr == NULL) { - a->ptr = profile_timestamps[i - 1].ptr; - a->cycles = (unsigned long)(profile_timestamps[i].time - t - profile_timestamp_time); - a->episodes = 1; - } else { - - a->cycles += (unsigned long)(profile_timestamps[i].time - t - profile_timestamp_time); - - /* Make sure that we only update the episodes of each category - once per run. We keep track of all updated categories in the - "categories" array. If the category is already present in the - array, we do not update it. Otherwise, we insert the category - in the array and update the episodes counter of the - category. */ - - for(j = 0; j < categories_ptr; ++j) { - if(categories[j] == cat) { - break; - } - } - if(j == categories_ptr) { - categories[j] = cat; - categories_ptr++; - a->episodes++; - } - } - t = profile_timestamps[i].time; - } - - /* PROFILE_TIMESTAMP(str);*/ - - /*printf("Aggregating time %u, len %d, list len %d, overhead %d\n", - profile_timediff(str, str), PROFILE_TIMESTAMP_PTR, - aggregates_list_ptr, profile_timestamp_time);*/ - - - /* print_aggregates();*/ -} -/*---------------------------------------------------------------------------*/ -void -profile_aggregates_compute(void) -{ -#if DETAILED_AGGREGATES - detailed_profile_aggregates_compute(); -#else - category_profile_aggregates_compute(); -#endif -} -/*---------------------------------------------------------------------------*/ diff --git a/core/sys/profile.c b/core/sys/profile.c deleted file mode 100644 index bff83c813..000000000 --- a/core/sys/profile.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2007, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - */ - -/** - * \file - * Implementation of the Contiki profiling system - * \author - * Adam Dunkels - */ - -#include "sys/profile.h" -#include "sys/clock.h" - -#include - -/* XXX: the profiling code is under development and may not work at - present. */ - - -TIMETABLE_NONSTATIC(profile_timetable); - -TIMETABLE_NONSTATIC(profile_begin_timetable); -TIMETABLE_NONSTATIC(profile_end_timetable); -TIMETABLE_AGGREGATE(profile_aggregate, PROFILE_AGGREGATE_SIZE); - -static rtimer_clock_t episode_start_time; -static unsigned int invalid_episode_overflow, invalid_episode_toolong, - max_queuelen; - -/* The number of fine grained ticks per coarse grained ticks. We - currently (MSP430) have 2457600 ticks per second for the fine - grained timer, and 32678 / 8 ticks per second for the coarse. */ -#define XXX_HACK_FINE_TICKS_PER_COARSE_TICK (2457600/(32678/8)) - -/*---------------------------------------------------------------------------*/ -void -profile_init(void) -{ - timetable_init(); - timetable_clear(&profile_begin_timetable); - timetable_clear(&profile_end_timetable); -} -/*---------------------------------------------------------------------------*/ -void -profile_episode_start(void) -{ - struct timetable_timestamp *e; - timetable_clear(&profile_begin_timetable); - timetable_clear(&profile_end_timetable); - episode_start_time = clock_time(); - - e = timetable_entry(&profile_begin_timetable, - PROFILE_TIMETABLE_SIZE - 1); - if(e != NULL) { - e->id = NULL; - } - e = timetable_entry(&profile_end_timetable, - PROFILE_TIMETABLE_SIZE - 1); - if(e != NULL) { - e->id = NULL; - } -} -/*---------------------------------------------------------------------------*/ -void -profile_episode_end(void) -{ - struct timetable_timestamp *e; - rtimer_clock_t episode_end_time = clock_time(); - -/* printf("timetable_episode_end start %u, end %u, max time %u\n", episode_start_time, episode_end_time, 65536/FINE_TICKS_PER_COARSE_TICK); */ - e = timetable_entry(&profile_begin_timetable, - PROFILE_TIMETABLE_SIZE - 1); - if(e != NULL && e->id != NULL) { - /* Invalid episode because of list overflow. */ - invalid_episode_overflow++; - max_queuelen = PROFILE_TIMETABLE_SIZE; - } else if(episode_end_time - episode_start_time > - 65536/XXX_HACK_FINE_TICKS_PER_COARSE_TICK) { - /* Invalid episode because of timer overflow. */ - invalid_episode_toolong++; - } else { - /* Compute aggregates. */ - if(timetable_ptr(&profile_begin_timetable) > max_queuelen) { - max_queuelen = timetable_ptr(&profile_begin_timetable); - } - /* timetable_aggregates_compute();*/ - } -} -/*---------------------------------------------------------------------------*/ -/* - * - * Find a specific aggregate ID in the list of aggregates. - * - */ -static struct timetable_aggregate_entry * -find_aggregate(struct timetable_aggregate *a, - const char *id) -{ - int i; - for(i = 0; i < a->ptr; ++i) { - if(a->entries[i].id == id) { - return &a->entries[i]; - } - } - if(i == a->size) { - return NULL; - } - a->entries[a->ptr].id = NULL; - return &a->entries[a->ptr++]; -} -/*---------------------------------------------------------------------------*/ -void -profile_aggregate_print_detailed(void) -{ - int i; - struct timetable_aggregate *a = &profile_aggregate; - - /* printf("timetable_aggregate_print_detailed: a ptr %d\n", a->ptr);*/ - for(i = 0; i < a->ptr; ++i) { - printf("-- %s: %lu / %u = %lu\n", a->entries[i].id, - a->entries[i].time, - a->entries[i].episodes, - a->entries[i].time / a->entries[i].episodes); - } - - printf("Memory for entries: %d * %d = %d\n", - (int)sizeof(struct timetable_aggregate), a->ptr, - (int)sizeof(struct timetable_aggregate) * a->ptr); -} -/*---------------------------------------------------------------------------*/ -void -profile_aggregate_compute_detailed(void) -{ - int i; - int last; - rtimer_clock_t t; - struct timetable_aggregate *a = &profile_aggregate; - struct timetable *timetable = &profile_timetable; - struct timetable_aggregate_entry *entry; - - last = timetable_ptr(&profile_begin_timetable); - t = profile_begin_timetable.timestamps[0].time; - for(i = 0; i < last; ++i) { - - entry = find_aggregate(a, profile_begin_timetable.timestamps[i].id); - if(entry == NULL) { - /* The list is full, skip this entry */ - /* printf("detailed_timetable_aggregate_compute: list full\n");*/ - } else if(entry->id == NULL) { - /* The id was found in the list, so we add it. */ - entry->id = timetable->timestamps[i - 1].id; - entry->time = (unsigned long)(timetable->timestamps[i].time - t - - timetable_timestamp_time); - entry->episodes = 1; - /* printf("New entry %s %lu\n", entry->id, entry->time);*/ - } else { - entry->time += (unsigned long)(timetable->timestamps[i].time - t - - timetable_timestamp_time); - entry->episodes++; - } - t = timetable->timestamps[i].time; - /* printf("a ptr %d\n", a->ptr);*/ - - } - -} -/*---------------------------------------------------------------------------*/ diff --git a/core/sys/profile.h b/core/sys/profile.h deleted file mode 100644 index 9bf6866db..000000000 --- a/core/sys/profile.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2007, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - */ - -/** - * \file - * Header file for the Contiki profiling system - * \author - * Adam Dunkels - */ - -#ifndef __PROFILE_H__ -#define __PROFILE_H__ - -/* XXX: the profiling code is under development and may not work at - present. */ - -#define TIMETABLE_WITH_TYPE 1 -#include "sys/timetable.h" - -#ifdef PROFILE_CONF_TIMETABLE_SIZE -#define PROFILE_TIMETABLE_SIZE PROFILE_CONF_TIMETABLE_SIZE -#else -#define PROFILE_TIMETABLE_SIZE 128 -#endif - -#ifdef PROFILE_CONF_AGGREGATE_SIZE -#define PROFILE_AGGREGATE_SIZE PROFILE_CONF_AGGREGATE_SIZE -#else -#define PROFILE_AGGREGATE_SIZE 128 -#endif - -#define PROFILE_BEGIN(id) TIMETABLE_TIMESTAMP_TYPE(profile_timetable, id, 1) -#define PROFILE_END(id) TIMETABLE_TIMESTAMP_TYPE(profile_timetable, id, 2) - -/*#define PROFILE_COND_BEGIN(cond, id) TIMETABLE_COND_TIMESTAMP(profile_begin_timetable, \ - cond, id) -#define PROFILE_COND_END(cond, id) TIMETABLE_COND_TIMESTAMP(profile_end_timetable, \ - cond, id) -*/ - -#define profile_begin_timetable_size PROFILE_TIMETABLE_SIZE -TIMETABLE_DECLARE(profile_begin_timetable); -#define profile_end_timetable_size PROFILE_TIMETABLE_SIZE -TIMETABLE_DECLARE(profile_end_timetable); - -#define profile_timetable_size PROFILE_TIMETABLE_SIZE -TIMETABLE_DECLARE(profile_timetable); - -void profile_init(void); - -void profile_episode_start(void); -void profile_episode_end(void); - -void profile_aggregate_print_detailed(void); -void profile_aggregate_compute_detailed(void); - - -#endif /* __PROFILE_H__ */ diff --git a/core/sys/timetable-aggregate.c b/core/sys/timetable-aggregate.c deleted file mode 100644 index fb647f3ce..000000000 --- a/core/sys/timetable-aggregate.c +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (c) 2008, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - */ - -/** - * \file - * A brief description of what this file is. - * \author - * Adam Dunkels - */ - -#include "sys/timetable-aggregate.h" - -#define XXX_HACK_MAX_CATEGORIES 32 - -#include - -/*---------------------------------------------------------------------------*/ -/* - * - * Find an aggregation category in the list of aggregates. If the - * category could not be found, the function returns a pointer to an - * empty entry. If the list is full, the function returns NULL. - * - */ -static struct timetable_aggregate_entry * -find_aggregate_category(struct timetable_aggregate *a, - const uint16_t cat) -{ - int i; - uint16_t acat; - - for(i = 0; i < a->ptr; ++i) { - acat = (a->entries[i].id[0] << 8) + a->entries[i].id[1]; - if(acat == cat) { - - return &a->entries[i]; - } - } - - if(i == a->size) { - return NULL; - } - - a->entries[a->ptr].id = NULL; - return &a->entries[a->ptr++]; -} -/*---------------------------------------------------------------------------*/ -/* - * - * Find a specific aggregate ID in the list of aggregates. - * - */ -static struct timetable_aggregate_entry * -find_aggregate(struct timetable_aggregate *a, - const char *id) -{ - int i; - for(i = 0; i < a->ptr; ++i) { - if(a->entries[i].id == id) { - return &a->entries[i]; - } - } - if(i == a->size) { - return NULL; - } - a->entries[a->ptr].id = NULL; - return &a->entries[a->ptr++]; -} -/*---------------------------------------------------------------------------*/ -void -timetable_aggregate_print_detailed(struct timetable_aggregate *a) -{ - int i; - /* printf("timetable_aggregate_print_detailed: a ptr %d\n", a->ptr);*/ - for(i = 0; i < a->ptr; ++i) { - printf("-- %s: %lu / %u = %lu\n", a->entries[i].id, - a->entries[i].time, - a->entries[i].episodes, - a->entries[i].time / a->entries[i].episodes); - } - - printf("Memory for entries: %d * %d = %d\n", - (int)sizeof(struct timetable_aggregate), a->ptr, - (int)sizeof(struct timetable_aggregate) * a->ptr); -} -/*---------------------------------------------------------------------------*/ -void -timetable_aggregate_reset(struct timetable_aggregate *a) -{ - int i; - for(i = 0; i < a->ptr; ++i) { - a->entries[i].time = 0; - a->entries[i].episodes = 0; - } -} -/*---------------------------------------------------------------------------*/ -void -timetable_aggregate_print_categories(struct timetable_aggregate *a) -{ - int i; - - /* printf("timetable_aggregate_print_categories: a ptr %d\n", a->ptr);*/ - for(i = 0; i < a->ptr; ++i) { - printf("-- %c%c: %lu / %u = %lu\n", - a->entries[i].id[0], a->entries[i].id[1], - a->entries[i].time, - a->entries[i].episodes, - a->entries[i].time / a->entries[i].episodes); - } - - printf("Memory for entries: %d * %d = %d\n", - (int)sizeof(struct timetable_aggregate), a->ptr, - (int)sizeof(struct timetable_aggregate) * a->ptr); -} -/*---------------------------------------------------------------------------*/ -void -timetable_aggregate_compute_detailed(struct timetable_aggregate *a, - struct timetable *timetable) -{ - unsigned int i; - rtimer_clock_t t; - - t = timetable->timestamps[0].time; - - for(i = 1; i < *timetable->ptr; ++i) { - struct timetable_aggregate_entry *entry; - entry = find_aggregate(a, timetable->timestamps[i - 1].id); - if(entry == NULL) { - /* The list is full, skip this entry */ - /* printf("detailed_timetable_aggregate_compute: list full\n");*/ - } else if(entry->id == NULL) { - /* The id was found in the list, so we add it. */ - entry->id = timetable->timestamps[i - 1].id; - entry->time = (unsigned long)(timetable->timestamps[i].time - t - - timetable_timestamp_time); - entry->episodes = 1; - /* printf("New entry %s %lu\n", entry->id, entry->time);*/ - } else { - entry->time += (unsigned long)(timetable->timestamps[i].time - t - - timetable_timestamp_time); - entry->episodes++; - } - t = timetable->timestamps[i].time; - /* printf("a ptr %d\n", a->ptr);*/ - } -} -/*---------------------------------------------------------------------------*/ -void -timetable_aggregate_compute_categories(struct timetable_aggregate *a, - struct timetable *timetable) -{ - unsigned int i; - int j; - rtimer_clock_t t; - uint16_t categories[XXX_HACK_MAX_CATEGORIES]; - int categories_ptr = 0; - - t = timetable->timestamps[0].time; - - for(i = 1; i < *timetable->ptr; ++i) { - struct timetable_aggregate_entry *entry; - uint16_t cat; - - /* printf("category_timetable_aggregate_compute %s %d\n", - timetable->timestamps[i - 1].id, i);*/ - cat = (timetable->timestamps[i - 1].id[0] << 8) + - (timetable->timestamps[i - 1].id[1] & 0xff); - entry = find_aggregate_category(a, cat); - if(entry == NULL) { - /* The list is full, skip this entry */ - /* printf("category_timetable_aggregate_compute: list full\n");*/ - } else if(entry->id == NULL) { - /* The category was not found in the list, so we add it. */ - entry->id = timetable->timestamps[i - 1].id; - entry->time = (unsigned long)(timetable->timestamps[i].time - t - - timetable_timestamp_time); - entry->episodes = 1; - /* printf("New category %c%c time %lu\n", - timetable->timestamps[i - 1].id[0], - timetable->timestamps[i - 1].id[1], entry->time);*/ - } else { - - entry->time += (unsigned long)(timetable->timestamps[i].time - t - - timetable_timestamp_time); - /* printf("Adding time to %c%c time %lu\n", - timetable->timestamps[i - 1].id[0], - timetable->timestamps[i - 1].id[1], entry->time);*/ - - /* Make sure that we only update the episodes of each category - once per run. We keep track of all updated categories in the - "categories" array. If the category is already present in the - array, we do not update it. Otherwise, we insert the category - in the array and update the episodes counter of the - category. */ - - for(j = 0; j < categories_ptr; ++j) { - if(categories[j] == cat) { - break; - } - } - if(j == categories_ptr) { - categories[j] = cat; - categories_ptr++; - entry->episodes++; - } - } - t = timetable->timestamps[i].time; - } -} -/*---------------------------------------------------------------------------*/ diff --git a/core/sys/timetable-aggregate.h b/core/sys/timetable-aggregate.h deleted file mode 100644 index 969f81c0d..000000000 --- a/core/sys/timetable-aggregate.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2008, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - */ - -/** - * \file - * A brief description of what this file is. - * \author - * Adam Dunkels - */ - -#ifndef __TIMETABLE_AGGREGATE_H__ -#define __TIMETABLE_AGGREGATE_H__ - -#include "sys/timetable.h" -#include "sys/cc.h" - -struct timetable_aggregate_entry { - const char *id; - unsigned short episodes; - unsigned long time; -}; - -struct timetable_aggregate { - struct timetable_aggregate_entry *entries; - int ptr; - const int size; -}; - - -#define TIMETABLE_AGGREGATE_DECLARE(name) \ -struct timetable_aggregate name - - -#define TIMETABLE_AGGREGATE(name, size) \ -static struct timetable_aggregate_entry CC_CONCAT(name,_entries)[size]; \ -static struct timetable_aggregate name = { \ - CC_CONCAT(name,_entries), \ - 0, \ - size \ -} - -#define TIMETABLE_AGGREGATE_NONSTATIC(name, size) \ -static struct timetable_aggregate_entry CC_CONCAT(name,_entries)[size]; \ -struct timetable_aggregate name = { \ - CC_CONCAT(name,_entries), \ - 0, \ - size \ -} - -void timetable_aggregate_print_detailed(struct timetable_aggregate *a); - -void timetable_aggregate_print_categories(struct timetable_aggregate *a); - -void timetable_aggregate_reset(struct timetable_aggregate *a); - -void timetable_aggregate_compute_detailed(struct timetable_aggregate *a, - struct timetable *timetable); -void timetable_aggregate_compute_categories(struct timetable_aggregate *a, - struct timetable *timetable); - - - -#endif /* __TIMETABLE_AGGREGATE_H__ */ diff --git a/core/sys/timetable.c b/core/sys/timetable.c deleted file mode 100644 index 40766a62c..000000000 --- a/core/sys/timetable.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2008, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - */ - -/** - * \file - * Implementation of timetable, a data structure containing timestamps for events - * \author - * Adam Dunkels - */ -#include "sys/clock.h" -#include "sys/timetable.h" - -#include - -rtimer_clock_t timetable_timestamp_time; - - -/*---------------------------------------------------------------------------*/ -struct timetable_timestamp * -timetable_entry(struct timetable *t, int num) -{ - if(t == NULL) { - return NULL; - } - return &(t->timestamps[num]); -} -/*---------------------------------------------------------------------------*/ -int -timetable_ptr(struct timetable *t) -{ - return *t->ptr; -} -/*---------------------------------------------------------------------------*/ -void -timetable_clear(struct timetable *t) -{ - *t->ptr = 0; -} -/*---------------------------------------------------------------------------*/ -rtimer_clock_t -timetable_timediff(struct timetable *t, - const char *id1, const char *id2) -{ -#ifdef SDCC_mcs51 - char i; /* SDCC tracker 2982753 */ -#else - int i; -#endif - int t1, t2; - - t1 = t2 = t->size; - - for(i = *t->ptr - 1; i >= 0; --i) { - if(t->timestamps[i].id == id1) { - t1 = i; - break; - } - } - - for(i = i - 1; i >= 0; --i) { - if(t->timestamps[i].id == id2) { - t2 = i; - break; - } - } - if(t1 != t->size && t2 != t->size) { - return t->timestamps[t1].time - t->timestamps[t2].time; - } - - return 0; -} -/*---------------------------------------------------------------------------*/ -void -timetable_init(void) -{ - char dummy1, dummy2; -#define temp_size 4 - TIMETABLE_STATIC(temp); - - timetable_clear(&temp); - - /* Measure the time for taking a timestamp. */ - TIMETABLE_TIMESTAMP(temp, &dummy1); - TIMETABLE_TIMESTAMP(temp, &dummy2); - timetable_timestamp_time = timetable_timediff(&temp, &dummy1, &dummy2); -} -/*---------------------------------------------------------------------------*/ -void -timetable_print(struct timetable *t) -{ - unsigned int i; - int time; - - time = t->timestamps[0].time; - - printf("---\n"); - for(i = 1; i < *t->ptr; ++i) { - printf("%s: %u\n", t->timestamps[i - 1].id, t->timestamps[i].time - time); - time = t->timestamps[i].time; - } -} -/*---------------------------------------------------------------------------*/ diff --git a/core/sys/timetable.h b/core/sys/timetable.h deleted file mode 100644 index 350d3d950..000000000 --- a/core/sys/timetable.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2008, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - */ - -/** - * \file - * A brief description of what this file is. - * \author - * Adam Dunkels - */ - -#ifndef __TIMETABLE_H__ -#define __TIMETABLE_H__ - -#include "sys/cc.h" -#include "sys/rtimer.h" - - -struct timetable_timestamp { - const char *id; - rtimer_clock_t time; -#if TIMETABLE_WITH_TYPE - uint8_t type; -#endif /* TIMETABLE_WITH_TYPE */ -}; -struct timetable { - struct timetable_timestamp *timestamps; - const int size; - unsigned int * const ptr; -}; - -#define TIMETABLE_NONSTATIC(name) \ -struct timetable_timestamp CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_size)]; \ -unsigned int CC_CONCAT(name,_ptr); \ -struct timetable name = { \ - CC_CONCAT(name,_timestamps), \ - CC_CONCAT(name,_size), \ - &CC_CONCAT(name,_ptr)} - -#define TIMETABLE_STATIC(name) \ -static struct timetable_timestamp CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_size)]; \ -static unsigned int CC_CONCAT(name,_ptr); \ -static struct timetable name = { \ - CC_CONCAT(name,_timestamps), \ - CC_CONCAT(name,_size), \ - &CC_CONCAT(name,_ptr)} - -#define TIMETABLE_DECLARE(name) \ -extern unsigned int CC_CONCAT(name,_ptr); \ -extern struct timetable_timestamp CC_CONCAT(name, _timestamps)[CC_CONCAT(name,_size)]; \ -extern struct timetable name - -#define TIMETABLE(name) TIMETABLE_STATIC(name) - -#define TIMETABLE_TIMESTAMP(name, str) \ -do { \ - CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].id = str; \ - CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].time = RTIMER_NOW(); \ - CC_CONCAT(name,_ptr) = (CC_CONCAT(name,_ptr) + 1) % \ - CC_CONCAT(name,_size); \ -} while(0) - -#if TIMETABLE_WITH_TYPE -#define TIMETABLE_TIMESTAMP_TYPE(name, str, t) \ -do { \ - CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].id = str; \ - CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].type = t; \ - CC_CONCAT(name,_timestamps)[CC_CONCAT(name,_ptr)].time = RTIMER_NOW(); \ - CC_CONCAT(name,_ptr) = (CC_CONCAT(name,_ptr) + 1) % \ - CC_CONCAT(name,_size); \ -} while(0) -#else /* TIMETABLE_WITH_TYPE */ -#define TIMETABLE_TIMESTAMP_TYPE(name, str, t) TIMETABLE_TIMESTAMP(name, str) -#endif /* TIMETABLE_WITH_TYPE */ - - -#define TIMETABLE_RESUME(name,num) \ - TIMETABLE_TIMESTAMP(CC_CONCAT(name,_timestamps[num].id)) - -#define TIMETABLE_COND_TIMESTAMP(cond,name,id) \ - do { if(cond) { \ - TIMETABLE_TIMESTAMP(id); \ - } while(0) - -#define TIMETABLE_COND_RESUME(cond,name,num) \ - TIMETABLE_COND_TIMESTAMP(cond,name, \ - CC_CONCAT(name,_timestamps[num].id)) - -#define TIMETABLE_ENTRY(name, num) CC_CONCAT(name,_timestamps)[num] -#define TIMETABLE_PTR(name) CC_CONCAT(name,_ptr) - -/** - * The time for taking a timestamp. - */ -extern rtimer_clock_t timetable_timestamp_time; - - -struct timetable_timestamp *timetable_entry(struct timetable *t, - int num); -int timetable_ptr(struct timetable *t); - -void timetable_clear(struct timetable *t); -rtimer_clock_t timetable_timediff(struct timetable *t, - const char *id1, const char *id2); -void timetable_init(void); - -void timetable_print(struct timetable *t); - -#include "sys/timetable-aggregate.h" - -#endif /* __TIMETABLE_H__ */