[32位单片机及处理器] 完美开启MicroPython多线程支持

[复制链接]
304|11
 楼主 | 2019-1-27 22:49 | 显示全部楼层 |阅读模式
本帖最后由 yjmeishao 于 2019-1-28 16:16 编辑

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


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

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

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

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

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

  5. while True:
  6.     pass
复制代码
代码运行效果

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

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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2019-1-28 13:46 | 显示全部楼层
感谢分享!很好的经验。
| 2019-1-28 22:17 | 显示全部楼层
楼主厉害,,顶一下
| 2019-1-29 17:57 | 显示全部楼层
太厉害了。高级。
| 2019-1-29 18:39 | 显示全部楼层
楼主太厉害了
| 2019-1-29 18:39 | 显示全部楼层
膜拜一下~~~
| 2019-1-31 14:14 | 显示全部楼层
不明觉厉
| 2019-2-16 10:17 | 显示全部楼层
看起来牛逼啊
| 2019-2-16 19:56 | 显示全部楼层
玩得高级,厉害!
| 2019-2-17 16:05 | 显示全部楼层
感谢分享!很不错的帖子。
| 2019-2-18 23:45 | 显示全部楼层
没玩过,单片机都可以跑吗
| 2019-2-19 09:03 | 显示全部楼层
楼主太厉害了
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表