日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FreeRTOS 低功耗之 tickless 模式

發(fā)布時間:2024/10/14 编程问答 92 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FreeRTOS 低功耗之 tickless 模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

tickless 低功耗模式介紹

??tickless 低功耗機制是當前小型 RTOS 所采用的通用低功耗方法,比如 embOS,RTX 和 uCOS-III (類似方法)都有這種機制。FreeRTOS 的低功耗也是采用的這種方式。
??那么 tickless 又是怎樣一種模式呢?僅從字母上看 tick 是滴答時鐘的意思,less 是 tick 的后綴,表示較少的,這里的含義可以表示為無滴答時鐘。整體看這個字母就是表示滴答時鐘節(jié)拍停止運行的情況。
??反映在 FreeRTOS 上,tickless 又是怎樣一種情況呢?我們都知道,當用戶任務(wù)都被掛起或者阻塞時,最低優(yōu)先級的空閑任務(wù)會得到執(zhí)行。 那么 STM32 支持的睡眠模式,停機模式就可以放在空閑任務(wù)里面實現(xiàn)。但是,為了實現(xiàn)低功耗最優(yōu)設(shè)計,我們還不能直接把睡眠或者停機模式直接放在空閑任務(wù)里。
??進入空閑任務(wù)后,首先要計算可以執(zhí)行低功耗的最大時間,也就是求出下一個要執(zhí)行的高優(yōu)先級任務(wù)還剩多少時間。 然后就是把低功耗的喚醒時間設(shè)置為這個求出的時間,到時間后系統(tǒng)會從低功耗模式被喚醒,繼續(xù)執(zhí)行多任務(wù)。這個就是所謂的 tickless 模式。

  • 空閑鉤子設(shè)置低功耗時,需要在FreeRTOSConfig.h 中,將宏configUSE_IDLE_HOOK 置為1,然后自己實現(xiàn)固定接口:void vApplicationIdleHook(void );同時, 這個鉤子函數(shù)不可以調(diào)用會引起空閑任務(wù)阻塞的API函數(shù)(例如:vTaskDelay()、帶有阻塞時間的隊列和信號量函數(shù)),在鉤子函數(shù)內(nèi)部使用協(xié)程是被允許的。
  • 在空閑任務(wù)鉤子函數(shù)中設(shè)置微處理器進入低功耗模式來達到省電的目的。因為系統(tǒng)要響應(yīng)系統(tǒng)節(jié)拍中斷事件,因此使用這種方法會周期性的退出、再進入低功耗狀態(tài)。如果系統(tǒng)節(jié)拍中斷頻率過快,則大部分電能和CPU時間會消耗在進入和退出低功耗狀態(tài)上。
  • ??從上面的講解中可以看出,實現(xiàn) tickless 模式最麻煩是低功耗可以執(zhí)行的時間如何獲取。 關(guān)于這個問題,FreeRTOS 已經(jīng)為我們做好了。

    FreeRTOS 的低功耗模式介紹

    ??對于 Cortex-M3 和 M4 內(nèi)核來說,FreeRTOS 已經(jīng)提供了 tickless 低功耗代碼的實現(xiàn),通過調(diào)用指令WFI實現(xiàn)睡眠模式,具體代碼的實現(xiàn)就在 port.c文件中,用戶只需在 FreeRTOSConfig.h 文件中配置 宏定義 configUSE_TICKLESS_IDLE 為 1 即可。

    注意:如果配置此參數(shù)為 2,那么用戶可以自定義 tickless 低功耗模式的實現(xiàn)。

    ??當用戶將宏定義 configUSE_TICKLESS_IDLE 配置為 1 且系統(tǒng)運行滿足以下兩個條件時,系統(tǒng)內(nèi)核會自動的調(diào)用低功耗宏定義函數(shù) portSUPPRESS_TICKS_AND_SLEEP():

    • 當前空閑任務(wù)正在運行,所有其它的任務(wù)處在掛起狀態(tài)或者阻塞狀態(tài)。
    • 根據(jù)用戶配置configEXPECTED_IDLE_TIME_BEFORE_SLEEP的大小,只有當系統(tǒng)可運行于低功耗模式的時鐘節(jié)拍數(shù)大于等于這個參數(shù)時,系統(tǒng)才可以進入到低功耗模式。 此參數(shù)默認已經(jīng)在 FreeRTOS.h文件進行定義了,下面是具體的定義內(nèi)容(當然,用戶也可以在 FreeRTOSConfig.h 文件中重新定義):

      默認定義的大小是 2 個系統(tǒng)時鐘節(jié)拍,且用戶自定義的話,不可以小于 2 個系統(tǒng)時鐘節(jié)拍。
      函數(shù) portSUPPRESS_TICKS_AND_SLEEP(); 是 FreeRTOS 實現(xiàn) tickless模式的關(guān)鍵,此函數(shù)被空閑任務(wù)調(diào)用,其定義是在 portmacro.h 文件中:

    FreeRTOS 在線電子手冊低功耗的說明 http://www.freertos.org/low-power-tickless-rtos.html

    FreeRTOS 的低功耗模式配置

    ??關(guān)于 FreeRTOS 低功耗方面的配置主要涉及到以下幾個問題。

    • 滴答定時器頻率與系統(tǒng)主頻的關(guān)系
      ??對于Cortex-M3 和 M4 內(nèi)核的微控制器來說,實時操作系統(tǒng)一般都是采用滴答定時器做系統(tǒng)時鐘,FreeRTOS 也不例外。 SysTick 滴答定時器是一個 24bit 的遞減計數(shù)器,有兩種時鐘源可選擇,一個是系統(tǒng)主頻,另一個是系統(tǒng)主頻的八分頻,默認的 port.c 移植文件中是用的系統(tǒng)主頻。 這里我們就根據(jù)這兩種時鐘源來說一說配置上的不同。

      • SysTick 滴答定時器時鐘源選擇系統(tǒng)主頻
        如果滴答定時器選擇系統(tǒng)主頻的話,那么需要配置 configSYSTICK_CLOCK_HZ 等于configCPU_CLOCK_HZ,這種關(guān)系已經(jīng)在 port.c 文件中進行默認配置了:

        其中系統(tǒng)主頻 configCPU_CLOCK_HZ 是在 FreeRTOSConfig.h文件中進行定義的。
      • SysTick 滴答定時器時鐘源選擇系統(tǒng)主頻的八分頻
        這種情況的話,需要用戶在 FreeRTOSConfig.h 文件中專門配置 configSYSTICK_CLOCK_HZ為實際需要的頻率,即系統(tǒng)主頻的八分頻大小。

      系統(tǒng)時鐘節(jié)拍不使用滴答定時器。這種情況我們這里不做討論,用戶看 FreeRTOS 官網(wǎng)此處的說明即可:http://www.freertos.org/low-power-ARM-cortex-rtos.html

    如何使用微控制器其它低功耗模式

    ??前面我們說了,對 Cortex-M3 和 M4 內(nèi)核來說,FreeRTOS 自帶的低功耗模式是通過指令WFI 讓系統(tǒng)進入睡眠模式,如果想讓系統(tǒng)進入停機模式,又該怎么修改呢?FreeRTOS 為我們提供了兩個函數(shù):

    configPRE_SLEEP_PROCESSING( xExpectedIdleTime ); configPOST_SLEEP_PROCESSING( xExpectedIdleTime );

    這兩個函數(shù)的定義是在FreeRTOS.h 文件中定義的,什么都沒有執(zhí)行:

    如果需要實際執(zhí)行代碼,需要用戶在 FreeRTOSConfig.h 文件中重新進行宏定義,將其映射到一個實際的函數(shù)中。 另外,這兩個函數(shù)是在 port.c 文件中被函數(shù) vPortSuppressTicksAndSleep 調(diào)用,具體位置如下:


    這兩個函數(shù)位于指令 wfi 的前面和后面,用戶想實現(xiàn)其它低功耗方式的關(guān)鍵就在這兩個函數(shù)里面:

    • configPRE_SLEEP_PROCESSING( xExpectedIdleTime )
      執(zhí)行低功耗模式前,用戶可以在這個函數(shù)里面關(guān)閉外設(shè)時鐘來進一步降低系統(tǒng)功耗。 設(shè)置其它低功耗方式也是在這個函數(shù)里面,用戶只需設(shè)置參數(shù) xExpectedIdleTime=0 即可屏蔽掉默認的 wfi 指令執(zhí)行方式,因為退出這個函數(shù)后會通過 if 語句檢測此參數(shù)是否大于 0,即上面的代碼所示。 因此,如果用 戶 想 實 現(xiàn) 其 它 低 功 耗 模 式 還 是 比 較 方 便 的 , 配 置 好 其 它 低 功 耗 模 式 后 , 設(shè) 置 參 數(shù)xExpectedIdleTime = 0 即可,但切不可將此參數(shù)隨意設(shè)置為 0 以外的其它數(shù)值。
    • configPOST_SLEEP_PROCESSING ( xExpectedIdleTime )
      退出低功耗模式后,此函數(shù)會得到調(diào)用,之前在 configPRE_SLEEP_PROCESSING里面關(guān)閉的外設(shè)時鐘,可以在此函數(shù)里面重新打開,讓系統(tǒng)恢復(fù)到正常運行狀態(tài)。

    FreeRTOS 實現(xiàn) tickless 模式的框架

    ??對 Cortex-M3 和 M4 內(nèi)核的微控制器來說,FreeRTOS 已經(jīng)提供了 tickless 低功耗模式的代碼,對于沒有支持的微控制器,用戶可以在 FreeRTOSConfig.h 文件中配置 portSUPPRESS_TICKS_AND_SLEEP宏定義,來映射實際執(zhí)行函數(shù)。如果用戶不想使用 FreeRTOS 提供的的 tickless 也可以自定義,方法也是在 FreeRTOSConfig.h 文件中配置 portSUPPRESS_TICKS_AND_SLEEP 宏定義,來映射實際執(zhí)行函數(shù)。下面是 FreeRTOS 實現(xiàn)低功耗 tickless 模式的代碼框架,方便用戶對 tickles 模式有一個認識,同時也方便 FreeRTOS 沒有支持的微控制器,用戶可以參考實現(xiàn)。 當然,不局限于這種方法,用戶有更好的方法,也可以的。 其中函數(shù) vTaskStepTick 和eTaskConfirmSleepModeStatus 是 FreeRTOS 提供的,其余的函數(shù)是需要用戶實現(xiàn)的。




    顯然用戶自己配置要麻煩得多,好在FreeRTOS為M3,M4內(nèi)核的做好了低功耗之睡眠模式,使得我們使用STM32 F1,F4系列的時候可以很簡單,只需要在配置文件FreeRTOSConfig.h中加上一個宏定義:#define configUSE_TICKLESS_IDLE 1

    鳴謝

    文章原地址:http://www.cnblogs.com/yangguang-it/p/7232448.html,感謝原作者。
    在此基礎(chǔ)上,添加修改了一些東西!

    總結(jié)

    以上是生活随笔為你收集整理的FreeRTOS 低功耗之 tickless 模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。