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

[项目] 【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程

[复制链接]
【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程图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视觉识别模块之使用多线程图2

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程图3

驴友花雕  高级技神
 楼主|

发表于 2025-11-4 09:32:45

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程

知识点
多线程是操作系统和编程中用于实现并发执行的技术,简单来说,就是一个程序中同时运行多个 “子任务”(线程),这些线程共享同一程序的资源(如内存空间、文件句柄等),但各自独立执行不同的代码片段。

1、多线程的核心特点
共享资源:同一进程中的所有线程共享进程的内存空间(如全局变量、堆内存),无需额外通信机制即可访问同一数据(但需注意同步问题)。
轻量级:线程的创建、销毁和切换开销远小于进程(进程是独立的内存空间,线程更像 “轻量级进程”)。
并发执行:在单核 CPU 上,线程通过 “时间片轮转” 实现伪并行(快速切换执行);在多核 CPU 上,可实现真并行(多个线程同时在不同核心运行)。

2、为什么需要多线程?
提升效率:处理耗时任务(如下载、计算、IO 操作)时,多线程可避免程序 “卡住”,让主线程继续响应用户操作(如 GUI 界面保持流畅)。
充分利用硬件:多核 CPU 时代,多线程能更高效地利用 CPU 核心,减少资源闲置。
简化逻辑:将复杂任务拆分为多个独立子任务(如同时处理多个网络请求),代码结构更清晰。

3、多线程的常见问题
线程安全:多个线程同时操作共享数据时,可能导致数据错乱(如 “脏读”“重复写入”),需通过锁(如mutex)、信号量等机制保证同步。
死锁:两个或多个线程互相等待对方释放资源,导致程序卡死(需通过合理设计锁的顺序避免)。
上下文切换开销:线程过多时,CPU 在切换线程状态(保存 / 恢复寄存器、栈等)的开销会抵消并发带来的收益,需控制线程数量。

4、典型应用场景
网络服务器(如 Web 服务器同时处理多个客户端请求)
后台任务(如下载软件同时进行多个文件下载)
实时数据处理(如日志分析、视频流解码)
GUI 程序(主线程处理界面,子线程处理计算 / 网络操作)

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程图1

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程图2

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程图4

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程图3

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2025-11-4 09:47:07

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程
项目测试实验代码

  1. #【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程
  2. # 导入线程模块 Import thread module
  3. import _thread
  4. # 导入时间模块用于实现延时 Import time module for delay functionality
  5. import time
  6. # 定义线程执行的函数 Define the function to be executed in threads
  7. # name: 线程名称参数 Thread name parameter
  8. def func(name):
  9.     while True:
  10.         # 每隔一秒输出一次信息 Print message every second
  11.         print("This is thread {}".format(name))
  12.         # 休眠1秒 Sleep for 1 second
  13.         time.sleep(1)
  14. # 创建并启动第一个线程 Create and start the first thread
  15. # func: 线程函数 Thread function
  16. # ("THREAD_1",): 传递给线程函数的参数(必须是元组格式)
  17. # Arguments passed to thread function (must be tuple format)
  18. _thread.start_new_thread(func, ("THREAD_1",))
  19. # 延时500毫秒
  20. # Delay 500ms to give the first thread a chance to start
  21. time.sleep_ms(500)
  22. # 创建并启动第二个线程 Create and start the second thread
  23. # 参数与第一个线程类似 Similar parameters as the first thread
  24. _thread.start_new_thread(func, ("THREAD_2",))
  25. # 主线程死循环,防止程序退出
  26. # Main thread infinite loop to prevent program exit
  27. # 延时1毫秒,避免占用过多CPU资源
  28. # Delay 1ms to avoid consuming too much CPU
  29. while True:
  30.     time.sleep_ms(1)
复制代码

多线程核心概念详解
MicroPython线程模块特点:
• 轻量级线程:适用于嵌入式系统的简化线程实现
• 全局解释器锁(GIL):Python线程不是真正的并行,但在I/O操作时能提高效率
• 简单API:相比标准Python的threading模块更简化

线程函数定义:

  1. def func(name):
  2.     while True:
  3.         print("This is thread {}".format(name))
  4.         time
  5. .sleep(1)
复制代码

• 无限循环:线程会持续运行直到程序结束
• 带参数:通过元组形式传递参数给线程函数
• 定时输出:每秒打印一次线程标识信息

代码执行流程分析
1. 启动第一个线程
python

  1. _thread.start_new_thread(func, ("THREAD_1",))
复制代码

• 创建名为"THREAD_1"的线程
• 立即开始执行func函数
• 线程参数必须是元组格式,即使只有一个参数

2. 延时500毫秒
python

  1. time.sleep_ms(500)
复制代码

• 让第一个线程有时间开始执行并输出信息
• 避免两个线程同时启动造成输出混乱

3. 启动第二个线程
python

  1. _thread.start_new_thread(func, ("THREAD_2",))
复制代码

• 创建名为"THREAD_2"的线程
• 两个线程现在会交替执行

4. 主线程保持运行
python

  1. while True:
  2.     time
  3. .sleep_ms(1)
复制代码

• 防止程序退出:主线程结束会导致所有子线程终止
• 低CPU占用:1毫秒延时减少CPU使用率
• 后台运行:主线程保持活动状态,让子线程继续工作
预期输出效果
运行此代码后,控制台会看到类似这样的输出:
  1. text
  2. This is thread THREAD_1
  3. This is thread THREAD_2
  4. This is thread THREAD_1
  5. This is thread THREAD_2
  6. This is thread THREAD_1
  7. .......
复制代码


两个线程会交替每秒输出一次信息,形成并发的效果。

实际应用场景
1. 传感器数据采集:一个线程读取传感器,另一个处理数据
2. 网络通信:一个线程处理网络连接,另一个处理用户输入
3. 实时监控:多个线程同时监控不同系统状态
4. I/O密集型任务:利用线程在等待I/O时执行其他任务

注意事项
• 资源竞争:多线程访问共享资源时需要同步机制
• 内存使用:每个线程都有独立的栈空间
• 调试难度:多线程程序的调试比单线程复杂
• 嵌入式限制:在资源受限的设备上不宜创建过多线程
这段代码展示了在CanMV K230模块上实现基本多线程编程的方法。

实验串口返回情况

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程图1

实验场景图

【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程图2


回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail