電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 28|回復: 0
收起左側

MicroPython的魔法開關:上電即運行,讓你的設備秒變智能!

[復制鏈接]

162

主題

162

帖子

1268

積分

三級會員

Rank: 3Rank: 3

積分
1268
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 昨天 09:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
說起MicroPython,相信大家都不會陌生,這是一種基于Python3的高效實現(xiàn),專為微控制器和嵌入式系統(tǒng)設計。是一款能夠在嵌入式平臺運行的Python解析器,換句話說,我們就可以使用Python進行程序編寫,來實現(xiàn)對于嵌入式平臺(以下統(tǒng)稱MCU平臺)的控制。
不過,相較于使用C/C++進行程序編寫的方式,Python代碼無需編譯成鏡像文件燒寫到平臺中。這也是Python作為一款解釋型語言的一大優(yōu)勢,即無需進行編譯、鏈接、燒寫的三步走,即可成功運行程序。但是也存在一個新問題,那就是程序要放到哪呢?針對對此,MicroPython有一個叫做REPL的基于串口的交互式程序編寫模式,簡單來說,用戶可以通過打開串口連接到MCU平臺。隨后即可進行代碼編寫。這時候,出現(xiàn)一個新問題,每次都要先用串口連接才可以運行程序嗎?
當然不,不然每次代碼運行,都要拖著一臺大大的電腦,是不是想想都要搖頭。那么今天小編就給大家來介紹幾種讓代碼能夠在上電時候直接運行的方式。平臺我們這里就選擇i.MX RT1060平臺,代碼鏈接:https://github.com/micropython/micropython,  i.MXRT1060平臺介紹在這里:https://github.com/micropython/micropython/tree/master/ports/mimxrt,這里也可以找到對應的編譯和運行方法,就不再贅述了。
好,那我們直接開始,首先讓代碼能夠運行,需要首先解決的問題是,代碼放在哪?才能讓MicroPython的解析器上電就能找到并打開運行。首先我們想到的就是放到某個文件系統(tǒng),那讓我們看看i.MXRT1060的文件系統(tǒng)的支持情況:

這里我們可以看到,RT系列同時支持內(nèi)部flash以及SDCard,也就是說,有兩個地方可以放,無論是內(nèi)部flash還是SD卡。這里可能大家就會有疑問,這里有兩個文件系統(tǒng),MicroPython(以下簡稱MP)怎么知道我用的哪個呢?這里就要分析下代碼了,在MP的main.c中有這么段代碼:https://github.com/micropython/micropython/blob/master/ports/mimxrt/main.c#L114
         pyexec_frozen_module("_boot.py", false);
也就是說,在main函數(shù)執(zhí)行時候,要執(zhí)行一個叫_boot.py的python腳本,那么這個腳本干了什么呢?代碼在這里:https://github.com/micropython/micropython/blob/master/ports/mimxrt/modules/_boot.py

主要看下紅色標記的地方,在1處,首先掛在了flash文件系統(tǒng)到/flash目錄。隨后,代碼會檢測這個flash文件系統(tǒng)中是否有叫做”SKIPSD”的文件,如果有的話,就說明我們要跳過掛載SDcard文件系統(tǒng)。如果沒有的話,便會執(zhí)行2處,掛載SD卡文件系統(tǒng)來替代之前所掛載的flash文件系統(tǒng)。
好了,這里我們就清楚了,這兩個文件系統(tǒng)是二選一的,首先是flash文件系統(tǒng)。隨后如果存在SD卡那就會掛載SD卡文件系統(tǒng)。解決了這個問題,問題就簡單了。我們只需要二選一,將代碼放到SD卡中就行了。
沒錯,但是還漏了一個細節(jié)。MP只能識別某種名字的文件的,這個繼續(xù)看代碼:

在main.c中,程序會去查找有沒有一個叫做main.py的文件,并執(zhí)行它。因此,我們需要將想要運行的程序命名為main.py,并將其放置在文件系統(tǒng)中即可。具體來說,這個文件系統(tǒng)是flash還是SDcard文件系統(tǒng),就看大家自行選擇了。這里我們將其放置在SD卡中:

程序內(nèi)容,這里通過MP自己的REPL串口打印”Boot From SD”, 隨后打開一個新的串口,打印輸出’1234’
print("Boot  From SD")
from machine import UART
uart = UART(0, 115200)
uart.write(b'1234\r
')
程序運行結果:

可以看到在右邊REPL串口打印出MP信息前,會打印出Boot From SD,在左邊所打開的新串口中會打印出1234。符合程序預期,實現(xiàn)了程序的自啟動。
下一期將給大家?guī)硪粋不依賴于文件系統(tǒng)的方案。咱們拭目以待吧~
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表