diff --git a/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h b/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h index 6ee0bd743..0bf8693a1 100644 --- a/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h +++ b/demos/ARMCM4-STM32F303-DISCOVERY/chconf.h @@ -499,6 +499,28 @@ } #endif +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#if !defined(CH_CFG_IDLE_ENTER_HOOK) || defined(__DOXYGEN__) +#define CH_CFG_IDLE_ENTER_HOOK() { \ +} +#endif + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#if !defined(CH_CFG_IDLE_LEAVE_HOOK) || defined(__DOXYGEN__) +#define CH_CFG_IDLE_LEAVE_HOOK() { \ +} +#endif + /** * @brief Idle Loop hook. * @details This hook is continuously invoked by the idle thread loop. diff --git a/os/rt/src/chschd.c b/os/rt/src/chschd.c index ac77139ae..9b7147a32 100644 --- a/os/rt/src/chschd.c +++ b/os/rt/src/chschd.c @@ -125,6 +125,11 @@ void chSchGoSleepS(tstate_t newstate) { otp->p_preempt = CH_CFG_TIME_QUANTUM; #endif setcurrp(queue_fifo_remove(&ch.rlist.r_queue)); +#if defined(CH_CFG_IDLE_ENTER_HOOK) + if (currp->p_prio == IDLEPRIO) { + CH_CFG_IDLE_ENTER_HOOK(); + } +#endif currp->p_state = CH_STATE_CURRENT; chSysSwitch(currp, otp); } @@ -237,6 +242,11 @@ void chSchWakeupS(thread_t *ntp, msg_t msg) { else { thread_t *otp = chSchReadyI(currp); setcurrp(ntp); +#if defined(CH_CFG_IDLE_LEAVE_HOOK) + if (otp->p_prio == IDLEPRIO) { + CH_CFG_IDLE_LEAVE_HOOK(); + } +#endif ntp->p_state = CH_STATE_CURRENT; chSysSwitch(ntp, otp); } @@ -302,6 +312,11 @@ void chSchDoRescheduleBehind(void) { otp = currp; /* Picks the first thread from the ready queue and makes it current.*/ setcurrp(queue_fifo_remove(&ch.rlist.r_queue)); +#if defined(CH_CFG_IDLE_LEAVE_HOOK) + if (otp->p_prio == IDLEPRIO) { + CH_CFG_IDLE_LEAVE_HOOK(); + } +#endif currp->p_state = CH_STATE_CURRENT; #if CH_CFG_TIME_QUANTUM > 0 otp->p_preempt = CH_CFG_TIME_QUANTUM; @@ -325,6 +340,11 @@ void chSchDoRescheduleAhead(void) { otp = currp; /* Picks the first thread from the ready queue and makes it current.*/ setcurrp(queue_fifo_remove(&ch.rlist.r_queue)); +#if defined(CH_CFG_IDLE_LEAVE_HOOK) + if (otp->p_prio == IDLEPRIO) { + CH_CFG_IDLE_LEAVE_HOOK(); + } +#endif currp->p_state = CH_STATE_CURRENT; otp->p_state = CH_STATE_READY;