

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

知识点
多线程是操作系统和编程中用于实现并发执行的技术,简单来说,就是一个程序中同时运行多个 “子任务”(线程),这些线程共享同一程序的资源(如内存空间、文件句柄等),但各自独立执行不同的代码片段。
1、多线程的核心特点
共享资源:同一进程中的所有线程共享进程的内存空间(如全局变量、堆内存),无需额外通信机制即可访问同一数据(但需注意同步问题)。
轻量级:线程的创建、销毁和切换开销远小于进程(进程是独立的内存空间,线程更像 “轻量级进程”)。
并发执行:在单核 CPU 上,线程通过 “时间片轮转” 实现伪并行(快速切换执行);在多核 CPU 上,可实现真并行(多个线程同时在不同核心运行)。
2、为什么需要多线程?
提升效率:处理耗时任务(如下载、计算、IO 操作)时,多线程可避免程序 “卡住”,让主线程继续响应用户操作(如 GUI 界面保持流畅)。
充分利用硬件:多核 CPU 时代,多线程能更高效地利用 CPU 核心,减少资源闲置。
简化逻辑:将复杂任务拆分为多个独立子任务(如同时处理多个网络请求),代码结构更清晰。
3、多线程的常见问题
线程安全:多个线程同时操作共享数据时,可能导致数据错乱(如 “脏读”“重复写入”),需通过锁(如mutex)、信号量等机制保证同步。
死锁:两个或多个线程互相等待对方释放资源,导致程序卡死(需通过合理设计锁的顺序避免)。
上下文切换开销:线程过多时,CPU 在切换线程状态(保存 / 恢复寄存器、栈等)的开销会抵消并发带来的收益,需控制线程数量。
4、典型应用场景
网络服务器(如 Web 服务器同时处理多个客户端请求)
后台任务(如下载软件同时进行多个文件下载)
实时数据处理(如日志分析、视频流解码)
GUI 程序(主线程处理界面,子线程处理计算 / 网络操作)




【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程
项目测试实验代码
#【花雕动手做】CanMV K230 AI视觉识别模块之使用多线程
# 导入线程模块 Import thread module
import _thread
# 导入时间模块用于实现延时 Import time module for delay functionality
import time
# 定义线程执行的函数 Define the function to be executed in threads
# name: 线程名称参数 Thread name parameter
def func(name):
while True:
# 每隔一秒输出一次信息 Print message every second
print("This is thread {}".format(name))
# 休眠1秒 Sleep for 1 second
time.sleep(1)
# 创建并启动第一个线程 Create and start the first thread
# func: 线程函数 Thread function
# ("THREAD_1",): 传递给线程函数的参数(必须是元组格式)
# Arguments passed to thread function (must be tuple format)
_thread.start_new_thread(func, ("THREAD_1",))
# 延时500毫秒
# Delay 500ms to give the first thread a chance to start
time.sleep_ms(500)
# 创建并启动第二个线程 Create and start the second thread
# 参数与第一个线程类似 Similar parameters as the first thread
_thread.start_new_thread(func, ("THREAD_2",))
# 主线程死循环,防止程序退出
# Main thread infinite loop to prevent program exit
# 延时1毫秒,避免占用过多CPU资源
# Delay 1ms to avoid consuming too much CPU
while True:
time.sleep_ms(1)多线程核心概念详解
MicroPython线程模块特点:
• 轻量级线程:适用于嵌入式系统的简化线程实现
• 全局解释器锁(GIL):Python线程不是真正的并行,但在I/O操作时能提高效率
• 简单API:相比标准Python的threading模块更简化
线程函数定义:
def func(name):
while True:
print("This is thread {}".format(name))
time
.sleep(1)
• 无限循环:线程会持续运行直到程序结束
• 带参数:通过元组形式传递参数给线程函数
• 定时输出:每秒打印一次线程标识信息
代码执行流程分析
1. 启动第一个线程
python
_thread.start_new_thread(func, ("THREAD_1",))
• 创建名为"THREAD_1"的线程
• 立即开始执行func函数
• 线程参数必须是元组格式,即使只有一个参数
2. 延时500毫秒
python
time.sleep_ms(500)
• 让第一个线程有时间开始执行并输出信息
• 避免两个线程同时启动造成输出混乱
3. 启动第二个线程
python
_thread.start_new_thread(func, ("THREAD_2",))
• 创建名为"THREAD_2"的线程
• 两个线程现在会交替执行
4. 主线程保持运行
python
while True:
time
.sleep_ms(1)
• 防止程序退出:主线程结束会导致所有子线程终止
• 低CPU占用:1毫秒延时减少CPU使用率
• 后台运行:主线程保持活动状态,让子线程继续工作
预期输出效果
运行此代码后,控制台会看到类似这样的输出:
text
This is thread THREAD_1
This is thread THREAD_2
This is thread THREAD_1
This is thread THREAD_2
This is thread THREAD_1
...
两个线程会交替每秒输出一次信息,形成并发的效果。
实际应用场景
1. 传感器数据采集:一个线程读取传感器,另一个处理数据
2. 网络通信:一个线程处理网络连接,另一个处理用户输入
3. 实时监控:多个线程同时监控不同系统状态
4. I/O密集型任务:利用线程在等待I/O时执行其他任务
注意事项
• 资源竞争:多线程访问共享资源时需要同步机制
• 内存使用:每个线程都有独立的栈空间
• 调试难度:多线程程序的调试比单线程复杂
• 嵌入式限制:在资源受限的设备上不宜创建过多线程
这段代码展示了在CanMV K230模块上实现基本多线程编程的方法。
实验串口返回情况

实验场景图


返回首页
回到顶部

评论