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

@@ -40,18 +40,6 @@
#error "INVALID config, TOS_CFG_TASK_PRIO_MAX must be >= 8"
#endif
#if (TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u) && (TOS_CFG_MMHEAP_EN == 0u)
#error "INVALID config, must enable TOS_CFG_MMHEAP_EN to support dynamic task create"
#endif
#if (TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN > 0u) && (TOS_CFG_MMHEAP_EN == 0u)
#error "INVALID config, must enable TOS_CFG_MMHEAP_EN to support tos_prio_msg_q"
#endif
#if (TOS_CFG_PRIORITY_MAIL_QUEUE_EN > 0u) && (TOS_CFG_MMHEAP_EN == 0u)
#error "INVALID config, must enable TOS_CFG_MMHEAP_EN to support tos_prio_mail_q"
#endif
#if ((TOS_CFG_TIMER_EN > 0u) && !defined(TOS_CFG_TIMER_AS_PROC))
#error "UNDECLARED config, TOS_CFG_TIMER_AS_PROC"
#endif
@@ -62,10 +50,6 @@
#endif
#endif
#if (TOS_CFG_VFS_EN > 0u) && (TOS_CFG_MMHEAP_EN == 0u)
#error "INVALID config, must enable TOS_CFG_MMHEAP_EN to use tos_vfs"
#endif
#ifndef TOS_CFG_CPU_HRTIMER_EN
#error "UNDECLARED config, TOS_CFG_CPU_HRTIMER_EN should be declared in 'port_config.h'"
#elif (TOS_CFG_CPU_HRTIMER_EN > 0u) && !defined(TOS_CFG_CPU_HRTIMER_SIZE)

View File

@@ -20,15 +20,15 @@
#include <tos_compiler.h>
#include <tos_err.h>
#include <tos_ktypes.h>
#include <tos_cpu_def.h>
#include <tos_config.h>
#include <tos_config_default.h>
#include <port_config.h>
#include <tos_config_check.h>
#include <tos_cpu_types.h>
#include <tos_ktypes.h>
#include <port.h>
#include <tos_cpu.h>
#include <tos_config_check.h>
#include <tos_fault.h>
#include <tos_klib.h>
#include <tos_list.h>

View File

@@ -78,8 +78,7 @@ pm_device_ctl_t k_pm_device_ctl = { 0u };
/* default idle power manager mode is SLEEP */
idle_pwrmgr_mode_t k_idle_pwr_mgr_mode = IDLE_POWER_MANAGER_MODE_SLEEP;
/* default low power mode is SLEEP */
k_cpu_lpwr_mode_t k_cpu_lpwr_mode = TOS_LOW_POWER_MODE_SLEEP;
k_cpu_lpwr_mode_t k_cpu_lpwr_mode = TOS_LOW_POWER_MODE_NONE;
#endif
#if TOS_CFG_TICKLESS_EN > 0u

View File

@@ -278,7 +278,7 @@ __KNL__ void timer_update(void)
{
k_timer_t *tmr, *tmp;
if (k_timer_ctl.next_expires < k_tick_count) {
if (k_timer_ctl.next_expires > k_tick_count) { // not yet
return;
}

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);