Python變得越來越流行,現在實時嵌入式軟件開發人員可以通過Micro Python在微控制器上訪問Python,開發人員了解Micro Python堆比以往任何時候都更重要。嵌入式開發人員需要了解幾個與堆相關的庫和內核選項。
首先,并非所有的Micro Python端口都充分利用了微控制器中可用的RAM空間。Micro Python最初是為具有128 KB RAM的STM32F405開發的。大多數端口以STM32F405作為默認模板,這意味著堆仍然只能分配到0x1C000字節。這看起來似乎有很多堆空間,但是Python解釋器在運行時使用堆來分配對象和處理腳本,所以可用的堆空間越多越好!
開發人員可以在他們的內核鏈接器文件中查找變量_heap_end。該變量的大小應與微控制器的RAM大小相匹配。例如,STM32F405的RAM為128 kB,has _heap_end = 0x2001C000。使用STM32F429等具有192 kB RAM的器件的開發人員會希望確保_heap_end = 0x2002C000。為堆分配額外的0x10000 64 kB內存。進行這種調整可以防止腳本中出現內存不足的錯誤。
即使嵌入式開發人員有很多堆空間,他們也會希望定期監控他們的堆空間使用情況,以確保堆得到有效使用。當Python解釋器執行它的腳本時,對象將被創建和銷毀。有一個垃圾收集器可以回收被丟棄的對象,但有時它運行得不夠快。隨著時間的推移,堆會變得非常零碎,幾乎無法使用。開發人員可以通過導入gc庫并調用collect方法來強制垃圾回收。
Import gc
gc.collect()
在執行期間,可以使用mem_info方法密切監視Micro Python的內存使用情況。調用mem_info()將打印出基本信息,如堆棧使用情況、總堆空間、已用堆空間,甚至可用塊數。當開發人員使用詳細模式(傳入1)調用mem_info時,事情變得非常有趣。當這種情況發生時,仍然提供基本信息,但是也打印出堆如何被使用的完整輸出。
嵌入式開發人員不能忘記,即使Python運行在微控制器上,他們編寫代碼的方式也可能會產生實時和內存后果。從內存的角度來看,在開發過程中使用mem_info是一種很好的方式,可以監控堆的使用情況,以及堆是否會分裂到試圖分配另一個對象最終會失敗的程度。