<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > 基于STM8S的Atomthreads低功耗的深度思考

基于STM8S的Atomthreads低功耗的深度思考

作者: 時(shí)間:2016-09-21 來(lái)源:網(wǎng)絡(luò ) 收藏

  Atomthreads像眾多操作系統一樣,在沒(méi)有任務(wù)調度是會(huì )調用idle。(by cpuwolf)

本文引用地址:http://dyxdggzs.com/article/201609/310074.htm

  static void atomIdleThread (uint32_t param)

  {

  /* Compiler warning */

  param = param;

  /* Loop forever */

  while (1)

  {

  /** todo Provide user idle hooks*/

  }

  }

  atomthreads中atomIdleThread()是以線(xiàn)程的形式存在,也就是最低優(yōu)先級線(xiàn)程。作者默認沒(méi)有填寫(xiě)這個(gè)函數。

  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我們最自然想到的是在其中加一個(gè)wfi,STM8進(jìn)入wfi模式幾乎不會(huì )影響任何外設的運行。以105K4為例,其進(jìn)入該模式的典型電流是1.8mA。這個(gè)電流,用一節2000mA手機供電,理論上也最多能堅持46天,才一個(gè)月多點(diǎn)。這個(gè)記錄太差了。

  STM8還有一個(gè)HALT模式,這是該芯片的最模式,電流是uA級別。但是該模式有諸多限制,進(jìn)入該模式系統幾乎所有的clock都停止,你的timer,adc,uart等等全部停止,除了AWU。

  

 

  atomthreads如果你在idle直接進(jìn)入HALT,因為基本只有外部中斷可以喚醒退出這個(gè)模式,當系統醒來(lái)了,請你想想,你的系統心跳還準么?你的應用線(xiàn)程如果使用了定時(shí)器,本來(lái)希望1秒鐘后調用某個(gè)CALLBACK,結果HALT睡了5分鐘,那還是定時(shí)器API本身參數的意義么?

  對datasheet熟悉的讀者可能,可能立刻想到了AWU,似乎可以解決這個(gè)問(wèn)題。在idle進(jìn)入HALT前,把還能睡的時(shí)間填入AWU,這樣系統就可以在制定的時(shí)間被喚醒。粗略的一看,還以為問(wèn)題解決了。

  暫時(shí)不談AWU的時(shí)間不是任意值都可以接受的,是一個(gè)非常不準確的喚醒時(shí)鐘。

  舉個(gè)其他例子,如果idle進(jìn)入HALT前,系統還可以睡20分鐘,我覺(jué)的一個(gè)設計優(yōu)良的系統,應用層讓系統有睡20分鐘的可能性是很起碼的。不幸的是,在5分鐘的時(shí)候,一個(gè)外部中斷進(jìn)來(lái)了,系統很自然退出HALT。我想問(wèn)你,從系統的角度看,系統之前睡了多久。不要告訴玩我是5分鐘,大哥,那是我假設的,我問(wèn)得是,從系統的角度。睡了多久?AWU這個(gè)唯一在運行的模塊,上面是沒(méi)有時(shí)間讓你讀的,你完全無(wú)法得知剛才睡了多久。

  其實(shí)上面的這個(gè)理念不是我創(chuàng )造的,在linux中早就有了,它叫variable tick timer,什么意思?通常我們的心跳時(shí)鐘,是有規律的觸發(fā)中斷,比如10ms一次,這導致系統最多能安靜10ms,想多睡會(huì )兒?沒(méi)門(mén)!10ms后中斷就來(lái)了。這種設計對是不利的。后來(lái)就有大牛,引入了variable tick timer,這里tick timer就是我們上面一直說(shuō)的心跳時(shí)鐘。variable就是可變的羅!表面意思就是我們的心臟可以走走停停,這樣想已經(jīng)不符合人類(lèi)的自然規律,所以也確實(shí)不能再叫heart beattimer。當系統醒的時(shí)候,是有規律的跳動(dòng),當系統睡眠的時(shí)候, timer就停跳。其實(shí)就是上面想實(shí)現的東西。



關(guān)鍵詞: STM8S 低功耗

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>