加入星計(jì)劃,您可以享受以下權(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ū)動(dòng)
    • 電源管理策略
    • 傳感器與外設(shè)管理
    • 低功耗通信協(xié)議的實(shí)現(xiàn)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

一些低功耗軟件設(shè)計(jì)的要點(diǎn)!

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

大家好,我是雜燴君。

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

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

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

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

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

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

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

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

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

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

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

通過配置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的計(jì)算量和內(nèi)存訪問次數(shù),從而降低系統(tǒng)能耗。同時(shí),對(duì)于需要頻繁進(jìn)行數(shù)據(jù)處理的應(yīng)用場景,可以考慮使用硬件加速器(如DSP、GPU等)來分擔(dān)CPU的計(jì)算任務(wù),進(jìn)一步提高系統(tǒng)的能效比。

1、使用固定點(diǎn)代替浮點(diǎn)

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

浮點(diǎn)計(jì)算示例(非優(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;
}

固定點(diǎn)計(jì)算示例(優(yōu)化)

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

#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)
{
????//?將浮點(diǎn)數(shù)轉(zhuǎn)換為固定點(diǎn)數(shù)??
????int?a?=?floatToFixed(1.5f);
????int?b?=?floatToFixed(2.3f);
????int?c?=?floatToFixed(4.2f);

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

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

????return?0;
}

注意

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

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

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

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

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

非優(yōu)化:

for?(int?i?=?0;?i?<?arraySize;?i++)?
{??
????//?假設(shè)我們總是處理每個(gè)元素??
????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ù)壓縮

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

中斷與事件驅(qū)動(dòng)

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

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

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

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

電源管理策略

智能地控制各個(gè)外設(shè)或子系統(tǒng)的電源供應(yīng),僅在需要時(shí)供電。這通常涉及到硬件的電源管理功能,但軟件可以通過控制電源使能引腳或發(fā)送電源管理命令來實(shí)現(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ù)需求動(dòng)態(tài)調(diào)整采樣率。

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

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

在嵌入式系統(tǒng)中實(shí)現(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:
????????????//?連接斷開后的處理??
????????????//?可以重新啟動(dòng)廣告或進(jìn)入深度休眠??
????????????ble_advertising_start(&adv_params);
????????????break;
????????//?其他BLE事件處理...??
????}
}??

嵌入式系統(tǒng)的低功耗設(shè)計(jì)是一個(gè)綜合性的工程問題,需要我們?cè)谲浖O(shè)計(jì)過程中充分考慮各種因素。

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

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
NC7SZ08P5X 1 Rochester Electronics LLC LVC/LCX/Z SERIES, 2-INPUT AND GATE, PDSO5, 1.25 MM, ROHS COMPLIANT, EIAJ, SC-88A, SC-70, 5 PIN
$0.28 查看
SN74LVC1G126DCKR 1 Texas Instruments Single 1.65-V to 5.5-V buffer with 3-state outputs 5-SC70 -40 to 125

ECAD模型

下載ECAD模型
$0.3 查看
PS2801-1-F3-A 1 NEC Electronics Group Transistor Output Optocoupler, 1-Element, 2500V Isolation,
$0.98 查看

相關(guān)推薦

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

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