回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕动手做】CanMV K230 AI视觉识别模块之使用WDT看门狗 简单

头像 驴友花雕 2025.11.03 6 0

00 (3).jpg

 

什么是 CanMV K230?
CanMV K230是一款高性价比的RISC-V边缘AI平台,凭借低功耗、强视觉处理能力和开放的开发生态,成为嵌入式AI开发的理想选择,尤其适合需要快速部署视觉与AI功能的创客、中小企业及教育场景。CanMV 是一套 AI 视觉开发平台,K230 是其核心芯片。该模块结合了图像采集、AI推理、边缘计算等能力,适合嵌入式视觉应用开发。

CanMV:类似 OpenMV 的图像处理框架,支持 Python 编程,简化视觉识别开发流程。
K230 芯片:嘉楠科技推出的 AIoT SoC,采用 RISC-V 架构,内置第三代 KPU(AI加速单元),算力高达 6 TOPS,性能是 K210 的 13.7 倍。

 

00 (4).jpg

 

WDT看门狗(Watch Dog Timer)是一种用于监控系统运行状态的定时器,当系统出现异常(如程序跑飞或死循环)时,它能自动触发复位信号使系统重启,从而恢复系统的正常运行。

一、WDT看门狗的基本概念
1. 定义与核心功能
WDT(Watch Dog Timer,看门狗定时器)本质上是一个计数器,通常作为单片机或嵌入式系统的一个组成部分。它的主要功能是监控系统运行状态,当检测到系统异常时,能够自动复位系统,防止系统长时间停滞在故障状态。
2. 名称由来
"看门狗"这一名称形象地描述了其工作原理:就像一只忠诚的看门狗会监视家的安全一样,WDT会"监视"程序的正常运行,一旦发现异常就会"报警"(触发复位)。

二、WDT看门狗的工作原理
1. 基本工作流程
启动阶段:系统初始化时启动WDT,设置超时时间
正常运行:程序在WDT超时前定期"喂狗"(重置计数器)
异常检测:若程序跑飞或死循环,无法按时喂狗
复位触发:WDT计数器溢出,产生复位信号使系统重启
2. "喂狗"机制详解
喂狗:指在WDT计数器溢出前,程序向WDT发送信号重置计数器
杀狗:禁用或关闭WDT
咬狗:当WDT启动后,计数器开始自动计数,超时后触发复位信号
3. 定时时间设置
WDT的定时时间通常设置为相对较长的周期(如200毫秒左右),这样即使系统因干扰未能及时喂狗,WDT也不会立即复位系统,给系统足够时间恢复。

三、WDT看门狗的主要类型
1. 按实现方式分类
硬件看门狗:利用独立的定时器电路实现,可靠性高,不受系统时钟故障影响
软件看门狗:使用处理器内部定时器实现,可靠性较低,当系统内部定时器故障时无法检测
2. 按功能特性分类
独立看门狗(IWDG):时间精度要求较低,适用于一般应用场景
窗口看门狗(WWDG):要求在精确的时间窗口内喂狗,适用于时序要求严格的应用
问答型看门狗:要求执行特定算术运算并返回结果,用于高安全性系统

四、WDT看门狗的应用场景
1. 嵌入式系统
汽车电子:ECU(电子控制单元)中广泛应用,确保行车安全
工业控制:防止PLC等控制系统因程序异常导致生产事故
智能家居:确保设备长时间稳定运行,无需人工干预
医疗设备:保障关键医疗设备的可靠性
2. 特殊应用场景
无人值守设备:在无人状态下实现连续工作
低功耗设备:从休眠或空闲模式唤醒系统
安全关键系统:如航空航天、核电站控制系统等

五、WDT看门狗的实际应用示例
在单片机系统中,WDT通常用于:
防止程序跑飞导致系统死机
在电磁干扰环境下保证系统稳定性
实现系统自动恢复功能

六、WDT看门狗的重要性
1. 系统可靠性保障
自动恢复能力:无需人工干预即可从故障中恢复
防止系统停滞:避免因程序跑飞导致系统长时间停滞
提高系统稳定性:在恶劣环境下仍能保持系统正常运行
2. 设计注意事项
合理设置超时时间:太短可能导致误复位,太长则无法及时恢复
喂狗时机选择:应在系统关键点进行喂狗,确保系统状态正常
避免随意禁用:在安全关键系统中,WDT一旦启用不应轻易禁用
3. 内部与外部WDT比较
内部WDT:集成在MCU内部,成本低但可靠性受系统时钟影响
外部WDT:独立于MCU,可靠性更高,适用于高安全性要求场景
WDT看门狗作为系统安全的"最后一道防线",在现代嵌入式系统中扮演着至关重要的角色。合理设计和使用WDT,可以显著提高系统的可靠性和稳定性,特别是在无人值守或安全关键的应用场景中。

 

18.jpg
18-.jpg
18-0.jpg

项目测试实验代码

代码
#【花雕动手做】CanMV K230 AI视觉识别模块之使用WDT看门狗      
# 项目功能:演示看门狗定时器的使用,包括初始化、喂狗和超时重启机制

# 导入必要的模块 | Import required modules
from machine import WDT  # 导入看门狗模块 | Import watchdog module
import time  # 导入时间模块 | Import time module

"""
详细解析 | Detailed Analysis:
WDT (Watchdog Timer) 是一种硬件定时器,如果在规定时间内没有被复位(喂狗),
系统就会自动重启。主要用于检测和恢复系统故障。

WDT is a hardware timer that will automatically restart the system if not reset
("fed") within a specified time. It's mainly used for detecting and recovering
from system failures.

技术要点 | Technical Points:
1. 工作原理:看门狗是一个递减计数器,从超时值开始递减到0
2. 喂狗操作:将计数器重置为初始超时值
3. 超时后果:系统强制重启,恢复系统到已知状态
4. 应用场景:防止程序死锁、检测任务阻塞、提高系统可靠性
"""

def init_watchdog(id=1, timeout=3):
    """初始化看门狗 | Initialize watchdog
    Args:
        id: 看门狗ID | Watchdog ID (通常为0或1,取决于硬件平台)
        timeout: 超时时间(秒) | Timeout period(seconds)
    Returns:
        WDT对象 | WDT object

    详细解析 | Analysis:
    创建WDT对象,设置超时时间。如果超过timeout秒没有喂狗,系统将重启。
    Creates WDT object and sets timeout. System will restart if not fed within timeout seconds.
    
    参数范围 | Parameter Ranges:
    - id: 看门狗实例编号,K230通常支持多个看门狗实例
    - timeout: 超时时间,通常有最小和最大限制(如0.5秒到30秒)
    """
    try:
        # 创建看门狗实例
        # 参数说明:
        # - id: 看门狗硬件外设编号
        # - timeout: 超时时间,单位秒
        wdt = WDT(id, timeout)
        print(f"看门狗初始化成功 | Watchdog initialized: ID={id}, 超时时间={timeout}秒 | timeout={timeout}s")
        return wdt
    except Exception as e:
        print(f"看门狗初始化失败 | Watchdog initialization failed: {e}")
        return None

def feed_watchdog(wdt, feed_times=3, interval=1):
    """定时喂狗 | Feed watchdog periodically
    Args:
        wdt: 看门狗对象 | Watchdog object
        feed_times: 喂狗次数 | Number of feeds
        interval: 喂狗间隔(秒) | Interval between feeds(seconds)

    详细解析 | Analysis:
    按照指定间隔喂狗指定次数。这个过程会持续 feed_times * interval 秒。
    Feeds the watchdog specified times at given intervals. This process will last
    for feed_times * interval seconds.
    
    设计考虑 | Design Considerations:
    1. 喂狗间隔应小于看门狗超时时间,确保不会意外触发重启
    2. 喂狗次数和间隔应根据实际应用场景调整
    3. 异常处理确保喂狗失败不会导致程序崩溃
    """
    if not wdt:
        print("看门狗对象无效,跳过喂狗 | Invalid watchdog object, skipping feed")
        return

    try:
        for i in range(feed_times):
            # 等待指定间隔时间
            # 在实际应用中,这里可以执行其他任务
            time.sleep(interval)
            
            # 执行喂狗操作,重置看门狗计数器
            wdt.feed()  # 喂狗操作 | Feed the watchdog
            
            print(f"第{i+1}次喂狗 | Feed watchdog {i+1} times")
            print(f"  下次喂狗在{interval}秒后 | Next feed in {interval} seconds")
            
    except Exception as e:
        print(f"喂狗过程出错 | Error during feeding: {e}")
        # 注意:喂狗失败可能导致系统重启

def main():
    """主函数 | Main function

    详细解析 | Analysis:
    程序的主要执行流程:
    1. 初始化看门狗
    2. 执行定时喂狗
    3. 停止喂狗等待系统重启

    Main program flow:
    1. Initialize watchdog
    2. Perform periodic feeding
    3. Stop feeding and wait for system restart
    
    演示场景 | Demonstration Scenario:
    这个示例演示了正常喂狗和停止喂狗两种情况:
    - 前3秒:正常喂狗,系统不会重启
    - 3秒后:停止喂狗,等待看门狗超时重启
    """
    print("=== 看门狗演示程序开始 ===")
    print("=== Watchdog Demo Started ===")
    
    # 初始化看门狗 | Initialize watchdog
    # 设置3秒超时,意味着如果3秒内不喂狗,系统将重启
    wdt = init_watchdog(timeout=3)
    if not wdt:
        print("程序退出 | Program exiting")
        return

    print("\n--- 开始喂狗周期 ---")
    print("--- Starting Feeding Cycle ---")
    
    # 喂狗循环 | Feeding loop
    # 参数说明:
    # - wdt: 看门狗对象
    # - feed_times=3: 喂狗3次
    # - interval=1: 每次间隔1秒
    # 总喂狗时间:3次 × 1秒 = 3秒,刚好在超时时间内
    feed_watchdog(wdt, feed_times=3, interval=1)

    # 等待重启 | Wait for restart
    print("\n--- 停止喂狗,等待看门狗超时重启 ---")
    print("--- Stopping feeding, waiting for watchdog timeout restart ---")
    print("系统将在3秒内重启... | System will restart within 3 seconds...")
    
    # 进入死循环,不再喂狗
    # 看门狗将在3秒超时后强制重启系统
    count = 0
    while True:
        time.sleep(0.1)  # 降低CPU占用 | Reduce CPU usage
        count += 1
        if count % 10 == 0:  # 每1秒打印一次
            print(f"等待重启... 已等待 {count/10} 秒 | Waiting for restart... {count/10}s elapsed")
            
        # 注意:在实际应用中,这里可能会有其他代码
        # 但由于没有喂狗,看门狗最终会超时重启系统

if __name__ == '__main__':
    main()

"""
=== 看门狗使用最佳实践 ===

1. 超时时间选择:
   - 实时性要求高的系统:1-3秒
   - 一般应用:5-10秒
   - 长任务处理:根据最长任务时间适当延长

2. 喂狗策略:
   - 在主循环中定期喂狗
   - 在关键任务完成后喂狗
   - 使用多个喂狗点提高可靠性

3. 错误处理:
   - 喂狗操作应包含异常处理
   - 记录看门狗重启事件用于诊断
   - 考虑在重启前保存关键数据

4. 应用场景:
   - 工业控制系统
   - 自动驾驶系统
   - 网络设备
   - 任何需要高可靠性的嵌入式系统

=== 预期执行结果 ===
1. 程序启动,初始化看门狗(3秒超时)
2. 前3秒:每秒喂狗一次,共3次
3. 第3秒后:停止喂狗,进入等待循环
4. 第6秒左右(从开始计算):看门狗超时,系统自动重启

注意:实际重启时间可能因系统负载略有差异。
"""

关键知识点总结:
1. 看门狗本质:硬件保护的"最后防线",防止软件死锁
2. 喂狗时机:必须在超时时间内定期重置计数器
3. 超时选择:太短会导致误重启,太长失去保护意义
4. 系统集成:看门狗应作为系统可靠性设计的组成部分
这个示例完整展示了看门狗的生命周期管理,是嵌入式系统开发中提高可靠性的重要技术。

 

19.jpg

评论

user-avatar
icon 他的勋章
    展开更多