开启MicroPython多线程模式

本文介绍在MicroPython中实现多线程的初步尝试,包括线程锁和信号量的使用,通过四个示例线程展示其运行效果,涉及LED控制、I2C读取、MQTT消息发布和接收。
部署运行你感兴趣的模型镜像

MicroPython官方版本对多线程的支持

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('KSLINxxxxxx', 'xxxxxxxxx', 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模组)4个用户线程运行效果

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我需要回答用户关于RT-Thread操作系统中FINSH模式的使用方法和功能介绍。首先,我得回忆一下RT-Thread的相关知识,尤其是FINSH组件。FINSH是RT-Thread的命令行组件,允许用户通过命令行与系统交互,类似Linux的Shell。用户可能想知道如何启用FINSH,基本命令有哪些,以及实际应用中的例子。 根据用户提供的引用,引用[1]提到在开发板上运行RT-Thread时使用FinSH控制台,包括使用RT-Thread Studio的终端工具或Putty。引用[2]详细说明了Finsh控制台的实现方式,特别是通过DEVICE框架注册设备。引用[3]涉及系统线程,可能和FINSH的运行机制有关。引用[4]提到了使用FINSH时可能遇到的命令无法显示的问题,原因是死循环阻塞了线程,这说明需要注意命令的执行不能阻塞。 首先,我应该介绍FINSH模式的基本概念,然后分点说明使用方法,包括环境搭建、启用FINSH、常用命令,再举一些代码示例,比如如何注册自定义命令。接着是功能介绍,如调试、系统监控、动态配置等。然后根据用户提供的引用,加入注意事项,比如避免阻塞操作。最后生成相关问题,帮助用户进一步学习。 需要确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,但在这个回答中可能数学公式不多,但如果有的话要注意格式。同时,引用要自然添加在相关段落末尾,比如在讲使用方法时引用[1]和[2],讲注意事项时引用[4]。 可能的结构如下: 1. FINSH模式简介 2. 使用方法:环境搭建、启用步骤、常用命令、自定义命令 3. 功能介绍:调试、监控、动态配置 4. 注意事项:避免阻塞、线程优先级 5. 相关问题 需要确保各部分信息准确,引用正确,并且语言简洁明了,结构清晰。</think>### RT-Thread FINSH模式使用方法及功能介绍 #### 一、FINSH模式简介 FINSH是RT-Thread操作系统的命令行交互组件,提供类似Linux Shell的功能,允许用户通过串口终端直接与系统交互,执行命令、查看状态或调试代码[^2]。 --- #### 二、使用方法 1. **环境搭建** 需确保开发板已连接串口工具(如Putty或RT-Thread Studio的终端工具),并在工程中启用FINSH组件[^1]。 2. **启用FINSH步骤** - 在`rtconfig.h`中定义宏:`#define RT_USING_FINSH` - 添加FINSH源码文件(如`finsh_port.c`和`finsh.h`)到工程。 3. **常用命令** - `list_thread`:查看所有线程状态 - `list_device`:列出已注册设备 - `free`:查看内存使用情况 - `ps`:显示线程信息(需开启`RT_USING_POSIX_FS`) 4. **自定义命令示例** ```c #include <finsh.h> void hello(void) { rt_kprintf("Hello RT-Thread!\n"); } MSH_CMD_EXPORT(hello, "Print hello message"); ``` 输入`hello`即可执行该命令。 --- #### 三、功能介绍 1. **调试与监控** - 动态查看线程状态、内存占用、设备列表等[^3]。 - 支持执行系统函数,如`rt_timer_dump()`查看定时器信息。 2. **动态配置系统** - 通过`msh>`命令行实时修改变量值或调用API,例如调整PWM占空比[^4]。 3. **脚本支持** - 可扩展为支持脚本语言(如MicroPython),增强交互能力。 --- #### 四、注意事项 1. **避免阻塞操作** 自定义命令中若包含死循环(如`while(1)`),会导致FINSH线程阻塞,无法响应新命令。 2. **线程优先级** FINSH默认运行在`RT_THREAD_PRIORITY_20`,需确保其他任务不会抢占其资源。 ---
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值