新聞中心

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

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

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

          Atomthreads像眾多操作系統(tǒng)一樣,在沒有任務(wù)調(diào)度是會調(diào)用idle。(by cpuwolf)

        本文引用地址:http://www.104case.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()是以線程的形式存在,也就是最低優(yōu)先級線程。作者默認(rèn)沒有填寫這個函數(shù)。

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

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

          

         

          atomthreads如果你在idle直接進(jìn)入HALT,因為基本只有外部中斷可以喚醒退出這個模式,當(dāng)系統(tǒng)醒來了,請你想想,你的系統(tǒng)心跳還準(zhǔn)么?你的應(yīng)用線程如果使用了定時器,本來希望1秒鐘后調(diào)用某個CALLBACK,結(jié)果HALT睡了5分鐘,那還是定時器API本身參數(shù)的意義么?

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

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

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

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



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

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 峡江县| 昌邑市| 贵州省| 阿克| 武强县| 金华市| 闸北区| 宾阳县| 阿拉善盟| 陇西县| 刚察县| 孝义市| 故城县| 合肥市| 盘山县| 长汀县| 中西区| 雷波县| 五莲县| 中卫市| 古蔺县| 合江县| 长兴县| 永清县| 斗六市| 宾阳县| 青浦区| 扶风县| 茂名市| 宁夏| 修文县| 连城县| 重庆市| 平度市| 当雄县| 阿图什市| 富顺县| 秦安县| 庆阳市| 教育| 林西县|