
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.html
2.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)
utime.sleep_ms(200)
gpio.close()
5、加入我們

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280276.html
標籤:其他
上一篇:菜鳥哥玩物聯網應用開發系列 開篇!包括開發環境搭建、Android App開發、小程式開發、Flutter應用開發,涉及經典藍牙、BLE藍牙、MQTT、WS(長期更新)
下一篇:淺聊Linux的五種IO模型
