mirror of
https://github.com/oliverschmidt/contiki.git
synced 2024-12-23 01:29:33 +00:00
Free rtimer for contikimac, add print-stats option
This commit is contained in:
parent
83e3b99d54
commit
b55dddcd38
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user