打印
[STM8]

关于STM8S低功耗的思考

[复制链接]
4060|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
阳光豆苗|  楼主 | 2015-12-18 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Atomthreads像众多操作系统一样,在没有任务调度是会调用idle。

view plaincopy
static void atomIdleThread (uint32_t param)  
{  
    /* Compiler warning  */  
    param = param;  

    /* Loop forever */  
    while (1)  
    {  
        /** \todo Provide user idle hooks*/  
    }  
}  
atomthreads中atomIdleThread()是以线程的形式存在,也就是最低优先级线程。作者默认没有填写这个函数。

————————————————————
view plaincopy
uint8_t atomOSInit (void *idle_thread_stack_top, uint32_t idle_thread_stack_size)  
{  
    uint8_t status;  

    /* Initialise data */  
    curr_tcb = NULL;  
    tcbReadyQ = NULL;  
    atomOSStarted = FALSE;  

    /* Create the idle thread */  
    status = atomThreadCreate(&idle_tcb,  
                 IDLE_THREAD_PRIORITY,  
                 atomIdleThread,  
                 0,  
                 idle_thread_stack_top,  
                 idle_thread_stack_size);  

    /* Return status */  
    return (status);  

}  

针对STM8我们最自然想到的是在其中加一个wfi,STM8进入wfi模式几乎不会影响任何外设的运行。以STM8S105K4为例,其进入该模式的典型电流是1.8mA。这个电流,用一节2000mA手机供电,理论上也最多能**46天,才一个月多点。这个记录太差了。
STM8还有一个HALT模式,这是该芯片的最低功耗模式,电流是uA级别。但是该模式有诸多限制,进入该模式系统几乎所有的clock都停止,你的timer,adc,uart等等全部停止,除了AWU。

atomthreads如果你在idle直接进入HALT,因为基本只有外部中断可以唤醒退出这个模式,当系统醒来了,请你想想,你的系统心跳还准么?你的应用线程如果使用了定时器,本来希望1秒钟后调用某个CALLBACK,结果HALT睡了5分钟,那还是定时器API本身参数的意义么?

对datasheet熟悉的读者可能,可能立刻想到了AWU,似乎可以解决这个问题。在idle进入HALT前,把还能睡的时间填入AWU,这样系统就可以在制定的时间被唤醒。粗略的一看,还以为问题解决了。

沙发
阳光豆苗|  楼主 | 2015-12-18 16:57 | 只看该作者
暂时不谈AWU的时间不是任意值都可以接受的,是一个非常不准确的唤醒时钟。

我给你举个其他例子,如果idle进入HALT前,系统还可以睡20分钟,我觉的一个设计优良的低功耗系统,应用层让系统有睡20分钟的可能性是很起码的。不幸的是,在5分钟的时候,一个外部中断进来了,系统很自然退出HALT。我想问你,从系统的角度看,系统之前睡了多久。不要告诉玩我是5分钟,大哥,那是我假设的,我问得是,从系统的角度。睡了多久?AWU这个唯一在运行的模块,上面是没有时间让你读的,你完全无法得知刚才睡了多久。

其实上面的这个理念不是我创造的,在linux中早就有了,它叫variable tick timer,什么意思?通常我们的心跳时钟,是有规律的触发中断,比如10ms一次,这导致系统最多能安静10ms,想多睡会儿?没门!10ms后中断就来了。这种设计对低功耗是不利的。后来就有大牛,引入了variable tick timer,这里tick timer就是我们上面一直说的心跳时钟。variable就是可变的罗!表面意思就是我们的心脏可以走走停停,这样想已经不符合人类的自然规律,所以也确实不能再叫heart beattimer。当系统醒的时候,是有规律的跳动,当系统睡眠的时候, timer就停跳。其实就是上面想实现的东西。

使用特权

评论回复
板凳
毁灭2012| | 2015-12-18 17:11 | 只看该作者
AWU可以解决低功耗问题吗??

使用特权

评论回复
地板
全速前行| | 2015-12-18 17:12 | 只看该作者
Atomthreads在没有任务调度是会调用idle。

使用特权

评论回复
5
布谷鸟2015| | 2015-12-18 17:16 | 只看该作者
   /* Compiler warning  */       param = param;  _这个会不会显得太多余了啊??

使用特权

评论回复
6
jiang390625| | 2015-12-18 18:18 | 只看该作者
学到一些,起来楼主能把AWU也讲讲

使用特权

评论回复
7
mcu5i51| | 2015-12-19 15:08 | 只看该作者
L152开LCD时大约10uA,我不会关心睡觉了多久,对于我的仪表来说没有意义,我只关心什么时候醒来,是谁叫醒的,AWU的话,测一次数据,之后睡觉,按键的话,小睡一会,看看还在不,不在了就睡,在就起来处理一下.

使用特权

评论回复
8
mcu5i51| | 2015-12-19 15:11 | 只看该作者
STM8S103记得软件LCD下电流是30+uA,没有硬LCD,电流大了很多,中断约100Hz,只是秒表,测试用的;

使用特权

评论回复
9
ghl1227| | 2015-12-19 21:58 | 只看该作者
需要用有L芯片吧!6-7ua左右

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

469

帖子

8

粉丝