micropython多线程与看门狗WDT实践笔记

1、umodbus2.3.7做modbus slaver客户端后,while True:result = client.process()非阻塞,这个如果不用多线程,其他的工作都得放到这个while True死循环里面来运行了。

2、deepseek推荐了一个健壮的多线程管理器,试了好用。

# MicroPython多线程Ctrl+C处理方案
import _thread
import time
import sys

class ThreadManager:
    def __init__(self):
        self.exit_flag = False
        self.threads = []

    def thread_function(self, name):
        while not self.exit_flag:
            try:
                print(f"Thread {name} is running")
                time.sleep(1)
            except Exception as e:
                print(f"Thread {name} caught exception: {e}")
                break
        print(f"Thread {name} exiting")

    def start_thread(self, name):
        thread_id = _thread.start_new_thread(self.thread_function, (name,))
        self.threads.append(thread_id)
        return thread_id

    def stop_all_threads(self):
        self.exit_flag = True
        # 等待所有线程退出
        time.sleep(1.5)  # 根据线程清理所需时间调整

def main():
    manager = ThreadManager()
    
    # 启动多个线程
    manager.start_thread("A")
    manager.start_thread("B")
    
    try:
        # 主线程工作
        while True:
            time.sleep(0.1)
    except KeyboardInterrupt:
        print("\nReceived Ctrl+C, stopping threads...")
        manager.stop_all_threads()
        print("All threads stopped. Exiting.")
        sys.exit(0)

if __name__ == "__main__":
    main()

3、看门狗没用过,想试试,那就再建一个看门狗线程?用上面这个多线程管理器。

    def thread_function(self, name):
        while not self.exit_flag:
            try: # 按照参数name运行不同的函数
                if name == 'mbslaver':
                    MbSlave.call_mbslaver()
                if name == 'watchdog':
                    wdt.feed()  # 重置看门狗计时器
                print(f"Thread {name} is running")
                time.sleep(1)
            except Exception as e:
                print(f"Thread {name} caught exception: {e}")
                break
        print(f"Thread {name} exiting")

deepseek说“通常喂狗操作应该放在主循环中,以确保主程序正常运行”。所以思路不对,应该改成主线程喂狗。

def main():
    manager = ThreadManager()
    # 启动多个线程
    manager.start_thread("mbslaver")
    #manager.start_thread("watchdog") #思路不对,应该是主线程喂狗,注释掉

    # 初始化硬件看门狗,超时时间为5秒(单位:毫秒)
    wdt = machine.WDT(timeout=5000)

    try:
        # 主线程工作
        while True:
            time.sleep(6)
            # 通常喂狗操作应该放在主循环中,以确保主程序正常运行
            wdt.feed()
    except KeyboardInterrupt:
        print("\nReceived Ctrl+C, stopping threads...")
        manager.stop_all_threads()
        print("All threads stopped. Exiting.")
        sys.exit(0)

if __name__ == "__main__":
    main()

测试一下,wdt = machine.WDT(timeout=5000) 让主线程time.sleep(6),不停的复位:

E (11667) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time:
E (11667) task_wdt:  - mpy_machine_wdt (CPU 0/1)
E (11667) task_wdt: Tasks currently running:
E (11667) task_wdt: CPU 0: IDLE0
E (11667) task_wdt: CPU 1: IDLE1
E (11667) task_wdt: Print CPU 0 (current core) backtrace

Backtrace: 0x40160D1F:0x3FFC0020 0x40085A21:0x3FFC0050 0x4009268B:0x3FFBBE20 0x4015F2CA:0x3FFBBE40 0x400D2F94:0x3FFBBE60 0x40096248:0x3FFBBE80

E (11667) task_wdt: Aborting.
E (11667) task_wdt: Print CPU 1 backtrace

A fatal error occurred. The crash dump printed below may be used to help
determine what caused it. If you are not already running the most recent
version of MicroPython, consider upgrading. New versions often fix bugs.

To learn more about how to debug and/or report this crash visit the wiki
page at: https://github.com/micropython/micropython/wiki/ESP32-debugging

MPY version : v1.25.0 on 2025-04-15
IDF version : v5.2.2
Machine     : Generic ESP32 module with ESP32

Backtrace: 0x4009268b:0x3ffbc420 0x4015f2ca:0x3ffbc440 0x400d2f94:0x3ffbc460 0x40096248:0x3ffbc480

ELF file SHA256: b93509347

Rebooting...
ets Jul 29 2019 12:21:46

rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4892
ho 0 tail 12 room 4
load:0x40078000,len:14896
load:0x40080400,len:4
load:0x40080404,len:3372
entry 0x400805b0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值