timer & tickless bugfix

1. fix a bug of timer_update when TOS_CFG_TIMER_AS_PROC > 0u
2. support disable tickless in runtime
3. fix a header file dependency bug, which cause k_tick_t typedef-ed to uint32_t
4. fix tick_count drift in tickless_proc
This commit is contained in:
daishengdong
2020-04-27 15:12:08 +08:00
parent ccad2a8826
commit e8c135e2bb
6 changed files with 20 additions and 22 deletions

View File

@@ -53,7 +53,8 @@ typedef enum idle_power_manager_mode_en {
|-------------------------------------------------------------------------------------------------------------------|
*/
typedef enum k_cpu_low_power_mode_en {
TOS_LOW_POWER_MODE_SLEEP = 0, /* wakeup source: systick/tim/rtc */
TOS_LOW_POWER_MODE_NONE = 0, /* if set to NONE, disable low power mode */
TOS_LOW_POWER_MODE_SLEEP, /* wakeup source: systick/tim/rtc */
TOS_LOW_POWER_MODE_STOP, /* wakeup source: rtc wakeup/alarm */
TOS_LOW_POWER_MODE_STANDBY, /* wakeup source: rtc alarm */
__LOW_POWER_MODE_DUMMY,

View File

@@ -132,21 +132,35 @@ __STATIC__ void tickless_leave(k_time_t time_sleep_ms)
tick_sleep = k_cpu_tick_per_second * time_sleep_ms / K_TIME_MILLISEC_PER_SEC;
tickless_tick_fix(tick_sleep);
knl_sched();
}
__KNL__ void tickless_proc(void)
{
TOS_CPU_CPSR_ALLOC();
k_time_t time_sleep;
k_cpu_lpwr_mode_t lpwr_mode;
lpwr_mode = pm_cpu_lpwr_mode_get();
if (lpwr_mode == TOS_LOW_POWER_MODE_NONE) {
return;
}
if (!tickless_wkup_alarm_is_installed(lpwr_mode)) {
return;
}
TOS_CPU_INT_DISABLE();
time_sleep = tickless_cpu_sleep_time_get(lpwr_mode); /* in millisecond */
if (unlikely(time_sleep == (k_time_t)0)) {
TOS_CPU_INT_ENABLE();
return;
}
tickless_enter();
TOS_CPU_INT_ENABLE();
tickless_wkup_alarm_setup(lpwr_mode, time_sleep);
pm_cpu_lpwr_mode_enter(lpwr_mode);
tickless_wkup_alarm_dismiss(lpwr_mode);