TSCH: fix a bug in tsch_schedule_slot_operation scheduling

This commit is contained in:
Atis Elsts 2018-02-23 14:15:36 +00:00
parent ef59ce132f
commit b2eba53df9
1 changed files with 11 additions and 10 deletions

View File

@ -297,15 +297,16 @@ tsch_schedule_slot_operation(struct rtimer *tm, rtimer_clock_t ref_time, rtimer_
"!dl-miss %s %d %d", "!dl-miss %s %d %d",
str, (int)(now-ref_time), (int)offset); str, (int)(now-ref_time), (int)offset);
); );
} else {
r = rtimer_set(tm, ref_time + offset, 1, (void (*)(struct rtimer *, void *))tsch_slot_operation, NULL);
if(r == RTIMER_OK) {
return 1;
}
}
return 0; /* block until the time to schedule comes */
} BUSYWAIT_UNTIL_ABS(0, ref_time, offset);
ref_time += offset; return 0;
r = rtimer_set(tm, ref_time, 1, (void (*)(struct rtimer *, void *))tsch_slot_operation, NULL);
if(r != RTIMER_OK) {
return 0;
}
return 1;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Schedule slot operation conditionally, and YIELD if success only. /* Schedule slot operation conditionally, and YIELD if success only.
@ -315,8 +316,8 @@ tsch_schedule_slot_operation(struct rtimer *tm, rtimer_clock_t ref_time, rtimer_
do { \ do { \
if(tsch_schedule_slot_operation(tm, ref_time, offset - RTIMER_GUARD, str)) { \ if(tsch_schedule_slot_operation(tm, ref_time, offset - RTIMER_GUARD, str)) { \
PT_YIELD(pt); \ PT_YIELD(pt); \
BUSYWAIT_UNTIL_ABS(0, ref_time, offset); \
} \ } \
BUSYWAIT_UNTIL_ABS(0, ref_time, offset); \
} while(0); } while(0);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Get EB, broadcast or unicast packet to be sent, and target neighbor. */ /* Get EB, broadcast or unicast packet to be sent, and target neighbor. */
@ -1010,12 +1011,12 @@ PT_THREAD(tsch_slot_operation(struct rtimer *t, void *ptr))
TSCH_ASN_INC(tsch_current_asn, timeslot_diff); TSCH_ASN_INC(tsch_current_asn, timeslot_diff);
/* Time to next wake up */ /* Time to next wake up */
time_to_next_active_slot = timeslot_diff * tsch_timing[tsch_ts_timeslot_length] + drift_correction; time_to_next_active_slot = timeslot_diff * tsch_timing[tsch_ts_timeslot_length] + drift_correction;
time_to_next_active_slot += tsch_timesync_adaptive_compensate(time_to_next_active_slot);
drift_correction = 0; drift_correction = 0;
is_drift_correction_used = 0; is_drift_correction_used = 0;
/* Update current slot start */ /* Update current slot start */
prev_slot_start = current_slot_start; prev_slot_start = current_slot_start;
current_slot_start += time_to_next_active_slot; current_slot_start += time_to_next_active_slot;
current_slot_start += tsch_timesync_adaptive_compensate(time_to_next_active_slot);
} while(!tsch_schedule_slot_operation(t, prev_slot_start, time_to_next_active_slot, "main")); } while(!tsch_schedule_slot_operation(t, prev_slot_start, time_to_next_active_slot, "main"));
} }