历史上的今天
今天是:2024年11月20日(星期三)
2019年11月20日 | Atomthreads关于STM8S低功耗的思考
2019-11-20 来源:eefocus
Atomthreads像众多操作系统一样,在没有任务调度是会调用idle。
static void atomIdleThread (uint32_t param)
{
/* Compiler warning */
param = param;
/* Loop forever */
while (1)
{
/** todo Provide user idle hooks*/
}
}
atomthreads中atomIdleThread()是以线程的形式存在,也就是最低优先级线程。作者默认没有填写这个函数。
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,这样系统就可以在制定的时间被唤醒。粗略的一看,还以为问题解决了。

暂时不谈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就停跳。其实就是上面想实现的东西。
史海拾趣
|
基于单片机频率合成器设计矿业大学99毕业论文频率合成和锁相技术是近年来发展起来的新兴技术。它们在雷达、通信、遥控遥测、电视广播和电子测量仪器等领域已得到广泛的应用。 频率合成器的应用之所以广泛,大概主要归因于两种趋向:一是由于通信频 ...… 查看全部问答> |
|
想求求各位大虾帮帮忙 看看用单片机控制步进电机正反转 调速 怎么弄 步进电机驱动是 用tb6560做的 我买了 步进驱动器--tb6560ahq-v2.0(0.5-3A ,2、8、1 ...… 查看全部问答> |
|
最近在做一个项目是关于串口通信的 要从外部接收大量的一个字节一个字节的数据 想把接收的某一部分存在norflash中用数组该怎么声明呢??(ADS编译器) 放在ram中又该怎么声明呢??? 如果不用数组直接放(NORFLASH,RAM)的话怎么能保证自己 ...… 查看全部问答> |
|
最近学习vxworks,看的书大多是tornado的帮助文件 现在能进行vxworks上的应用程序的开发 ,在vmware上启动vxworks 对于bootloader,BSP,有些了解,了解如何在vxworks上建立http服务器(从eeworld上获得代码做的实验) 现在想深入的学习,请教各位 ...… 查看全部问答> |
|
请介绍些Windows mobile 5.0 pocket pc 平台级(操作系统的定制)开发的资料? 请介绍些Windows mobile 5.0 pocket pc 平台级开发的资料? 注意不是应用软件端的开发,是操作系统的定制。 我装了VS2005 以及一些SDK 模拟器,只找到程序端的开发的资料。 我网上找了,没找到像介绍Platformbuilder 4.2,Platformbuilder 5.0,Pl ...… 查看全部问答> |




