/************************************************************************************************** * @fn macBackoffTimerCompareIsr * * @brief Interrupt service routine that fires when the backoff count is equal * to the trigger count. * * @param none * * @return none ************************************************************************************************** */ void macBackoffTimerCompareIsr(void) { uint8 oldState; halIntState_t s; HAL_ENTER_CRITICAL_SECTION(s); oldState = compareState; /* if compare is a rollover, set count to zero */ if (oldState & COMPARE_STATE_ROLLOVER_BV) { MAC_RADIO_BACKOFF_SET_COUNT(0); macBackoffTimerRolloverCallback(); } /* if compare is a trigger, reset for rollover and run the trigger callback */ if (oldState & COMPARE_STATE_TRIGGER_BV) { compareState = COMPARE_STATE_ROLLOVER; MAC_RADIO_BACKOFF_SET_COMPARE(backoffTimerRollover); HAL_EXIT_CRITICAL_SECTION(s); macBackoffTimerTriggerCallback(); } else if (oldState == COMPARE_STATE_ROLLOVER_AND_ARM_TRIGGER) { compareState = COMPARE_STATE_TRIGGER; MAC_RADIO_BACKOFF_SET_COMPARE(backoffTimerTrigger); HAL_EXIT_CRITICAL_SECTION(s); } else { HAL_EXIT_CRITICAL_SECTION(s); } }
/************************************************************************************************** * @fn macBackoffTimerPeriodIsr * * @brief Interrupt service routine that fires when the backoff count rolls over on * overflow period. * * @param none * * @return none ************************************************************************************************** */ MAC_INTERNAL_API void macBackoffTimerPeriodIsr(void) { halIntState_t s; uint32 macRatCount = MAC_RAT_COUNT; uint32 backoffRolloverRat = macBackoffTimerRollover * MAC_BACKOFF_TO_RAT_RATIO; uint32 ratCompensation = (macRatCount - macPrevPeriodRatCount) % MAC_BACKOFF_TO_RAT_RATIO; MAC_ASSERT( macBackoffTimerRollover <= MAC_BACKOFF_MAXIMUM_ROLLOVER ); if (macRatCount < backoffRolloverRat) { /* RAT wraparound has occurred. This would occur once in a blue moon (1073.74 seconds). */ DBG_PRINTL1(DBGSYS, "!!! RAT wraparound !!! RAT = %u", macRatCount); } DBG_PRINTL2(DBGSYS, "macRatChanA Period ISR, Rollover Period = %u, RAT Compensation = %u", macBackoffTimerRollover, ratCompensation); /* Convert count to RAT count and set MAC Channel A Compare. The modulus calculation will * compensate the math or interrupt latency error and prevent it from being accumulated. * Note that MAC_BACKOFF_TO_RAT_RATIO is used as part of compensation. This means the * maximum error that can be compensated is 320us. If the interrupt latency is greater * than 320us, more elaborated compensation scheme must be used for Beacon mode. * Non-beacon mode does not require absolute timing. Longer interrupt latency can be * tolerated. */ macPrevPeriodRatCount = macRatCount - ratCompensation; macSetupRATChanCompare( macRatChanA, backoffRolloverRat + macPrevPeriodRatCount ); macBackoffTimerRolloverCallback(); HAL_ENTER_CRITICAL_SECTION(s); MAC_BACKOFF_TIMER_UPDATE_WAKEUP(); HAL_EXIT_CRITICAL_SECTION(s); }
/************************************************************************************************** * @fn macBackoffTimerPeriodIsr * * @brief Interrupt service routine that fires when the backoff count rolls over on * overflow period. * * @param none * * @return none ************************************************************************************************** */ MAC_INTERNAL_API void macBackoffTimerPeriodIsr(void) { macMcuAccumulatedOverFlow(); macBackoffTimerRolloverCallback(); }