diff --git a/core/net/mac/tsch/tsch-private.h b/core/net/mac/tsch/tsch-private.h index 4a26abff3..44c928ae7 100644 --- a/core/net/mac/tsch/tsch-private.h +++ b/core/net/mac/tsch/tsch-private.h @@ -48,6 +48,10 @@ #include "net/linkaddr.h" #include "net/mac/tsch/tsch-asn.h" #include "net/mac/tsch/tsch-conf.h" +#if CONTIKI_TARGET_COOJA || CONTIKI_TARGET_COOJA_IP64 +#include "lib/simEnvChange.h" +#include "sys/cooja_mt.h" +#endif /* CONTIKI_TARGET_COOJA || CONTIKI_TARGET_COOJA_IP64 */ /************ Types ***********/ @@ -109,7 +113,14 @@ void tsch_disassociate(void); #define TSCH_CLOCK_TO_SLOTS(c, timeslot_length) (TSCH_CLOCK_TO_TICKS(c) / timeslot_length) /* Wait for a condition with timeout t0+offset. */ +#if CONTIKI_TARGET_COOJA || CONTIKI_TARGET_COOJA_IP64 +#define BUSYWAIT_UNTIL_ABS(cond, t0, offset) \ + while(!(cond) && RTIMER_CLOCK_LT(RTIMER_NOW(), (t0) + (offset))) { \ + simProcessRunValue = 1; \ + cooja_mt_yield(); \ + }; +#else #define BUSYWAIT_UNTIL_ABS(cond, t0, offset) \ while(!(cond) && RTIMER_CLOCK_LT(RTIMER_NOW(), (t0) + (offset))) ; - +#endif /* CONTIKI_TARGET_COOJA || CONTIKI_TARGET_COOJA_IP64 */ #endif /* __TSCH_PRIVATE_H__ */ diff --git a/core/net/mac/tsch/tsch-slot-operation.c b/core/net/mac/tsch/tsch-slot-operation.c index 62a7942f4..90e0fcad0 100644 --- a/core/net/mac/tsch/tsch-slot-operation.c +++ b/core/net/mac/tsch/tsch-slot-operation.c @@ -54,6 +54,10 @@ #include "net/mac/tsch/tsch-packet.h" #include "net/mac/tsch/tsch-security.h" #include "net/mac/tsch/tsch-adaptive-timesync.h" +#if CONTIKI_TARGET_COOJA || CONTIKI_TARGET_COOJA_IP64 +#include "lib/simEnvChange.h" +#include "sys/cooja_mt.h" +#endif /* CONTIKI_TARGET_COOJA || CONTIKI_TARGET_COOJA_IP64 */ #if TSCH_LOG_LEVEL >= 1 #define DEBUG DEBUG_PRINT @@ -104,7 +108,10 @@ #if RTIMER_SECOND < (32 * 1024) #error "TSCH: RTIMER_SECOND < (32 * 1024)" #endif -#if RTIMER_SECOND >= 200000 +#if CONTIKI_TARGET_COOJA || CONTIKI_TARGET_COOJA_IP64 +/* Use 0 usec guard time for Cooja Mote with a 1 MHz Rtimer*/ +#define RTIMER_GUARD 0u +#elif RTIMER_SECOND >= 200000 #define RTIMER_GUARD (RTIMER_SECOND / 100000) #else #define RTIMER_GUARD 2u @@ -200,7 +207,12 @@ tsch_get_lock(void) if(tsch_in_slot_operation) { busy_wait = 1; busy_wait_time = RTIMER_NOW(); - while(tsch_in_slot_operation); + while(tsch_in_slot_operation) { +#if CONTIKI_TARGET_COOJA || CONTIKI_TARGET_COOJA_IP64 + simProcessRunValue = 1; + cooja_mt_yield(); +#endif /* CONTIKI_TARGET_COOJA || CONTIKI_TARGET_COOJA_IP64 */ + } busy_wait_time = RTIMER_NOW() - busy_wait_time; } if(!tsch_locked) {