Merge pull request #139 from nfi/contrib/energest-deep-lpm

New energest type for deep sleep plus configurable type for Energest time source
This commit is contained in:
Simon Duquennoy 2017-10-31 23:24:12 +01:00 committed by GitHub
commit 1275c4cb9e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 56 additions and 13 deletions

View File

@ -32,6 +32,7 @@
#include "contiki.h" #include "contiki.h"
#include "sys/clock.h" #include "sys/clock.h"
#include "sys/etimer.h" #include "sys/etimer.h"
#include "sys/energest.h"
#include "rtimer-arch.h" #include "rtimer-arch.h"
#include "dev/watchdog.h" #include "dev/watchdog.h"
#include "isr_compat.h" #include "isr_compat.h"
@ -86,6 +87,7 @@ ISR(TIMERA1, timera1)
#endif #endif
if(count % CLOCK_CONF_SECOND == 0) { if(count % CLOCK_CONF_SECOND == 0) {
++seconds; ++seconds;
energest_flush();
} }
last_tar = read_tar(); last_tar = read_tar();
} }

View File

@ -32,6 +32,7 @@
#include "contiki.h" #include "contiki.h"
#include "sys/clock.h" #include "sys/clock.h"
#include "sys/etimer.h" #include "sys/etimer.h"
#include "sys/energest.h"
#include "rtimer-arch.h" #include "rtimer-arch.h"
#include "dev/watchdog.h" #include "dev/watchdog.h"
#include "isr_compat.h" #include "isr_compat.h"
@ -86,6 +87,7 @@ ISR(TIMER1_A1, timera1)
#endif #endif
if(count % CLOCK_CONF_SECOND == 0) { if(count % CLOCK_CONF_SECOND == 0) {
++seconds; ++seconds;
energest_flush();
} }
last_tar = read_tar(); last_tar = read_tar();
} }

View File

@ -40,6 +40,7 @@
#include "net/netstack.h" #include "net/netstack.h"
#include "net/packetbuf.h" #include "net/packetbuf.h"
#include "dev/watchdog.h" #include "dev/watchdog.h"
#include "sys/energest.h"
#include "dev/leds.h" #include "dev/leds.h"

View File

@ -36,6 +36,7 @@
#include <string.h> #include <string.h>
#include "contiki.h" #include "contiki.h"
#include "sys/energest.h"
#include "dev/leds.h" #include "dev/leds.h"
#include "dev/spi.h" #include "dev/spi.h"

View File

@ -44,6 +44,7 @@
#include "contiki.h" #include "contiki.h"
#include "dev/leds.h" #include "dev/leds.h"
#include "sys/rtimer.h" #include "sys/rtimer.h"
#include "sys/energest.h"
#include "net/packetbuf.h" #include "net/packetbuf.h"
#include "net/netstack.h" #include "net/netstack.h"
#include "net/mac/framer/frame802154.h" #include "net/mac/framer/frame802154.h"

View File

@ -52,6 +52,7 @@
#include "dev/uart-driver.h" #include "dev/uart-driver.h"
#include "contiki.h" #include "contiki.h"
#include "sys/energest.h"
#include "net/netstack.h" #include "net/netstack.h"
#include "dev/serial-line.h" #include "dev/serial-line.h"

View File

@ -31,6 +31,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "contiki.h" #include "contiki.h"
#include "sys/energest.h"
#include "cc2420.h" #include "cc2420.h"
#include "dev/ds2411/ds2411.h" #include "dev/ds2411/ds2411.h"
#include "dev/leds.h" #include "dev/leds.h"

View File

@ -43,6 +43,7 @@
#include "contiki.h" #include "contiki.h"
#include "contiki-net.h" #include "contiki-net.h"
#include "sys/platform.h" #include "sys/platform.h"
#include "sys/energest.h"
#include "dev/watchdog.h" #include "dev/watchdog.h"
#if BUILD_WITH_ORCHESTRA #if BUILD_WITH_ORCHESTRA
@ -79,7 +80,6 @@ main(void)
watchdog_init(); watchdog_init();
energest_init(); energest_init();
ENERGEST_ON(ENERGEST_TYPE_CPU);
platform_init_stage_two(); platform_init_stage_two();

View File

@ -49,6 +49,4 @@
#include "sys/clock.h" #include "sys/clock.h"
#include "sys/energest.h"
#endif /* CONTIKI_H_ */ #endif /* CONTIKI_H_ */

View File

@ -37,13 +37,13 @@
* Adam Dunkels <adam@sics.se> * Adam Dunkels <adam@sics.se>
*/ */
#include "sys/energest.h"
#include "contiki.h" #include "contiki.h"
#include "sys/energest.h"
#if ENERGEST_CONF_ON #if ENERGEST_CONF_ON
uint64_t energest_total_time[ENERGEST_TYPE_MAX]; uint64_t energest_total_time[ENERGEST_TYPE_MAX];
uint64_t energest_current_time[ENERGEST_TYPE_MAX]; ENERGEST_TIME_T energest_current_time[ENERGEST_TYPE_MAX];
unsigned char energest_current_mode[ENERGEST_TYPE_MAX]; unsigned char energest_current_mode[ENERGEST_TYPE_MAX];
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
@ -52,9 +52,10 @@ energest_init(void)
{ {
int i; int i;
for(i = 0; i < ENERGEST_TYPE_MAX; ++i) { for(i = 0; i < ENERGEST_TYPE_MAX; ++i) {
energest_total_time[i].current = energest_current_time[i] = 0; energest_total_time[i] = energest_current_time[i] = 0;
energest_current_mode[i] = 0; energest_current_mode[i] = 0;
} }
ENERGEST_ON(ENERGEST_TYPE_CPU);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void void
@ -65,12 +66,21 @@ energest_flush(void)
for(i = 0; i < ENERGEST_TYPE_MAX; i++) { for(i = 0; i < ENERGEST_TYPE_MAX; i++) {
if(energest_current_mode[i]) { if(energest_current_mode[i]) {
now = ENERGEST_CURRENT_TIME(); now = ENERGEST_CURRENT_TIME();
energest_total_time[i].current += now - energest_current_time[i]; energest_total_time[i] +=
(ENERGEST_TIME_T)(now - energest_current_time[i]);
energest_current_time[i] = now; energest_current_time[i] = now;
} }
} }
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
uint64_t
energest_get_total_time(void)
{
return energest_type_time(ENERGEST_TYPE_CPU) +
energest_type_time(ENERGEST_TYPE_LPM) +
energest_type_time(ENERGEST_TYPE_DEEP_LPM);
}
/*---------------------------------------------------------------------------*/
#else /* ENERGEST_CONF_ON */ #else /* ENERGEST_CONF_ON */
void void
@ -83,4 +93,10 @@ energest_flush(void)
{ {
} }
uint64_t
energest_get_total_time(void)
{
return 0;
}
#endif /* ENERGEST_CONF_ON */ #endif /* ENERGEST_CONF_ON */

View File

@ -48,9 +48,18 @@
#else #else
#define ENERGEST_CURRENT_TIME RTIMER_NOW #define ENERGEST_CURRENT_TIME RTIMER_NOW
#define ENERGEST_SECOND RTIMER_SECOND #define ENERGEST_SECOND RTIMER_SECOND
#define ENERGEST_TIME_T rtimer_clock_t
#endif /* ENERGEST_CONF_TIME */ #endif /* ENERGEST_CONF_TIME */
#endif /* ENERGEST_TIME */ #endif /* ENERGEST_TIME */
#ifndef ENERGEST_TIME_T
#ifdef ENERGEST_CONF_TIME_T
#define ENERGEST_TIME_T ENERGEST_CONF_TIME_T
#else
#define ENERGEST_TIME_T rtimer_clock_t
#endif /* ENERGEST_CONF_TIME_T */
#endif /* ENERGEST_TIME_T */
#ifndef ENERGEST_SECOND #ifndef ENERGEST_SECOND
#ifdef ENERGEST_CONF_SECOND #ifdef ENERGEST_CONF_SECOND
#define ENERGEST_SECOND ENERGEST_CONF_SECOND #define ENERGEST_SECOND ENERGEST_CONF_SECOND
@ -59,6 +68,14 @@
#endif /* ENERGEST_CONF_SECOND */ #endif /* ENERGEST_CONF_SECOND */
#endif /* ENERGEST_SECOND */ #endif /* ENERGEST_SECOND */
#ifndef ENERGEST_GET_TOTAL_TIME
#ifdef ENERGEST_CONF_GET_TOTAL_TIME
#define ENERGEST_GET_TOTAL_TIME ENERGEST_CONF_GET_TOTAL_TIME
#else /* ENERGEST_CONF_GET_TOTAL_TIME */
#define ENERGEST_GET_TOTAL_TIME energest_get_total_time
#endif /* ENERGEST_CONF_GET_TOTAL_TIME */
#endif /* ENERGEST_GET_TOTAL_TIME */
/* /*
* Optional support for more energest types. * Optional support for more energest types.
* *
@ -69,6 +86,7 @@
typedef enum energest_type { typedef enum energest_type {
ENERGEST_TYPE_CPU, ENERGEST_TYPE_CPU,
ENERGEST_TYPE_LPM, ENERGEST_TYPE_LPM,
ENERGEST_TYPE_DEEP_LPM,
ENERGEST_TYPE_TRANSMIT, ENERGEST_TYPE_TRANSMIT,
ENERGEST_TYPE_LISTEN, ENERGEST_TYPE_LISTEN,
@ -86,10 +104,12 @@ typedef enum energest_type {
void energest_init(void); void energest_init(void);
void energest_flush(void); void energest_flush(void);
uint64_t ENERGEST_GET_TOTAL_TIME(void);
#if ENERGEST_CONF_ON #if ENERGEST_CONF_ON
extern uint64_t energest_total_time[ENERGEST_TYPE_MAX]; extern uint64_t energest_total_time[ENERGEST_TYPE_MAX];
extern uint64_t energest_current_time[ENERGEST_TYPE_MAX]; extern ENERGEST_TIME_T energest_current_time[ENERGEST_TYPE_MAX];
extern unsigned char energest_current_mode[ENERGEST_TYPE_MAX]; extern unsigned char energest_current_mode[ENERGEST_TYPE_MAX];
static inline uint64_t static inline uint64_t
@ -118,8 +138,8 @@ static inline void
energest_off(energest_type_t type) energest_off(energest_type_t type)
{ {
if(energest_current_mode[type] != 0) { if(energest_current_mode[type] != 0) {
energest_total_time[type].current += energest_total_time[type] +=
ENERGEST_CURRENT_TIME() - energest_current_time[type]; (ENERGEST_TIME_T)(ENERGEST_CURRENT_TIME() - energest_current_time[type]);
energest_current_mode[type] = 0; energest_current_mode[type] = 0;
} }
} }
@ -128,10 +148,10 @@ energest_off(energest_type_t type)
static inline void static inline void
energest_switch(energest_type_t type_off, energest_type_t type_on) energest_switch(energest_type_t type_off, energest_type_t type_on)
{ {
uint64_t energest_local_variable_now = ENERGEST_CURRENT_TIME(); ENERGEST_TIME_T energest_local_variable_now = ENERGEST_CURRENT_TIME();
if(energest_current_mode[type_off] != 0) { if(energest_current_mode[type_off] != 0) {
energest_total_time[type_off].current += energest_total_time[type_off] += (ENERGEST_TIME_T)
energest_local_variable_now - energest_current_time[type_off]; (energest_local_variable_now - energest_current_time[type_off]);
energest_current_mode[type_off] = 0; energest_current_mode[type_off] = 0;
} }
if(energest_current_mode[type_on] == 0) { if(energest_current_mode[type_on] == 0) {