Free rtimer for contikimac, add print-stats option

This commit is contained in:
David Kopf 2011-08-15 14:55:18 -04:00
parent 83e3b99d54
commit b55dddcd38
2 changed files with 83 additions and 34 deletions

View File

@ -44,14 +44,25 @@
#include "sys/energest.h" #include "sys/energest.h"
#include <stdio.h> #include <stdio.h>
#ifdef __AVR__
#include <avr/pgmspace.h>
#define PRINTA(FORMAT,args...) printf_P(PSTR(FORMAT),##args)
#else
#define PRINTA(...) printf(__VA_ARGS__)
#endif
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void void
print_stats(void) print_stats(void)
{ {
printf("S %d.%d clock %lu tx %lu rx %lu rtx %lu rrx %lu rexmit %lu acktx %lu noacktx %lu ackrx %lu timedout %lu badackrx %lu toolong %lu tooshort %lu badsynch %lu badcrc %lu contentiondrop %lu sendingdrop %lu lltx %lu llrx %lu\n", PRINTA("S %d.%d clock %lu tx %lu rx %lu rtx %lu rrx %lu rexmit %lu acktx %lu noacktx %lu ackrx %lu timedout %lu badackrx %lu toolong %lu tooshort %lu badsynch %lu badcrc %lu contentiondrop %lu sendingdrop %lu lltx %lu llrx %lu\n",
rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1],
#ifdef __AVR__
clock_seconds(),
#else
(unsigned long)clock_time() / CLOCK_SECOND, (unsigned long)clock_time() / CLOCK_SECOND,
#endif
rimestats.tx, rimestats.rx, rimestats.tx, rimestats.rx,
rimestats.reliabletx, rimestats.reliablerx, rimestats.reliabletx, rimestats.reliablerx,
rimestats.rexmit, rimestats.acktx, rimestats.noacktx, rimestats.rexmit, rimestats.acktx, rimestats.noacktx,
@ -61,9 +72,14 @@ print_stats(void)
rimestats.contentiondrop, rimestats.sendingdrop, rimestats.contentiondrop, rimestats.sendingdrop,
rimestats.lltx, rimestats.llrx); rimestats.lltx, rimestats.llrx);
#if ENERGEST_CONF_ON #if ENERGEST_CONF_ON
printf("E %d.%d clock %lu cpu %lu lpm %lu irq %lu gled %lu yled %lu rled %lu tx %lu listen %lu sensors %lu serial %lu\n", PRINTA("E %d.%d clock %lu cpu %lu lpm %lu irq %lu gled %lu yled %lu rled %lu tx %lu listen %lu sensors %lu serial %lu\n",
rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1], rimeaddr_node_addr.u8[0], rimeaddr_node_addr.u8[1],
(unsigned long)(clock_time() / CLOCK_SECOND), #ifdef __AVR__
clock_seconds(),
#else
(unsigned long)clock_time() / CLOCK_SECOND,
#endif
energest_total_time[ENERGEST_TYPE_CPU].current, energest_total_time[ENERGEST_TYPE_CPU].current,
energest_total_time[ENERGEST_TYPE_LPM].current, energest_total_time[ENERGEST_TYPE_LPM].current,
energest_total_time[ENERGEST_TYPE_IRQ].current, energest_total_time[ENERGEST_TYPE_IRQ].current,

View File

@ -37,6 +37,13 @@
#define DEBUG DEBUG_PRINT #define DEBUG DEBUG_PRINT
#include "uip-debug.h" ////Does #define PRINTA(FORMAT,args...) printf_P(PSTR(FORMAT),##args) for AVR #include "uip-debug.h" ////Does #define PRINTA(FORMAT,args...) printf_P(PSTR(FORMAT),##args) for AVR
#if DEBUGFLOWSIZE
uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE];
#define DEBUGFLOW(c) if (debugflowsize<(DEBUGFLOWSIZE-1)) debugflow[debugflowsize++]=c
#else
#define DEBUGFLOW(c)
#endif
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#include <avr/fuse.h> #include <avr/fuse.h>
#include <avr/eeprom.h> #include <avr/eeprom.h>
@ -91,20 +98,22 @@
#include "net/rime.h" #include "net/rime.h"
/* Test rtimers, also for pings, stack monitor, neighbor/route printout and time stamps */ /* Get periodic prints from idle loop, from clock seconds or rtimer interrupts */
#define TESTRTIMER 1 /* Use of rtimer will conflict with other rtimer interrupts such as contikimac radio cycling */
#if TESTRTIMER #define PERIODICPRINTS 1
#if PERIODICPRINTS
//#define PINGS 64 //#define PINGS 64
#define ROUTES 64 #define ROUTES 128
#define STAMPS 30 #define STAMPS 30
#define STACKMONITOR 128 #define STACKMONITOR 1024
uint16_t clocktime;
#define TESTRTIMER 0
#if TESTRTIMER
uint8_t rtimerflag=1; uint8_t rtimerflag=1;
uint16_t rtime;
struct rtimer rt; struct rtimer rt;
void rtimercycle(void) {rtimerflag=1;} void rtimercycle(void) {rtimerflag=1;}
#endif
#endif /* TESTRTIMER */ #endif
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/*----------------------Configuration of the .elf file---------------------*/ /*----------------------Configuration of the .elf file---------------------*/
@ -212,7 +221,7 @@ void initialize(void)
#if STACKMONITOR #if STACKMONITOR
/* Simple stack pointer highwater monitor. Checks for magic numbers in the main /* Simple stack pointer highwater monitor. Checks for magic numbers in the main
* loop. In conjuction with TESTRTIMER, never-used stack will be printed * loop. In conjuction with PERIODICPRINTS, never-used stack will be printed
* every STACKMONITOR seconds. * every STACKMONITOR seconds.
*/ */
{ {
@ -224,19 +233,21 @@ uint16_t p=(uint16_t)&__bss_end;
} while (p<SP-10); //don't overwrite our own stack } while (p<SP-10); //don't overwrite our own stack
} }
#endif #endif
#if 0
/* Get a random (or probably different) seed for the 802.15.4 packet sequence number. /* Get a random (or probably different) seed for the 802.15.4 packet sequence number.
* Some layers will ignore duplicates found in a history (e.g. Contikimac) * Some layers will ignore duplicates found in a history (e.g. Contikimac)
* causing the initial packets to be ignored after a short-cycle restart. * causing the initial packets to be ignored after a short-cycle restart.
*/ */
ADMUX =0x1E; //Select AREF as reference, measure 1.1 volt bandgap reference. ADMUX =0x5E; //Select AVDD as reference, measure 1.1 volt bandgap reference.
//ADCSRB|=1<<MUX5;
// ADMUX =0x49; //Select AVDD as reference, measure ADC0 10x differential.
ADCSRA=1<<ADEN; //Enable ADC, not free running, interrupt disabled, fastest clock ADCSRA=1<<ADEN; //Enable ADC, not free running, interrupt disabled, fastest clock
ADCSRA|=1<<ADSC; //Start conversion ADCSRA|=1<<ADSC; //Start conversion
while (ADCSRA&(1<<ADSC)); //Wait till done while (ADCSRA&(1<<ADSC)); //Wait till done
PRINTF("ADC=%d\n",ADC); PRINTF("ADC=%d\n",ADC);
random_init(ADC); random_init(ADC);
ADCSRA=0; //Disable ADC ADCSRA=0; //Disable ADC
#endif
#define CONF_CALIBRATE_OSCCAL 0 #define CONF_CALIBRATE_OSCCAL 0
#if CONF_CALIBRATE_OSCCAL #if CONF_CALIBRATE_OSCCAL
{ {
@ -273,6 +284,15 @@ uint8_t i;
/* Start radio and radio receive process */ /* Start radio and radio receive process */
NETSTACK_RADIO.init(); NETSTACK_RADIO.init();
#if 1
{uint8_t somebits;
/* Upper two RSSI reg bits (RND_VALUE) are random in rf231 */
somebits= (PHY_RSSI>>6) | (PHY_RSSI>>4) | (PHY_RSSI>>4) | PHY_RSSI;
PRINTF("rnd=%d\n", somebits);
random_init(somebits);
}
#endif
/* Set addresses BEFORE starting tcpip process */ /* Set addresses BEFORE starting tcpip process */
rimeaddr_t addr; rimeaddr_t addr;
@ -432,6 +452,14 @@ main(void)
while(1) { while(1) {
process_run(); process_run();
#if DEBUGFLOWSIZE
if (debugflowsize) {
debugflow[debugflowsize]=0;
PRINTA("%s",debugflow);
debugflowsize=0;
}
#endif
#if LED_ON_PORTE1 #if LED_ON_PORTE1
/* Turn off LED after a while */ /* Turn off LED after a while */
if (ledtimer) { if (ledtimer) {
@ -468,33 +496,48 @@ main(void)
} }
#endif #endif
#if PERIODICPRINTS
#if TESTRTIMER #if TESTRTIMER
/* Timeout can be increased up to 8 seconds maximum. /* Timeout can be increased up to 8 seconds maximum.
* A one second cycle is convenient for triggering the various debug printouts. * A one second cycle is convenient for triggering the various debug printouts.
* The triggers are staggered to avoid printing everything at once. * The triggers are staggered to avoid printing everything at once.
* My raven is 6% slow.
*/ */
if (rtimerflag) { if (rtimerflag) {
rtimer_set(&rt, RTIMER_NOW()+ RTIMER_ARCH_SECOND*1UL, 1,(void *) rtimercycle, NULL); rtimer_set(&rt, RTIMER_NOW()+ RTIMER_ARCH_SECOND*1UL, 1,(void *) rtimercycle, NULL);
rtimerflag=0; rtimerflag=0;
#else
if (clocktime!=clock_seconds()) {
clocktime=clock_seconds();
#endif
#if STAMPS #if STAMPS
if ((rtime%STAMPS)==0) { if ((clocktime%STAMPS)==0) {
PRINTA("%us ",rtime); #if ENERGEST_CONF_ON
#include "lib/print-stats.h"
print_stats();
#elif RADIOSTATS
extern volatile unsigned long radioontime;
PRINTA("%u(%u)s",clocktime,radioontime);
#else
PRINTA("%us ",clocktime);
#endif
} }
#endif #endif
rtime+=1; #if TESTRTIMER
clocktime+=1;
#endif
#if PINGS && UIP_CONF_IPV6 #if PINGS && UIP_CONF_IPV6
extern void raven_ping6(void); extern void raven_ping6(void);
if ((rtime%PINGS)==1) { if ((clocktime%PINGS)==1) {
PRINTA("**Ping\n"); PRINTA("**Ping\n");
raven_ping6(); raven_ping6();
} }
#endif #endif
#if ROUTES && UIP_CONF_IPV6 #if ROUTES && UIP_CONF_IPV6
if ((rtime%ROUTES)==2) { if ((clocktime%ROUTES)==2) {
extern uip_ds6_nbr_t uip_ds6_nbr_cache[]; extern uip_ds6_nbr_t uip_ds6_nbr_cache[];
extern uip_ds6_route_t uip_ds6_routing_table[]; extern uip_ds6_route_t uip_ds6_routing_table[];
@ -537,7 +580,7 @@ extern uip_ds6_netif_t uip_ds6_if;
#endif #endif
#if STACKMONITOR #if STACKMONITOR
if ((rtime%STACKMONITOR)==3) { if ((clocktime%STACKMONITOR)==3) {
extern uint16_t __bss_end; extern uint16_t __bss_end;
uint16_t p=(uint16_t)&__bss_end; uint16_t p=(uint16_t)&__bss_end;
do { do {
@ -551,17 +594,7 @@ if ((rtime%STACKMONITOR)==3) {
#endif #endif
} }
#endif /* TESTRTIMER */ #endif /* PERIODICPRINTS */
//Use with RF230BB DEBUGFLOW to show path through driver
#if RF230BB&&0
extern uint8_t debugflowsize,debugflow[];
if (debugflowsize) {
debugflow[debugflowsize]=0;
PRINTA("%s",debugflow);
debugflowsize=0;
}
#endif
#if RF230BB&&0 #if RF230BB&&0
if (rf230processflag) { if (rf230processflag) {