当前位置: 首页 > news >正文

CodeBrick笔记

低功耗

1. 时序系统,时间间隔到了会执行
void module_task_process(void)
{
    const task_item_t *t;
    for (t = &task_tbl_start + 1; t < &task_tbl_end; t++) {
        if  ((get_tick() - *t->timer) >= t->interval) {
            *t->timer = get_tick();
            t->handle();
        }
    }
}
2. 低功耗任务是正常任务的一种
static void pm_task(void)
{
    pm_process();
}task_register("pm", pm_task, 0); 
3. 低功耗使能+系统空闲 => 进入低功耗
void pm_process(void)
{
    if (!pm_watch.enable || !system_is_idle())
        return;
    system_goto_sleep();
}
3.1 空闲判断:轮询所有任务的空闲标志位
static bool system_is_idle(void)
{
    const pm_item_t *it;
    for (it = &pm_tbl_start + 1; it < &pm_tbl_end; it++) {
        if (it->idle != NULL && !it->idle())
            return false;
    }
    return true;
}
3.2 轮询所有低功耗任务的sleep_notify,获得最近下次唤醒时间,
static void system_goto_sleep(void)
{
    const pm_item_t   *it;
    const pm_adapter_t *adt;
    unsigned int sleep_time;
    unsigned int tmp;
    
    adt = pm_watch.adt;
    
    sleep_time = adt->max_sleep_time;
    
    //休眠处理
    for (it = &pm_tbl_start + 1; it < &pm_tbl_end; it++) {
        if (it->sleep_notify == NULL)
            continue;
        tmp = it->sleep_notify();          //休眠请求,并得到设备期待下次唤醒时间
        if (tmp && tmp < sleep_time)       //计算出所有设备中的最小允许休眠时间
            sleep_time = tmp;
    }
    
    adt->goto_sleep(sleep_time);
    
    //唤醒处理
    for (it = &pm_tbl_start + 1; it < &pm_tbl_end; it++) {
        if (it->wakeup_notify == NULL)
            continue;
        it->wakeup_notify();
    }
}


进入低功耗逻辑

低功耗任务示例

#define pm_dev_register(name, idle, sleep_notify, wakeup_notify)\
__pm_item_register(name, idle, sleep_notify, wakeup_notify)

static unsigned int  key_sleep_notify(void)
{
    return (key_busy(&key) || readkey()) ? 20 : 0;    /* 非空闲时20ms要唤醒1次*/
} pm_dev_register("key", NULL, key_sleep_notify, NULL);

static bool system_is_idle(void)
{
    return is_timeout(system_idle_time, 3000) && tty.rx_isempty() && tty.tx_isempty();
}pm_dev_register("sys", system_is_idle, NULL, NULL);

static unsigned int  led_sleep_notify(void)
{
    int i;
    for (i = 0; i < LED_TYPE_MAX; i++)
        if (blink_dev_busy(&led[i]))
            return 100;                               //如果有设备活动,最低100ms唤醒1次           
            
    return 0;
} pm_dev_register("led", NULL, led_sleep_notify, NULL);

Get money
One
Two
Three
Christmas
Go shopping
Let me think
Laptop
iPhone
Car
```

相关文章:

  • Jenkins集成Trivy安全漏洞检查指南
  • venv 和 conda 哪个更适合管理python虚拟环境
  • 【C#】将数字转换为中文,如123转换为一百二十三
  • 卷积神经网络 - 参数学习
  • NVIDIA V100显卡支持Tensor Core技术,而Granite-3.1-8B模型在适当的条件下可以利用Tensor Core来加速数据处理
  • 二分图相关
  • 03 Python 基础:数据类型、运算符与流程控制解析
  • AIP-180 向后兼容
  • 统计矩的高阶推广:经验还是理论推导?
  • 计算图(Computation Graph)
  • git revert 用法实战:撤销一个 commit 或 merge
  • Go常见问题与回答(下)
  • 数据可视化革命!「图表狐」五大行业新范式:从科研论文到商业决策的AI进化论
  • 软件公司高新技术企业代办:机遇与陷阱并存-优雅草卓伊凡
  • ETL 自动化:提升数据处理效率与准确性的核心驱动力
  • 小红书 web x-s x-t X-Mns 分析
  • 行业分析---小米汽车2024全年财报
  • 基于Docker的OpenObserve快速搭建实现全链路可观测性远程管理
  • ZLinq:意在替代Linq的高性能.Net开源库
  • STM32/GD32主要学习内容
  • 航海王亚洲巡展、工厂店直销……上海多区推出“五五购物节”活动
  • 七部门联合发布《终端设备直连卫星服务管理规定》
  • 过去24小时中美是否就关税问题进行过接触?外交部:没有
  • 五一去哪儿|外国朋友来中国,“买买买”成为跨境旅游新趋势
  • 迎接八方来客:全国多地“五一”假期党政机关大院停车场免费开放
  • 青海西宁市城西区副区长于媛媛主动投案,接受审查调查