打印
[PIC32/SAM]

完美开启MicroPython多线程支持

[复制链接]
4835|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yjmeishao 于 2019-1-28 16:16 编辑

MicroPython官方版本尝试对多线程的支持,但是目前的支持只停留在非常初级的阶段,离真正可用还是有一段距离。
个人在对官方源码进行了修改尝试后,终于可以很好支持多线程操作,代码编写和调试中也踩坑无数。


修改后的MicroPython多线程示例
多线程的基础上增加了线程锁和信号量的支持:
from umachine import Pin
import utime
import _thread

lock = _thread.allocate_lock()
semp = _thread.allocate_semephare()
定义4个用户线程,分别是信号量演示线程/i2c演示线程/LED演示线程和MQTT消息发布线程:
def sem_thread():
    while True:
        semp.pend()
        print('sem_thread run')
def i2c_thread():
    while True:
        print('i2c_thread read 0x57')
        i2c0.readfrom_mem(0x57, 0, 4)
        utime.sleep(10)
        print('i2c_thread read 0x5f')
        i2c0.readfrom_mem(0x5f, 0x9a, 6)
        utime.sleep(10)
        #_thread.exit()
def led_thread(time_):
    while True:
        print('led_thread on')
        led0.value(1)
        utime.sleep(time_)
        print('led_thread off')
        led0.value(0)
        utime.sleep(time_)
        semp.post()
def mqtt_thread(time_):
    while True:
        lock.acquire()
        print('mqtt_thread message 1')
        mqtt.publish('/home/bedroom/lamp', 'led on')
        mqtt.publish('/home/bedroom/speaker', 'music off')
        utime.sleep(time_)
        print('mqtt_thread message 2')
        mqtt.publish('/home/bedroom/lamp', 'led off')
        mqtt.publish('/home/bedroom/speaker', 'play music')
        utime.sleep(1)
        print('mqtt_thread message 3')
        mqtt.publish('/smart_home/bedroom/window', 'close window')
        utime.sleep(time_)
        lock.release()
        #_thread.exit()

MQTT消息订阅回调函数和连接成功回调函数:

def callback_on_connect(userdata, flags, rc):
    mqtt.subscribe('/home/bedroom/msgbox', 0)

def callback_on_message(userdata, message):
    print(message)
    mqtt.publish('/home/bedroom/air', 'air turn on')
Wi-Fi连接到AP的Python代码(用到ATWINC1500 MicroPython库):
from winc1500 import WLAN
wlan = WLAN(STA_IF)
wlan.connect('KSLINKxxxxxx', 'yyyyyyyy', AUTH_WPA_PSK)
MQTT的连接和订阅(参考前面回调函数):
from winc1500 import MQTT
mqtt = MQTT(MQTT_CLIENT)
mqtt.username_pw_set('winc_mp_mqtt', '')
mqtt.on_connect(callback_on_connect)
mqtt.on_message(callback_on_message)
mqtt.connect('iot.eclipse.org', 1883, 30)
最后是开始启动线程的操作
_thread.start_new_thread(led_thread, (2,))
_thread.start_new_thread(i2c_thread, ())
_thread.start_new_thread(sem_thread, ())
_thread.start_new_thread(mqtt_thread,(3,))

while True:
    pass
代码运行效果

补充:MicroPython代码运行在Microchip SAMV71-XULT+ATWINC1500(Wi-Fi模组)

美国Adafruit也发布了多款基于Microchip SAMD51(120MHz Cortex-M4F/256KB SRAM/4KB ICache)的开源硬件板,可以完美支持MicroPython,有兴趣的可以自行去github上下载源码研究下。




沙发
vcvfvgvb| | 2019-1-28 13:46 | 只看该作者
感谢分享!很好的经验。

使用特权

评论回复
板凳
XIVN1987| | 2019-1-28 22:17 | 只看该作者
楼主厉害,,顶一下

使用特权

评论回复
地板
玛尼玛尼哄| | 2019-1-29 17:57 | 只看该作者
太厉害了。高级。

使用特权

评论回复
5
淘猫汤姆| | 2019-1-29 18:39 | 只看该作者
楼主太厉害了

使用特权

评论回复
6
淘猫汤姆| | 2019-1-29 18:39 | 只看该作者
膜拜一下~~~

使用特权

评论回复
7
奔波儿熊| | 2019-1-31 14:14 | 只看该作者
不明觉厉

使用特权

评论回复
8
598330983| | 2019-2-16 10:17 | 只看该作者
看起来牛X啊

使用特权

评论回复
9
uiujuyu7| | 2019-2-17 16:05 | 只看该作者
感谢分享!很不错的帖子。

使用特权

评论回复
10
xixi2017| | 2019-2-18 23:45 | 只看该作者
没玩过,单片机都可以跑吗

使用特权

评论回复
11
CoolSilicon| | 2019-2-19 09:03 | 只看该作者
楼主太厉害了

使用特权

评论回复
12
yjmeishao|  楼主 | 2019-2-22 17:31 | 只看该作者
xixi2017 发表于 2019-2-18 23:45
没玩过,单片机都可以跑吗

单片机上都可以跑,跟芯片相关的Python库是需要自己移植

使用特权

评论回复
13
1151042346| | 2020-5-12 18:10 | 只看该作者
有源码连接吗?学习学习

使用特权

评论回复
14
小卡| | 2020-7-1 13:50 | 只看该作者
这个不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

111

帖子

1

粉丝