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