/* If FreeRTOS is not running, then we rely on RIT service to call this function, * otherwise we rely on FreeRTOS tick hook to provide system timer */ static void hl_periodic_service(void) { sys_watchdog_feed(); /* If FreeRTOS is running, user should use a dedicated task to call mesh service, * so we will not call it if freertos is running */ if (taskSCHEDULER_RUNNING == xTaskGetSchedulerState()) { g_system_uptime_ms += MS_PER_TICK(); /* We don't need RIT if FreeRTOS is running */ if (sys_rit_running()) { sys_rit_disable(); /* The timer value so far may be an odd number, and if MS_PER_TICK() is not 1 * then we may increment it like 12, 22, 32, etc. so round this number once. */ g_system_uptime_ms = (g_system_uptime_ms / 10) * 10; } } else { g_system_uptime_ms += g_time_per_rit_isr_ms; wireless_service(); /** * Small hack to support interrupts if FreeRTOS is not running : * FreeRTOS API resets our base priority register, then all * interrupts higher priority than IP_SYSCALL will not get locked out. * @see more notes at isr_priorities.h. @see IP_SYSCALL */ __set_BASEPRI(0); } }
/** * This function is called periodically by the timer ISR */ static inline void sys_background_service(void) { /* FreeRTOS task is used to service the wireless_service() function, otherwise if FreeRTOS * is not running, timer ISR will call this function to carry out mesh networking logic. */ wireless_service(); /* I used a small hack to reset base priority to zero periodically incorrectly assuming that * FreeRTOS API sets the base priority to non-zero, but it turned out that the problem was * that the vPortEnterCritical() and vPortExitCritical() functions were using the critical * nesting count variable that was not initialized to zero by the port.c file! */ // __set_BASEPRI(0); }
/* If FreeRTOS is not running, then we rely on rit service to call this function, * otherwise we rely on FreeRTOS tick hook to provide system timer */ static void hl_periodic_service(void) { const uint32_t timer_ms = sys_get_uptime_ms(); /* If FreeRTOS is running, user should use a dedicated task to call mesh service, * so we will not call it if freertos is running */ if (taskSCHEDULER_RUNNING == xTaskGetSchedulerState()) { m_system_uptime_ms += MS_PER_TICK(); /* We don't need RIT if FreeRTOS is running */ if (sys_rit_running()) { sys_rit_disable(); /* Round up uptime_ms because if ms per tick is 10, then we don't want to * increment this timer by 10 from an odd number because % 10 won't work. */ m_system_uptime_ms = (m_system_uptime_ms / 10) * 10; } } else { m_system_uptime_ms += m_time_per_rit_isr_ms; wireless_service(); /** * Small hack to support interrupts if FreeRTOS is not running : * FreeRTOS API resets our base priority register, then all * interrupts higher priority than IP_SYSCALL will not get locked out. * @see more notes at isr_priorities.h. @see IP_SYSCALL */ __set_BASEPRI(0); } /** * Call SD timer function at 100Hz. * Feed the watchdog too while we're at it. */ if (0 == (timer_ms % 10)) { sd_timerproc(); sys_watchdog_feed(); } }
bool run(void *p) { wireless_service(); ///< This is a non-polling function if FreeRTOS is running. return true; }