使用直接內(nèi)存訪問減少能源消耗
嵌入式系統(tǒng)所消耗的能量,尤其是電池操作的設(shè)備,例如IoT傳感器節(jié)點,可能是該設(shè)備成功實現(xiàn)其目的還是陷入默默無聞之間的區(qū)別。開發(fā)人員可以使用許多低功率最佳實踐,例如:
· 使用中斷并避免進(jìn)行投票
· 利用夜間睡眠
· 關(guān)閉未使用的外圍設(shè)備和時鐘
· 限制系統(tǒng)時鐘
· 采用自主外圍設(shè)備
嵌入軟件開發(fā)人員可用的最大工具也許是直接內(nèi)存訪問(DMA)。
DMA為嵌入式開發(fā)人員提供了一種有效的方法,可以在無CPU中間的情況下傳輸微控制器周圍的數(shù)據(jù)。在資源約束的應(yīng)用程序中,DMA可以允許CPU處理重要的任務(wù),而DMA也許是從UART讀取數(shù)據(jù)字節(jié)并將其放置為以后處理的數(shù)據(jù)字節(jié)。對于有興趣最大化能源消耗的開發(fā)人員,可以將CPU放置在低功率模式下,從而使DMA可以以較低的能量水平傳輸數(shù)據(jù)!畢竟,CPU是微控制器上所有最饑餓的設(shè)備之一。
讓我們考慮一個簡單的示例,其中IoT傳感器節(jié)點將使用數(shù)字轉(zhuǎn)換器(ADC)定期采樣模擬傳感器。開發(fā)人員可以通過幾種不同的方式獲取傳感器數(shù)據(jù),每種數(shù)據(jù)都會以不同的方式影響系統(tǒng)消耗的能量。首先,我仍然經(jīng)常看到的實現(xiàn)就是簡單地進(jìn)行輪詢并等待轉(zhuǎn)換完整的標(biāo)志。該代碼看起來與下面的代碼非常相似:
void sampleSensors(void){for(sensor= 0;sensor<MAX_SENSORS; p }}}< [sensor]="adc_get_result(sensor);" sensor_data while(!adc_conversion_complete); ++){adc_channel_convert(sensor); senser>
當(dāng)然可以以周期性的速度調(diào)用此功能,并將采樣各種模擬傳感器,但效率非常低。 While語句基本上正在等待ADC轉(zhuǎn)換完成標(biāo)志,并且CPU不斷檢查以查看是否可以繼續(xù)前進(jìn)。即使在一個小48 MHz微控制器上,該軟件體系結(jié)構(gòu)也會燃燒很多周期。
從被調(diào)查的方法中提起的下一步是使用ADC中斷。開發(fā)人員使用CPU啟動ADC樣本,然后在等待ADC完成時脫離執(zhí)行其他代碼或進(jìn)入睡眠狀態(tài)。 ADC轉(zhuǎn)換完成后,中斷會喚醒微控制器,并將樣品存儲在數(shù)據(jù)緩沖區(qū)中。
void adcinterrupt_handler(void){sensor_data [sensor] = adc_get_results(sensor);}
這種方法比投票要高得多,但要真正最大程度地減少能源使用情況,開發(fā)人員需要使用DMA。
我發(fā)現(xiàn)最節(jié)能的方法是利用DMA通道將所得的ADC轉(zhuǎn)換轉(zhuǎn)換為SRAM。首先,開發(fā)人員將DMA控制器源設(shè)置為ADC轉(zhuǎn)換數(shù)據(jù)緩沖區(qū)。必須設(shè)置要傳輸?shù)淖止?jié)數(shù),并且通常是兩個字節(jié)的倍數(shù)。接下來,開發(fā)人員必須設(shè)置SRAM位置的地址,該位置存儲用于處理的ADC示例數(shù)據(jù)。最后,可以將DMA配置為當(dāng)ADC轉(zhuǎn)換標(biāo)志完成時(通常在中斷發(fā)射時)時傳輸數(shù)據(jù)。
在大多數(shù)情況下,開發(fā)人員可以使用低功率計時器在CPU睡覺時啟動ADC轉(zhuǎn)換。隨著CPU入睡,傳感器采樣和數(shù)據(jù)存儲的整個過程是在低能狀態(tài)下在幕后完成的!僅當(dāng)將足夠的數(shù)據(jù)輸入緩沖區(qū)并準(zhǔn)備好處理時,CPU才醒來。使用低功率計時器和直接內(nèi)存訪問(DMA),開發(fā)人員可以執(zhí)行傳感器采樣和數(shù)據(jù)存儲,而處理器保持低功率狀態(tài)。
開發(fā)人員第一次使用DMA控制器時,它似乎有些令人生畏。這似乎很復(fù)雜,但是DMA的使用不僅可以顯著提高能源效率,還可以提高數(shù)據(jù)吞吐量。任何有興趣開發(fā)低功率設(shè)備或電池操作設(shè)備的開發(fā)人員都應(yīng)熟悉其特定的MCU DMA控制器。