jerpelea opened a new pull request, #20340:
URL: https://github.com/apache/nuttx/pull/20340

   ## Summary
   
   up_idlepm() put the domain back in PM_NORMAL with pm_changestate() but left 
its local oldstate holding whatever it was before sleeping, usually PM_STANDBY. 
 The pm_checkstate() below then returned PM_STANDBY again, the "newstate != 
oldstate" test compared PM_STANDBY against a stale PM_STANDBY, and the whole 
block was skipped -- including the esp_pmstandby() call that is the only thing 
in here that ever sleeps.
   
   So after the very first wakeup the board reported PM_NORMAL essentially 
forever, and light-slept only when something else happened to perturb oldstate, 
such as an application taking and releasing a PM_IDLE wakelock around a 
transmission window.
   
   Measured on the esp32s3-xiao collar before this fix: 4.1 s of actual light 
sleep in 2 h of near-total idleness, a 1780:1 awake-to-asleep ratio.  After it: 
~13.5% of wall time asleep, thousands of sleeps, no storms.
   
   The dead "newstate = PM_NORMAL" assignment that used to sit here was 
presumably meant to be this; it is overwritten by pm_checkstate() a few lines 
below and never had any effect.
   
   Note that fixing this is what exposed two further bugs that had been dormant 
behind a board that never slept: the systimer double-count in esp_pmstandby(), 
and I2C transfers being cut in half by sleep.  Both are fixed in their own 
commits.
   
   ## Impact
   
   RELEASE
   
   ## Testing
   
   CI


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to