114浏览
查看: 114|回复: 2

[项目] 【花雕动手做】CanMV K230 AI视觉识别模块之使用WDT看门狗

[复制链接]
【花雕动手做】CanMV K230 AI视觉识别模块之使用WDT看门狗图1

什么是 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 倍。


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

驴友花雕  高级技神
 楼主|

发表于 2025-11-3 14:52:49

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

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,可以显著提高系统的可靠性和稳定性,特别是在无人值守或安全关键的应用场景中。

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

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

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

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2025-11-3 14:56:28

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

项目测试实验代码

  1. #【花雕动手做】CanMV K230 AI视觉识别模块之使用WDT看门狗      
  2. # 项目功能:演示看门狗定时器的使用,包括初始化、喂狗和超时重启机制
  3. # 导入必要的模块 | Import required modules
  4. from machine import WDT  # 导入看门狗模块 | Import watchdog module
  5. import time  # 导入时间模块 | Import time module
  6. """
  7. 详细解析 | Detailed Analysis:
  8. WDT (Watchdog Timer) 是一种硬件定时器,如果在规定时间内没有被复位(喂狗),
  9. 系统就会自动重启。主要用于检测和恢复系统故障。
  10. WDT is a hardware timer that will automatically restart the system if not reset
  11. ("fed") within a specified time. It's mainly used for detecting and recovering
  12. from system failures.
  13. 技术要点 | Technical Points:
  14. 1. 工作原理:看门狗是一个递减计数器,从超时值开始递减到0
  15. 2. 喂狗操作:将计数器重置为初始超时值
  16. 3. 超时后果:系统强制重启,恢复系统到已知状态
  17. 4. 应用场景:防止程序死锁、检测任务阻塞、提高系统可靠性
  18. """
  19. def init_watchdog(id=1, timeout=3):
  20.     """初始化看门狗 | Initialize watchdog
  21.     Args:
  22.         id: 看门狗ID | Watchdog ID (通常为0或1,取决于硬件平台)
  23.         timeout: 超时时间(秒) | Timeout period(seconds)
  24.     Returns:
  25.         WDT对象 | WDT object
  26.     详细解析 | Analysis:
  27.     创建WDT对象,设置超时时间。如果超过timeout秒没有喂狗,系统将重启。
  28.     Creates WDT object and sets timeout. System will restart if not fed within timeout seconds.
  29.    
  30.     参数范围 | Parameter Ranges:
  31.     - id: 看门狗实例编号,K230通常支持多个看门狗实例
  32.     - timeout: 超时时间,通常有最小和最大限制(如0.5秒到30秒)
  33.     """
  34.     try:
  35.         # 创建看门狗实例
  36.         # 参数说明:
  37.         # - id: 看门狗硬件外设编号
  38.         # - timeout: 超时时间,单位秒
  39.         wdt = WDT(id, timeout)
  40.         print(f"看门狗初始化成功 | Watchdog initialized: ID={id}, 超时时间={timeout}秒 | timeout={timeout}s")
  41.         return wdt
  42.     except Exception as e:
  43.         print(f"看门狗初始化失败 | Watchdog initialization failed: {e}")
  44.         return None
  45. def feed_watchdog(wdt, feed_times=3, interval=1):
  46.     """定时喂狗 | Feed watchdog periodically
  47.     Args:
  48.         wdt: 看门狗对象 | Watchdog object
  49.         feed_times: 喂狗次数 | Number of feeds
  50.         interval: 喂狗间隔(秒) | Interval between feeds(seconds)
  51.     详细解析 | Analysis:
  52.     按照指定间隔喂狗指定次数。这个过程会持续 feed_times * interval 秒。
  53.     Feeds the watchdog specified times at given intervals. This process will last
  54.     for feed_times * interval seconds.
  55.    
  56.     设计考虑 | Design Considerations:
  57.     1. 喂狗间隔应小于看门狗超时时间,确保不会意外触发重启
  58.     2. 喂狗次数和间隔应根据实际应用场景调整
  59.     3. 异常处理确保喂狗失败不会导致程序崩溃
  60.     """
  61.     if not wdt:
  62.         print("看门狗对象无效,跳过喂狗 | Invalid watchdog object, skipping feed")
  63.         return
  64.     try:
  65.         for i in range(feed_times):
  66.             # 等待指定间隔时间
  67.             # 在实际应用中,这里可以执行其他任务
  68.             time.sleep(interval)
  69.             
  70.             # 执行喂狗操作,重置看门狗计数器
  71.             wdt.feed()  # 喂狗操作 | Feed the watchdog
  72.             
  73.             print(f"第{i+1}次喂狗 | Feed watchdog {i+1} times")
  74.             print(f"  下次喂狗在{interval}秒后 | Next feed in {interval} seconds")
  75.             
  76.     except Exception as e:
  77.         print(f"喂狗过程出错 | Error during feeding: {e}")
  78.         # 注意:喂狗失败可能导致系统重启
  79. def main():
  80.     """主函数 | Main function
  81.     详细解析 | Analysis:
  82.     程序的主要执行流程:
  83.     1. 初始化看门狗
  84.     2. 执行定时喂狗
  85.     3. 停止喂狗等待系统重启
  86.     Main program flow:
  87.     1. Initialize watchdog
  88.     2. Perform periodic feeding
  89.     3. Stop feeding and wait for system restart
  90.    
  91.     演示场景 | Demonstration Scenario:
  92.     这个示例演示了正常喂狗和停止喂狗两种情况:
  93.     - 前3秒:正常喂狗,系统不会重启
  94.     - 3秒后:停止喂狗,等待看门狗超时重启
  95.     """
  96.     print("=== 看门狗演示程序开始 ===")
  97.     print("=== Watchdog Demo Started ===")
  98.    
  99.     # 初始化看门狗 | Initialize watchdog
  100.     # 设置3秒超时,意味着如果3秒内不喂狗,系统将重启
  101.     wdt = init_watchdog(timeout=3)
  102.     if not wdt:
  103.         print("程序退出 | Program exiting")
  104.         return
  105.     print("\n--- 开始喂狗周期 ---")
  106.     print("--- Starting Feeding Cycle ---")
  107.    
  108.     # 喂狗循环 | Feeding loop
  109.     # 参数说明:
  110.     # - wdt: 看门狗对象
  111.     # - feed_times=3: 喂狗3次
  112.     # - interval=1: 每次间隔1秒
  113.     # 总喂狗时间:3次 × 1秒 = 3秒,刚好在超时时间内
  114.     feed_watchdog(wdt, feed_times=3, interval=1)
  115.     # 等待重启 | Wait for restart
  116.     print("\n--- 停止喂狗,等待看门狗超时重启 ---")
  117.     print("--- Stopping feeding, waiting for watchdog timeout restart ---")
  118.     print("系统将在3秒内重启... | System will restart within 3 seconds...")
  119.    
  120.     # 进入死循环,不再喂狗
  121.     # 看门狗将在3秒超时后强制重启系统
  122.     count = 0
  123.     while True:
  124.         time.sleep(0.1)  # 降低CPU占用 | Reduce CPU usage
  125.         count += 1
  126.         if count % 10 == 0:  # 每1秒打印一次
  127.             print(f"等待重启... 已等待 {count/10} 秒 | Waiting for restart... {count/10}s elapsed")
  128.             
  129.         # 注意:在实际应用中,这里可能会有其他代码
  130.         # 但由于没有喂狗,看门狗最终会超时重启系统
  131. if __name__ == '__main__':
  132.     main()
  133. """
  134. === 看门狗使用最佳实践 ===
  135. 1. 超时时间选择:
  136.    - 实时性要求高的系统:1-3秒
  137.    - 一般应用:5-10秒
  138.    - 长任务处理:根据最长任务时间适当延长
  139. 2. 喂狗策略:
  140.    - 在主循环中定期喂狗
  141.    - 在关键任务完成后喂狗
  142.    - 使用多个喂狗点提高可靠性
  143. 3. 错误处理:
  144.    - 喂狗操作应包含异常处理
  145.    - 记录看门狗重启事件用于诊断
  146.    - 考虑在重启前保存关键数据
  147. 4. 应用场景:
  148.    - 工业控制系统
  149.    - 自动驾驶系统
  150.    - 网络设备
  151.    - 任何需要高可靠性的嵌入式系统
  152. === 预期执行结果 ===
  153. 1. 程序启动,初始化看门狗(3秒超时)
  154. 2. 前3秒:每秒喂狗一次,共3次
  155. 3. 第3秒后:停止喂狗,进入等待循环
  156. 4. 第6秒左右(从开始计算):看门狗超时,系统自动重启
  157. 注意:实际重启时间可能因系统负载略有差异。
  158. """
复制代码


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


【花雕动手做】CanMV K230 AI视觉识别模块之使用WDT看门狗图1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail