AliOS Things 3.3.0新版本中,其中非常中的一個特點,就是支援Python輕應用,也就是可以直接使用Python代碼來寫物聯網程式,并且控制軟體裝置。
這是HaaS物聯網裝置雲端一體Low Code開發架構的核心之一。
那本文講介紹如何給Python輕應用添加新的元件,比如之前Python應用中沒有操作ADC的元件,可以使用本文的方法去進行擴充适配,來增加這個ADC元件。
1、Python語言介紹
1.1、現狀
2021年1月熱門語言排行榜:Python榮獲TIOBE年度之星排在第三名.(排名逼近第二JAVA)

1.2、特點
Python是基于C++創造的,它們的差別主要展現在,C++效率高,程式設計難;Python效率低,程式設計簡單。
1.3、MicroPython 和Python 的關系
MicroPython是Python3程式設計語言的精簡高效實作,包括Python标準庫的一小部分,并且經過優化,可在微控制器和受限環境中運作。
1.4、MicroPython 功能特點和資源占用
MicroPython包含了諸如互動式提示,任意精度整數,關閉,清單解析,生成器,異常處理等進階功能。足夠精簡,适合運作在隻有256k的代碼空間和16k的RAM的晶片上(官網:
https://micropython.org/)
2、适配
開發手冊:
https://g.alicdn.com/HaaSAI/PythonDoc/quickstart/index.html2.1、Python 适配涉及到的基礎概念
- netmgr ,driver 和python 的module 對應,ADC 和python Class 相對應
- 可以隻有module 的适配
- Class 必須挂在module 下面
2.2 、Python 代碼和C 代碼關聯方式
Module 定義的入口檔案:components/py_engine/mpy-adaptor/system/mpconfigport.h
2.2.1、通過Python 的Module 進行關聯
下面以netmgr 功能作為Module 方式關聯C代碼的例子講解
代碼路徑:components/py_engine/mpy-adaptor/component/netmgr/modnetmgr.c
module結構變量定義:
子產品對應的功能函數映射表:
具體的函數實作:
2.2.2、通過Python 的Module + Class 進行關聯
下面以adc功能作為Module +Class 方式關聯C代碼的例子講解
代碼路徑:
Module:components/py_engine/mpy-adaptor/system/moddriver.c
Class:components/py_engine/mpy-adaptor/system/driver/adc.c
子產品定義:
Driver 子產品包含了多個Class 的定義,adc,dac,owm,spi 等. 映射表為:
ADC Class 定義:
ADC 功能映射表格定義:
函數實作:
2.3、Python 代碼和C代碼字元對應關系
根據上面的講解,大家應該基本上可以了解适配的過程,但是子產品名,類名,變量名,函數名的字元是python 和C 是怎麼關聯起來的呢?
2.3.1 、映射關系在代碼中的呈現形式
C 層字元:
Python層字元:
是通過映射的腳本:components/py_engine/mpy-adaptor/genhdr/gen_qstr.py 進行生成的, 生成的結果存放到檔案:components/py_engine/mpy-adaptor/genhdr/qstrdefs.generated.h
操作方式:
3、目錄結構
4、調試方法
開機預設會啟動之前燒錄進去的程式,打開序列槽工具,選擇對應的序列槽裝置,設定波特率為1500000 并連接配接。
Python輕應用預設支援兩種運作模式: 互動式 和 檔案執行,在序列槽下輸入不同的指令進入不同的模式
4.1、互動式調試
指令行輸入python進入互動模式,在互動模式輸入python代碼,就能看到執行結果。鍵盤按下ctrl+d 退出互動模式
4.2 、檔案執行調試
指令行輸入python /data/python-apps/driver/led/main.py,執行led app
python /data/python-apps/driver/led/main.py
效果:
示例代碼:
- # -*- coding: UTF-8 -*-
- import utime
- from driver import GPIO
- # 初始化GPIO 類
- gpio = GPIO()
- leds=("led1", "led2", "led3", "led4", "led5")
- for i in range(5):
- for led in leds:
- #open 函數支援的參數清單: led1, led2, led3, led4, led5
- gpio.open(led)
- #點亮led
- gpio.write(0)
- utime.sleep_ms(200)
- #熄滅led
- gpio.write(1)
- gpio.close()