mirror of
https://github.com/apache/nuttx.git
synced 2026-05-28 20:08:15 +08:00
pm_procfs: update state up to now when pm procfs read
Signed-off-by: buxiasen <buxiasen@xiaomi.com>
This commit is contained in:
@@ -62,6 +62,10 @@ struct pm_domain_s
|
|||||||
struct timespec start;
|
struct timespec start;
|
||||||
struct timespec wake[PM_COUNT];
|
struct timespec wake[PM_COUNT];
|
||||||
struct timespec sleep[PM_COUNT];
|
struct timespec sleep[PM_COUNT];
|
||||||
|
|
||||||
|
/* When procfs read update wake or sleep up-to-now */
|
||||||
|
|
||||||
|
bool in_sleep;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Auto update or not */
|
/* Auto update or not */
|
||||||
|
|||||||
@@ -67,12 +67,14 @@ static void pm_stats(FAR struct pm_domain_s *dom, int curstate, int newstate)
|
|||||||
/* Wakeup from WFI */
|
/* Wakeup from WFI */
|
||||||
|
|
||||||
clock_timespec_add(&ts, &dom->sleep[curstate], &dom->sleep[curstate]);
|
clock_timespec_add(&ts, &dom->sleep[curstate], &dom->sleep[curstate]);
|
||||||
|
dom->in_sleep = false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Sleep to WFI */
|
/* Sleep to WFI */
|
||||||
|
|
||||||
clock_timespec_add(&ts, &dom->wake[curstate], &dom->wake[curstate]);
|
clock_timespec_add(&ts, &dom->wake[curstate], &dom->wake[curstate]);
|
||||||
|
dom->in_sleep = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update start */
|
/* Update start */
|
||||||
|
|||||||
@@ -260,11 +260,21 @@ static int pm_close(FAR struct file *filep)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: pm_read_state
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* The statistic values about every domain states.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
static ssize_t pm_read_state(FAR struct file *filep, FAR char *buffer,
|
static ssize_t pm_read_state(FAR struct file *filep, FAR char *buffer,
|
||||||
size_t buflen)
|
size_t buflen)
|
||||||
{
|
{
|
||||||
FAR struct pm_domain_s *dom;
|
FAR struct pm_domain_s *dom;
|
||||||
FAR struct pm_file_s *pmfile;
|
FAR struct pm_file_s *pmfile;
|
||||||
|
time_t sleep[PM_COUNT];
|
||||||
|
time_t wake[PM_COUNT];
|
||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
size_t totalsize = 0;
|
size_t totalsize = 0;
|
||||||
size_t linesize;
|
size_t linesize;
|
||||||
@@ -298,7 +308,26 @@ static ssize_t pm_read_state(FAR struct file *filep, FAR char *buffer,
|
|||||||
|
|
||||||
for (state = 0; state < PM_COUNT; state++)
|
for (state = 0; state < PM_COUNT; state++)
|
||||||
{
|
{
|
||||||
sum += dom->wake[state].tv_sec + dom->sleep[state].tv_sec;
|
wake[state] = dom->wake[state].tv_sec;
|
||||||
|
sleep[state] = dom->sleep[state].tv_sec;
|
||||||
|
|
||||||
|
if (state == dom->state)
|
||||||
|
{
|
||||||
|
struct timespec ts;
|
||||||
|
|
||||||
|
clock_systime_timespec(&ts);
|
||||||
|
clock_timespec_subtract(&ts, &dom->start, &ts);
|
||||||
|
if (dom->in_sleep)
|
||||||
|
{
|
||||||
|
sleep[state] += ts.tv_sec;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wake[state] += ts.tv_sec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sum += wake[state] + sleep[state];
|
||||||
}
|
}
|
||||||
|
|
||||||
sum = sum ? sum : 1;
|
sum = sum ? sum : 1;
|
||||||
@@ -307,14 +336,14 @@ static ssize_t pm_read_state(FAR struct file *filep, FAR char *buffer,
|
|||||||
{
|
{
|
||||||
time_t total;
|
time_t total;
|
||||||
|
|
||||||
total = dom->wake[state].tv_sec + dom->sleep[state].tv_sec;
|
total = wake[state] + sleep[state];
|
||||||
|
|
||||||
linesize = snprintf(pmfile->line, PM_LINELEN, STFMT,
|
linesize = snprintf(pmfile->line, PM_LINELEN, STFMT,
|
||||||
g_pm_state[state],
|
g_pm_state[state],
|
||||||
dom->wake[state].tv_sec,
|
wake[state],
|
||||||
100 * dom->wake[state].tv_sec / sum,
|
100 * wake[state] / sum,
|
||||||
dom->sleep[state].tv_sec,
|
sleep[state],
|
||||||
100 * dom->sleep[state].tv_sec / sum,
|
100 * sleep[state] / sum,
|
||||||
total,
|
total,
|
||||||
100 * total / sum);
|
100 * total / sum);
|
||||||
buffer += copysize;
|
buffer += copysize;
|
||||||
|
|||||||
Reference in New Issue
Block a user