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

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

搜索
查看: 34|回復(fù): 0
收起左側(cè)

MicroPython的魔法開關(guān):上電即運(yùn)行,讓你的設(shè)備秒變智能!

[復(fù)制鏈接]

162

主題

162

帖子

1268

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

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

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

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

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

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

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

發(fā)表回復(fù)

本版積分規(guī)則


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