Atomthreads像很多操作体系相同,在没有使命调度是会调用idle。(by cpuwolf)
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就停跳。其实便是上面想完成的东西。