RT-Thread论坛
直播中

赵敏

8年用户 1157经验值
私信 关注
[问答]

pm组件的相关疑问求解

使用国民的n32l403芯片跑rtthread使用了pm组件管理功耗。
我需要进入stop2后定时唤醒喂mcu看门狗和i2c喂外部看门狗,于是使用了lptimer定时器定时唤醒喂狗,且用于tickless
目前发现有以下问题:
1.定时唤醒喂狗时发现其他线程还在跑
2.通过按键唤醒后,发现有的线程调度异常导致程序乱跑
以下是部分代码

  • void pm_bsp_enter_deepsleep(struct rt_pm *pm)
  • {
  •    // WatchdogDeivce = rt_device_find("wdt");
  •    // rt_device_control(WatchdogDeivce, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
  •    if(sleep_wakeup_flag != case_in_deepsleep_mode)
  •    {
  •       wakeup_to_deepsleep_mode_operation();
  •       rt_kprintf("pm_bsp_enter_deepsleep rt_tick_get = %drn",rt_tick_get());
  •    }

  •    // rt_thread_delay(100);
  •    // SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;

  •    PWR_EnterSTOP2Mode(PWR_STOPENTRY_WFI,PWR_CTRL3_RAM1RET|PWR_CTRL3_RAM2RET);

  •    SetSysClockToPLL(SystemCoreClock,SYSCLK_PLLSRC_HSE_PLLDIV2);

  •    charger_feed_sy8809_watchdog();

  •    WatchdogDeivce = rt_device_find("wdt");

  •    rt_device_control(WatchdogDeivce, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);

  •    // if(sleep_wakeup_flag == case_in_wakeup_mode)
  •    // {
  •    //    deepsleep_to_wakeup_operation();
  •    // }
  • }




回帖(1)

张依然

2025-9-15 16:55:41
你没有通过rt_system_power_manager()接口进入低功耗,rt_system_power_manager()接口内部是通过rt_timer_next_timeout_tick()获取当前需要使LPtimer定时的时间值。
rt_timer_next_timeout_tick()接口很重要,是用于获取当前要被唤醒的线程的时间值。如果你使用一个固定值作为LPtimer周期唤醒值,肯定会出现系统调度异常的问题;
举报

更多回帖

发帖
×
20
完善资料,
赚取积分