1. gzyueqian
      18078865874

      嵌入式開發(fā):在MicroPython中優(yōu)化堆的5個(gè)技巧

      更新時(shí)間: 2022-05-17 09:27:02來源: 粵嵌教育瀏覽量:8756

        多年來,嵌入式軟件開發(fā)人員一直在PC端使用Python與嵌入式系統(tǒng)進(jìn)行交互。在過去的幾年里,Micro Python,一種可以在微控制器上運(yùn)行的Python端口,越來越受歡迎。Python開發(fā)人員可能很想構(gòu)建和編寫他們的Micro Python代碼,類似于他們?cè)赑C上編寫Python的方式。

        Micro Python雖然非常強(qiáng)大,但仍然可以在資源受限的設(shè)備上運(yùn)行,這意味著開發(fā)人員需要小心他們?nèi)绾尉帉慞ython代碼。最大的潛在問題與堆、內(nèi)存碎片和內(nèi)存不足有關(guān)。以下是開發(fā)人員可以遵循的幾個(gè)技巧,以優(yōu)化他們的堆使用并從他們的Micro Python應(yīng)用程序中獲得最大收益。

        技巧1 – 使用mem_info監(jiān)控堆

        Micro Python在micropython庫中包含一個(gè)名為mem_info的內(nèi)存監(jiān)視器。調(diào)用 mem_info將為開發(fā)人員提供堆狀態(tài),以便他們可以確定有多少可用空間以及可以提示堆碎片程度的基本診斷。開發(fā)人員從一開始就可以做的最好的事情是使用 mem_info監(jiān)視堆,以了解他們的軟件如何影響堆。基本的mem_info輸出如下所示:

        當(dāng)基本信息不夠時(shí),開發(fā)人員可以請(qǐng)求詳細(xì)列表,其中提供了堆使用方式的詳細(xì)地圖。一個(gè)例子可以在下面看到:

        技巧2 – 將模塊編譯成凍結(jié)字節(jié)碼

        當(dāng)開發(fā)人員創(chuàng)建Micro Python應(yīng)用程序時(shí),他們正在創(chuàng)建由Python解釋器在運(yùn)行時(shí)執(zhí)行的腳本。在運(yùn)行時(shí)處理腳本不僅會(huì)占用堆空間,還會(huì)導(dǎo)致堆碎片化。開發(fā)人員可以在他們的應(yīng)用程序代碼中獲取模塊并將其交叉編譯成字節(jié)碼,該字節(jié)碼與內(nèi)核代碼一起存儲(chǔ)在閃存中。創(chuàng)建字節(jié)碼將導(dǎo)致模塊代碼從閃存執(zhí)行,而不是從堆中執(zhí)行。結(jié)果是使用的堆空間更少,并且堆碎片減少。常量值和字符串也可以預(yù)編譯成凍結(jié)字節(jié)碼,以防止它們占用不必要的RAM。

        技巧3 – 使用const()

        與生成可能由其他模塊導(dǎo)入的變量的查找相關(guān)的RAM可以通過幾種方式保存。首先,開發(fā)人員可以使用位于micropython庫中的const()。開發(fā)人員可以通過以下方式使用const():

        A = const(0x100)

        其次,在變量名_A前添加下劃線作為前綴,可以防止將變量添加到字典中,并節(jié)省一些RAM字節(jié)。雖然一開始節(jié)省的費(fèi)用似乎很少,但在可能有數(shù)百個(gè)變量的大型應(yīng)用程序中,節(jié)省的費(fèi)用很快就會(huì)增加。

        技巧4 – 預(yù)先分配通信緩沖區(qū)

        使用Python的好處是可以根據(jù)需要在代碼中動(dòng)態(tài)創(chuàng)建緩沖區(qū)。例如,從USB設(shè)備讀取數(shù)據(jù)時(shí),開發(fā)人員可能會(huì)編寫類似于以下內(nèi)容的代碼:

        while True:

        data = usb.read(64)



        這個(gè)應(yīng)用程序的問題是,每次讀取數(shù)據(jù)時(shí),都會(huì)在堆上創(chuàng)建一個(gè)新的64字節(jié)緩沖區(qū),這為堆提供了碎片化的可能性。相反,開發(fā)人員可以通過執(zhí)行以下操作預(yù)先分配緩沖區(qū):

        buffer = bytearray(64)

        while True:

        usb.readinto(buffer)

        此應(yīng)用程序代碼將一遍又一遍地使用相同的緩沖區(qū),而不是不斷地創(chuàng)建和銷毀堆上的緩沖區(qū)空間。

        技巧5 – 定期調(diào)用gc.collect

        Micro Python有一個(gè)垃圾收集器,它會(huì)定期運(yùn)行以將超出范圍的對(duì)象返回到堆中。雖然垃圾收集是自動(dòng)的,但有時(shí)開發(fā)人員定期手動(dòng)調(diào)用gc.collect或在初始化應(yīng)用程序代碼后調(diào)用它會(huì)很有用。在gc.collect調(diào)用之前調(diào)用mem_info總是很有用的,然后立即查看有多少內(nèi)存返回到堆中。

        結(jié)論

        Micro Python可以極大地幫助開發(fā)人員加快他們的快速原型設(shè)計(jì)甚至生產(chǎn)代碼開發(fā)。僅僅因?yàn)檐浖荘ython的,并不意味著開發(fā)人員現(xiàn)在可以忽略他們?cè)贑中習(xí)慣的實(shí)時(shí)約束。使用Micro Python仍然需要開發(fā)人員密切監(jiān)視他們的堆并跟蹤他們是如何使用它的。忽略Micro Python應(yīng)用程序中的堆肯定會(huì)導(dǎo)致“內(nèi)存不足”錯(cuò)誤和應(yīng)用程序崩潰。


      免費(fèi)預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲专区首页在线观看 | 亚洲欧美国产宗合 | 亚洲国产一级在线观看 | 亚洲h成年动漫在线观看不卡 | 中国A级片在线观看 | 亚洲人成欧美中文字幕 |