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