加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 任務(wù)調(diào)度與休眠管理
    • 數(shù)據(jù)處理與算法優(yōu)化
    • 中斷與事件驅(qū)動
    • 電源管理策略
    • 傳感器與外設(shè)管理
    • 低功耗通信協(xié)議的實現(xiàn)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

一些低功耗軟件設(shè)計的要點!

07/16 12:20
933
閱讀需 14 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

大家好,我是雜燴君。

硬件產(chǎn)品,低功耗設(shè)計是提升產(chǎn)品競爭力的關(guān)鍵因素之一。

低功耗設(shè)計的主要意義:

??延長電池壽命:對于便攜式設(shè)備(如智能手機(jī)、平板電腦可穿戴設(shè)備等),低功耗設(shè)計能夠顯著延長電池使用時間,減少用戶頻繁充電的需求,提升用戶體驗。

??降低運(yùn)行成本:在長期運(yùn)行的應(yīng)用場景中,低功耗設(shè)計能夠顯著降低能耗成本。

??提高系統(tǒng)可靠性:高功耗會導(dǎo)致設(shè)備溫度升高,而高溫是電子元件老化和失效的主要原因之一。通過低功耗設(shè)計,可以降低設(shè)備的運(yùn)行溫度,減少因過熱導(dǎo)致的故障,提高系統(tǒng)的穩(wěn)定性和可靠性。

低功耗設(shè)計的具體實現(xiàn)方式涉及到多個部分:硬件設(shè)計、軟件設(shè)計、散熱設(shè)計等方面。

本篇文章我們著重關(guān)注低功耗軟件設(shè)計的一些要點。

任務(wù)調(diào)度與休眠管理

RTOS通常具有高效的任務(wù)調(diào)度機(jī)制和資源管理能力,能夠減少CPU的空閑時間,避免不必要的能耗。此外,一些RTOS還支持低功耗模式,如睡眠模式或深度睡眠模式,當(dāng)系統(tǒng)處于空閑狀態(tài)時,可以自動進(jìn)入低功耗狀態(tài),從而顯著降低能耗。

比如,F(xiàn)reeRTOS提供了一個叫做Tickless的低功耗模式,該模式通過減少不必要的系統(tǒng)時鐘中斷來降低功耗。

Tickless模式在空閑任務(wù)執(zhí)行期間關(guān)閉系統(tǒng)節(jié)拍中斷(滴答定時器中斷),只有當(dāng)其他中斷發(fā)生或任務(wù)需要處理時,處理器才會被喚醒。這樣可以顯著減少處理器在空閑時的功耗。

通過配置FreeRTOSConfig.h文件中的宏來啟用和配置Tickless模式,如configUSE_TICKLESS_IDLEconfigEXPECTED_IDLE_TIME_BEFORE_SLEEP等。

數(shù)據(jù)處理與算法優(yōu)化

優(yōu)化算法和數(shù)據(jù)處理過程也是降低嵌入式系統(tǒng)功耗的有效途徑。通過選擇高效的算法和數(shù)據(jù)結(jié)構(gòu),可以減少CPU的計算量和內(nèi)存訪問次數(shù),從而降低系統(tǒng)能耗。同時,對于需要頻繁進(jìn)行數(shù)據(jù)處理的應(yīng)用場景,可以考慮使用硬件加速器(如DSP、GPU等)來分擔(dān)CPU的計算任務(wù),進(jìn)一步提高系統(tǒng)的能效比。

1、使用固定點代替浮點

在許多嵌入式系統(tǒng)中,使用定點數(shù)(Fixed-Point Arithmetic)代替浮點數(shù)(Floating-Point Arithmetic)運(yùn)算可以顯著減少計算量和功耗,因為定點運(yùn)算通常比浮點運(yùn)算更快且能耗更低。

浮點計算示例(非優(yōu)化)
#include?<stdio.h>??
??
floatmultiplyAndAdd(float?a,?float?b,?float?c)
{
????return?a?*?b?+?c;
}

intmain(void)
{
????float?result?=?multiplyAndAdd(1.5f,2.3f,4.2f);

????printf("Result:?%fn",?result);

?

????return?0;
}

固定點計算示例(優(yōu)化)

在這個例子中,我們使用整數(shù)來表示固定點小數(shù),并假設(shè)我們使用一個固定的比例因子(如1000)來表示小數(shù)部分。這意味著我們將所有的浮點數(shù)乘以1000并轉(zhuǎn)換為整數(shù),然后進(jìn)行計算。

#include?<stdio.h>??
??
//?比例因子??
#define?FIXED_POINT_SCALE?1000??

intfloatToFixed(float?f)
{
????return?(int)(f?*?FIXED_POINT_SCALE);
}

intfixedMultiply(int?a,?int?b)
{
????return?(a?*?b)/?FIXED_POINT_SCALE;
}

intfixedMultiplyAndAdd(int?a,?int?b,?int?c)
{
????return?((a?*?b)/?FIXED_POINT_SCALE)+?c;
}

intmain(void)
{
????//?將浮點數(shù)轉(zhuǎn)換為固定點數(shù)??
????int?a?=?floatToFixed(1.5f);
????int?b?=?floatToFixed(2.3f);
????int?c?=?floatToFixed(4.2f);

????//?進(jìn)行固定點計算??
????int?result?=?fixedMultiplyAndAdd(a,?b,?c);

????//?將結(jié)果轉(zhuǎn)換回浮點數(shù)??
????float?resultFloat?=(float)result?/?FIXED_POINT_SCALE;
????printf("Fixed-Point?Result:?%fn",?resultFloat);

????return?0;
}

注意

??在這個簡化的例子中,我們直接進(jìn)行了整數(shù)除法和乘法,但在實際應(yīng)用中,大數(shù)乘法可能導(dǎo)致整數(shù)溢出。需要使用更復(fù)雜的算法來處理大數(shù)運(yùn)算。

??固定點數(shù)的精度取決于你選擇的比例因子。比例因子越大,精度越高,但所需的整數(shù)大小也越大,可能導(dǎo)致內(nèi)存占用增加。

??實際需要根據(jù)具體的應(yīng)用場景調(diào)整比例因子或采用動態(tài)比例因子來平衡精度和性能。

2、優(yōu)化循環(huán)和條件語句

減少循環(huán)次數(shù)和避免深層嵌套的條件語句可以降低功耗。

非優(yōu)化:

for?(int?i?=?0;?i?<?arraySize;?i++)?
{??
????//?假設(shè)我們總是處理每個元素??
????processElement(array[i]);??
}

優(yōu)化:

int?findLastValidIndex(int*?array,?int?size)
{
????for(int?i?=?size?-1;?i?>=0;?i--)
????{
????????if(array[i]!=?SOME_INVALID_VALUE)
????????{
????????????return?i;
????????}
????}
????return?-1;
}

int?lastValidIndex?=?findLastValidIndex(array,?arraySize);
for(int?i?=0;?i?<=?lastValidIndex;?i++)
{
????processElement(array[i]);
}??

3、數(shù)據(jù)壓縮

在傳輸或存儲數(shù)據(jù)之前進(jìn)行壓縮,可以減少數(shù)據(jù)傳輸和存儲的功耗。關(guān)于lz4壓縮的文章:lz4壓縮庫的使用

中斷與事件驅(qū)動

中斷和事件驅(qū)動編程是嵌入式系統(tǒng)中常見的編程模式,它們能夠減少CPU的輪詢時間,從而降低系統(tǒng)能耗。通過合理配置中斷源和中斷優(yōu)先級,確保只有重要的事件才能喚醒CPU,降低CPU使用率。

void?GPIO_IRQHandler(void)
{
????if(GPIO_PinRead(PIN_BUTTON)==?LOW)
????{
????????//?處理按鈕按下事件??
????????processButtonPress();
????}
????//?清除中斷標(biāo)志等??
}

voidprocessButtonPress(void)
{
????//?執(zhí)行按鈕按下后的操作??
}

//?在系統(tǒng)初始化時配置GPIO中斷??
voidGPIO_Init(void)
{
????//?配置GPIO引腳為輸入,啟用中斷等??
}

電源管理策略

智能地控制各個外設(shè)或子系統(tǒng)的電源供應(yīng),僅在需要時供電。這通常涉及到硬件的電源管理功能,但軟件可以通過控制電源使能引腳或發(fā)送電源管理命令來實現(xiàn)。

void?PowerGatePeripheral(uint8_t?peripheral_id,?bool?enable)
{
????if(enable)
????{
????????//?啟用外設(shè)電源??
????????HAL_PowerEnable(peripheral_id);

????}

????else

????{
//?禁用外設(shè)電源
HAL_PowerDisable(peripheral_id);
}
}??

傳感器與外設(shè)管理

根據(jù)需求動態(tài)調(diào)整采樣率。

void?SensorSamplingTask(void?*pvParameters)
{
????while(1)
????{
????????//?檢查是否需要高采樣率??
????????if(needHighSamplingRate())
????????{
????????????sampleSensorAtHighRate();
????????}
????????else
????????{
????????????sampleSensorAtLowRate();
????????}
????????vTaskDelay(pdMS_TO_TICKS(samplingInterval));
????}
}

低功耗通信協(xié)議的實現(xiàn)

在嵌入式系統(tǒng)中實現(xiàn)低功耗通信協(xié)議,如BLE(Bluetooth Low Energy)或Zigbee,需要仔細(xì)管理連接、數(shù)據(jù)傳輸和斷開連接的過程,以確保在通信過程中保持低功耗。

void?BLE_ConnectionHandler(ble_evt_t?*p_ble_evt)
{
????switch(p_ble_evt->header.evt_id)
????{
????????case?BLE_GAP_EVT_CONNECTED:
????????????//?可以設(shè)置連接參數(shù)(如連接間隔)以優(yōu)化功耗??
????????????ble_conn_params_init();
????????????break;
????????case?BLE_GAP_EVT_DISCONNECTED:
????????????//?連接斷開后的處理??
????????????//?可以重新啟動廣告或進(jìn)入深度休眠??
????????????ble_advertising_start(&adv_params);
????????????break;
????????//?其他BLE事件處理...??
????}
}??

嵌入式系統(tǒng)的低功耗設(shè)計是一個綜合性的工程問題,需要我們在軟件設(shè)計過程中充分考慮各種因素。

通過合理選擇嵌入式操作系統(tǒng)、優(yōu)化算法與數(shù)據(jù)處理過程等措施,可以有效地降低嵌入式系統(tǒng)的功耗水平,提高系統(tǒng)的能效比和續(xù)航能力。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
XRCGB25M000F3A00R0 1 Murata Manufacturing Co Ltd Parallel - Fundamental Quartz Crystal, 25MHz Nom, ROHS AND REACH COMPLIANT, SMALL, SMD, 3 PIN

ECAD模型

下載ECAD模型
$0.34 查看
M25P05-AVMN6P 1 Rochester Electronics LLC 64KX8 FLASH 2.7V PROM, PDSO8, 0.150 INCH, ROHS COMPLIANT, PLASTIC, SOP-8
$0.79 查看
S29GL256P10FFI020 1 AMD Flash, 16MX16, 100ns, PBGA64,
$9.29 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

本公眾號專注于嵌入式技術(shù),包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學(xué)習(xí)筆記,同時,公眾號內(nèi)包含大量的學(xué)習(xí)資源。歡迎關(guān)注,一同交流學(xué)習(xí),共同進(jìn)步!