多核异构通信实战:IPCC与RPMsg框架在STM32MP157中的协同设计

多核异构核间通信-mailbox/RPMsg 介绍及实验 多核异构 mailbox RPMsg 阅读详情

1. 从零理解多核异构:为什么你的MP157需要IPCC和RPMsg?

如果你刚拿到一块STM32MP157开发板,看到它既有Cortex-A7又有Cortex-M4内核,可能会想:这不就是两个CPU塞进一块芯片里了吗?我能不能让A7跑Linux处理复杂应用,同时让M4去实时采集传感器数据,然后它们俩还能高效地“说悄悄话”?这个“说悄悄话”的过程,就是核间通信,而IPCC和RPMsg就是让它们俩能顺畅沟通的“秘密语言”和“快递系统”。

我刚开始接触多核异构时,也犯过迷糊。以为就像电脑上开两个线程,共享内存就行了。但实际上,A7和M4是两个完全独立的处理器,各有各的内存空间、中断系统和运行环境。A7上跑着庞大的Linux系统,而M4可能跑着裸机或RTOS。它们物理上很近,但逻辑上却像隔着一堵墙。直接去读写对方的内存?行不通,而且非常危险。这就需要一套标准的、安全的“通信协议”和“物流体系”。

IPCC,全称Inter-Processor Communication Controller,你可以把它想象成连接两个核心的“门铃”和“信号灯”。它的活儿很简单,就是发通知。比如M4采集完数据了,它不会傻乎乎地把一大坨数据直接塞给A7,而是通过IPCC“按一下门铃”(触发一个中断),告诉A7:“嘿,老兄,货放在老地方了,你自己来取。” IPCC硬件上提供了多个通道,每个通道都有占用/空闲标志,确保了通知的原子性和及时性,避免了两个核心同时“抢话筒”的混乱。

光有门铃还不够,我们还得有“货”和“运货的通道”。这就是RPMsg框架登场的时候了。RPMsg基于VirtIO虚拟化技术,它在共享内存中建立了一套名为“vring”的环形缓冲区队列。你可以把它理解成两个核心之间开辟了一条“双向快递流水线”。M4把处理好的数据打包成“消息”,放到发送vring里,然后通过IPCC通知A7。A7收到通知后,就从自己的接收vring里取出“包裹”处理。整个过程,数据本身是通过共享内存传递的,效率极高;而IPCC只负责传递“有包裹到了”这个信号,分工明确。

所以,在STM32MP157上,IPCC和RPMsg是黄金搭档:IPCC是负责喊话的“通信兵”,快速、可靠;RPMsg是负责搬运和封装数据的“后勤部队”,高效、有序。它们协同工作,才能让A7和M4这对异构兄弟真正发挥出“1+1>2”的威力。接下来,我们就深入这套系统的内部,看看怎么把它们用起来。

2. 深入核心:拆解IPCC硬件与Linux Mailbox框架

要玩转核间通信,不能只停留在概念上,得搞清楚硬件是怎么工作的,以及Linux系统是怎么把它管起来的。STM32MP157的IPCC外设,硬件设计得很精巧。

它提供了多达6个双向硬件通道。注意,是“双向”的。每个通道又被拆分成两个“子通道”:一个专用于从处理器1发到处理器2(P1_TO_P2),另一个专用于从处理器2发到处理器1(P2_TO_P1)。这就好比在两个房间之间装了6条管道,每条管道里还有两根方向固定的单向水管,杜绝了数据流“撞车”的可能。每个子通道都有一个核心的“占用标志位”。发送方发消息前,会检查这个标志,如果是空闲的,就把它设为“占用”,然后触发接收方的中断。接收方处理完消息后,再手动把这个标志清空,表示“管道已通,可以发送下一件了”。这种硬件实现的原子操作,是通信可靠性的基石。

在Linux的世界里,如此好用的硬件需要被统一管理。这就是Linux Mailbox框架的职责。Mailbox框架抽象了硬件IPCC,为我们提供了简洁的API。它主要包含两个角色:Mailbox Controller和Mailbox Client。

Controller是硬件适配层,比如ST官方写的drivers/mailbox/stm32-ipcc.c这个驱动,它的任务就是初始化IPCC硬件、管理中断、并提供标准的控制器操作接口给内核。当我们在设备树里写上compatible = "st,stm32mp1-ipcc"时,内核就会用这个驱动来驱动IPCC硬件。

Client则是通信的发起方或接收方。在STM32MP157的场景里,最重要的Client就是管理M4核心的远程处理器驱动。我们来看看设备树里是怎么描述的:

&m4_rproc {
    mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>;
    mbox-names = "vq0", "vq1", "shutdown";
    ...
};

这段配置非常关键。它告诉系统:m4_rproc这个设备(也就是M4核心)需要使用IPCC控制器的第0、1、2号通道。并且给它们起了别名:vq0和vq1就对应RPMsg框架里那两个vring(虚拟队列)的通知通道,一个用于发送,一个用于接收。shutdown通道则用于远程控制,比如让A7命令M4关机。通过Mailbox框架,复杂的硬件操作被简化成了对通道名的引用,驱动开发者只需要关心“我要通过vq0通道发个通知”,而不需要去直接操作IPCC的寄存器。

我当初在调试时,就曾因为没理解设备树中mboxes属性的顺序,导致通知发不出去。后来通过阅读stm32_rproc.c驱动源码才发现,驱动里是按照mbox-names的名字来查找通道的。所以,确保设备树配置与驱动期待的顺序一致,是打通通信的第一步。内核也提供了测试工具,你可以通过debugfs来手动操作mailbox,验证硬件和底层驱动是否正常,这对排查问题非常有帮助。

3. 构建通信桥梁:RPMsg框架与OpenAMP生态

当IPCC和Mailbox框架为我们铺好了“通知”的道路后,RPMsg框架就开始构建运输数据的“桥梁”。RPMsg的实现,离不开OpenAMP这个开源生态系统。OpenAMP(Open Asymmetric Multi-Processing)提供了一套完整的软件栈,用于管理异构多核系统中的远程处理器和核间通信,而RPMsg是其中的通信层核心。

在STM32MP157上,A7侧(Linux端)的RPMsg驱动已经集成在Linux内核中(主要是drivers/rpmsg/目录下的代码)。它的核心是创建了一个基于Virtio的消息总线。当远程处理器(M4)被启动时,A7侧的驱动会解析M4固件中携带的“资源表”,根据其中的信息,在共享内存中创建出vring数据结构。这个过程是自动的,得益于RemoteProc框架的管理。RemoteProc负责M4核心的生命周期:加载固件、启动、停止,并在过程中为其分配通信资源。

那么M4侧呢?它跑的不是Linux,通常是一个轻量级的固件。这就需要使用OpenAMP库。ST在STM32CubeMP1 SDK中提供了基于OpenAMP的示例工程。在这个工程里,M4固件会调用OPENAMP_create_endpoint()这样的函数来创建通信端点。这个端点有一个名字,比如rpmsg-tty-channel或rpmsg-client-sample。

这里有个非常巧妙的设计:RPMsg框架与Linux的平台总线设备模型进行了融合。当M4固件创建一个名为rpmsg-tty-channel的端点时,它在底层实际上是在向A7侧的Linux内核“注册”了一个平台设备。A7侧的Linux内核中,有一个驱动drivers/rpmsg/rpmsg_tty.c,它的compatible属性正好能匹配到这个设备名。于是,驱动探测函数被调用,在Linux用户空间就神奇地出现了一个/dev/ttyRPMSG0这样的串口设备节点!

这意味着,你不需要写任何底层驱动,就可以在A7的Linux应用里,用标准的write()系统调用向/dev/ttyRPMSG0写数据,这些数据会自动被RPMsg框架打包,通过共享内存和IPCC通知,传递给M4固件。反之亦然。这种抽象极大地简化了开发,你可以用最熟悉的“串口编程”思维来实现核间通信,而背后是高效的内存共享机制。

4. 实战演练:从固件加载到数据收发

理论说得再多,不如动手做一遍。我们以一个完整的实战流程,看看如何让A7和M4“对话”。假设我们已经有了一个编译好的M4固件OpenAMP_raw_CM4.elf,它里面创建了两个端点:一个用于示例消息收发(对应rpmsg-client-sample驱动),一个用于虚拟串口(对应rpmsg-tty-channel驱动)。

第一步:环境准备与固件加载。 确保你的开发板设备树已正确配置。通常,ST官方和主流开发板厂商的SDK都已默认开启相关配置。你需要特别注意的是,M4固件里使用的硬件资源(比如我们例子中的USART3)不能与A7侧的Linux设备树冲突。务必在A7侧的设备树中禁用USART3节点,或者确保它不被用作Linux的标准串口。然后,将ELF固件拷贝到Linux的固件目录:

cp OpenAMP_raw_CM4.elf /lib/firmware/

接着,通过RemoteProc子系统加载并启动M4核心:

cd /sys/class/remoteproc/remoteproc0
echo OpenAMP_raw_CM4.elf > firmware
echo start > state

执行echo start > state的瞬间,内核的RemoteProc框架会解析固件、设置共享内存、初始化RPMsg通道,并最终将M4核心从复位中释放。此时,你应该能在A7的系统日志(dmesg)中看到一系列驱动初始化的信息。

第二步:验证基础通信。 如果M4固件正确运行,并且rpmsg-client-sample端点创建成功,A7侧的内核会自动加载对应的示例驱动模块(如果编译为模块的话)。你可以用lsmod命令查看是否加载了rpmsg_client_sample。同时,M4固件通常会通过其硬件串口(如USART3)打印启动日志,比如“[INFO] M4 send to A7 : hello world!”。而在A7的dmesg里,你会看到类似“virtio0.rpmsg-client-sample.-1.0: incoming msg 1 (src: 0x0)”的日志。这证明第一条通过RPMsg发送的测试消息已经从M4成功抵达A7。

第三步:使用虚拟串口进行双向通信。 这是更实用的一步。检查/dev目录,你会发现多出了一个ttyRPMSG0的设备节点。现在,你可以像操作普通串口一样操作它:

  1. 从A7发消息给M4:
    echo "Hello from Linux A7 Core!" > /dev/ttyRPMSG0
    
    这条命令执行后,字符串会通过RPMsg框架发送到M4。如果你的M4固件编写了处理该虚拟串口数据的代码,并把它从真实的USART3打印出来,你就能在连接USART3的物理串口终端上看到这行消息。
  2. 从M4发消息给A7: 在M4固件中,你可以调用OpenAMP提供的API,通过rpmsg-tty-channel端点发送数据。这些数据会在A7侧表现为从/dev/ttyRPMSG0设备节点可以读取到的内容。你可以用cat命令或者编写一个简单的C程序来读取这个“串口”:
    cat /dev/ttyRPMSG0
    

通过以上三步,你就完成了一次完整的、基于IPCC和RPMsg协同工作的核间通信实战。整个过程,你并没有直接操作任何IPCC寄存器或内存地址,全部由内核框架和OpenAMP库代劳,这就是使用成熟框架开发的高效之处。

5. 进阶优化与排坑指南

当基础功能跑通后,你可能会考虑更实际的问题:如何优化性能?如何保证通信的可靠性?在实际项目中我踩过不少坑,这里分享几点经验。

性能优化策略:

  1. 消息大小与频率:RPMsg消息是拷贝到共享内存vring中的。虽然共享内存很快,但频繁拷贝小消息仍有开销。如果单次传输数据量很大,可以考虑在消息中传递“指针”(实际上是共享内存内的偏移地址),但这就需要双方预先约定好一块更大的共享内存池,并自行管理其读写同步,增加了复杂度。一个折中的方案是,将多个传感器数据打包成一个结构体,进行一次传输。
  2. 通道选择:IPCC有6个通道,vq0和vq1通常被RPMsg固定使用。你还可以利用剩余的通道,通过Mailbox框架自定义一些轻量级的、高优先级的控制信令。比如,M4在采集到关键告警数据时,除了通过RPMsg发送数据包,还可以通过一个独立的IPCC通道发送一个最高优先级的“告警标志”中断,让A7能够立即响应。
  3. 中断处理优化:在A7侧的Linux驱动中,IPCC中断处理函数(ISR)应该尽可能短小,只做必要的标志位操作,然后将实际的数据处理推送到工作队列(workqueue)或内核线程中完成,避免长时间关中断影响系统实时性。

常见问题与排查:

  1. M4无法启动:首先检查/sys/class/remoteproc/remoteproc0/state和firmware文件。确保固件路径和文件名正确。用dmesg | grep remoteproc或stm32_rproc查看详细错误日志。常见原因是内存冲突,检查设备树中m4_rproc节点的memory-region配置,是否与Linux系统内存有重叠。
  2. RPMsg通道创建失败:检查A7内核是否配置了CONFIG_RPMSG_CHAR、CONFIG_RPMSG_TTY等选项。确认M4固件中端点的名字与A7内核驱动的名字能匹配上。可以通过dmesg | grep rpmsg观察端点注册过程。
  3. 通信数据错误或丢失:这可能是最棘手的问题。首先,确保双方对消息格式(结构体对齐、字节序)的理解完全一致。STM32MP157的A7和M4都是小端模式,这省去了字节序转换的麻烦。其次,检查共享内存区域的缓存一致性配置。CPU缓存是性能加速器,但也是多核通信的“隐形杀手”。在Linux设备树中描述共享内存区域时,必须为其加上no-map和dma-memory-attributes等属性,以确保该区域是非缓存的(或正确维护缓存一致性)。这是很多诡异数据错误的根源。ST官方设备树中vdev0buffer等内存区域的配置就是正确范例,务必参考。
  4. 系统稳定性问题:长时间运行后通信中断。注意M4侧的看门狗配置。在A7侧的设备树中,m4_rproc节点关联了exti中断作为“wdg”(看门狗)事件。这意味着如果M4固件崩溃或看门狗复位,A7侧能收到通知并进行恢复处理(如果使能了recovery属性)。合理利用这一机制,可以提升系统的健壮性。

搞懂这些优化点和坑,你就能从“能用”进阶到“用好”。多核异构通信的设计,本质上是在性能、实时性、开发便利性和系统可靠性之间寻找最佳平衡点。IPCC和RPMsg这套组合,为我们在STM32MP157上找到了一个非常不错的起点。剩下的,就看你如何根据自己的应用场景去灵活运用和深度定制了。

第十八节 多核异构核间通信–ipcc 基于STM32MP1Linux 驱动开发实战 多核异构核间通信–ipcc 阅读详情

相关推荐

从串口调试到核间通信:用RPMSG在STM32MP157上搭建跨核日志系统

本文详细介绍了如何在STM32MP157多核异构处理器上,利用RPMsg框架构建高效的跨核日志系统。通过解析RemoteProc、Mailbox与RPMsg的协作机制,指导开发者完成环境配置、固件加载,并实现从基础ttyRPMSG到自定义字符设备的日志通道搭建。文章还分享了缓冲区管理、日志分级过滤及集成syslog等高级优化技巧,旨在解决多核调试信息割裂的痛点,提升开发与调试效率。

weixin_29172963的博客 565

【STM32MP157 学习篇】STM32MP157 RPMSG多核通信试验

使用正点原子的stm32mp157mini进行RPMSG多核通信试验。

qq_54050349的博客 956

从零开始理解多核异构通信:Mailbox/RPMsg在STM32MP157上的工作原理与调试技巧

本文以STM32MP157平台为例,深入解析了多核异构系统中核间通信的核心机制。文章详细阐述了硬件层IPCC控制器的工作原理,以及构建其上的Linux Mailbox框架与RPMsg消息框架的协同工作方式,并提供了从固件加载到双向通信的完整实践链路与关键调试技巧。

weixin_29163857的博客 127

openamp RPU-APU双核间通信 建立多个通道

前言 RPU-APU使用openamp进行通信 源码中只有单通道,建立多通道 1)使用更多的通道; 本文介绍建立多个通道方法 创建节点函数 先看一下手册中函数的使用说明 函数有删减,分析用 int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, const ch

4737

从串口调试到核间通信:用ttyRPMSG实现STM32MP157双核数据透传

本文详细介绍了如何在STM32MP157多核异构平台上,利用ttyRPMSG设备实现Cortex-A7与Cortex-M4核心间高效、简便的数据透传。通过将底层复杂的Mailbox与RPMsg核间通信机制封装为标准的串口设备接口,开发者可直接使用echo、cat等基础命令或标准串口编程方法进行双核交互,极大降低了开发门槛,适用于流式数据传输、快速原型验证及M4端printf重定向等场景。

weixin_29168675的博客 79

STM32MP157——Remoteproc和RPMsg

优快云仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。 本博文对应地址:https://hceng.cn/2020/05/09/STM32MP157%E2%80%94%E2%80%94Remoteproc%E5%92%8CRPMsg/#more 简单介绍基于STM32MP157的Remoteproc和RPMsg框架。 STM32MP1系列产品,是STM32进军Linux的首款微处理器,采用MCU+MPU的组合,集成两颗主频为650MHz的Cortex-A7应

hceng_linux 8295

多核异构通信那些坑:STM32MP157 IPCC实战避坑指南

本文深入剖析STM32MP157多核异构通信中的IPCC技术陷阱,提供五大典型问题的解决方案,包括中断风暴、内存共享、通道竞争等,帮助开发者优化核间通信性能,提升系统稳定性。

s1t2u3的博客 912

基于 OpenAMP 的异构调度通信模型与片内消息链设计实战详解

随着国产 SoC 芯片日益朝向异构架构发展,大量片上系统同时集成高性能 Cortex-A、实时 Cortex-R 或低功耗 Cortex-M 核心。在 Android、RTOS、裸机并存的多核环境中,OpenAMP(Open Asymmetric Multi-Processing)已成为实现异构核间通信与任务调度的事实标准。它通过 VirtIO、RPMsg、Remoteproc 等模块构建片内高效的消息通道,实现任务状态同步、AI 加速任务下发、片上控制指令转发等功能。本文系统梳理 OpenAMP 在国产芯

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1469

STM32MP157多核通信实战:5分钟搞定Mailbox与RPMsg框架配置

本文提供了一份STM32MP157多核异构芯片的核间通信实战指南。通过解析RemoteProc、RPMsg和Mailbox三大框架的协同机制,详细演示了如何在5分钟内完成环境检查、设备树配置、M4固件加载与启动,并实现基于RPMsg的稳定数据交换,为复杂应用奠定基础。

c8d9e0f1的博客 498

手把手教你搞定JBI投稿:从Statement of Significance到Declaration Statement的保姆级避坑指南

本文提供了一份详细的JBI投稿指南,重点解析Statement of Significance和Declaration of Interests的撰写技巧,帮助研究者避开常见格式陷阱。通过实战案例和检查清单,确保投稿符合JBI的学术严谨性和临床转化价值要求,提升稿件通过率。

weixin_29278805的博客 624

从零到一:PrimeTime静态时序分析入门指南

本文详细介绍了PrimeTime静态时序分析(STA)的入门指南,从基础概念到实际应用全面覆盖。内容包括时序路径分类、PrimeTime环境搭建、时序约束设置与验证、时序分析与报告解读等核心内容,帮助工程师快速掌握STA技术,解决数字芯片设计中的时序收敛问题。

weixin_28730131的博客 268

STM32MP157多核异构通信:OpenAMP框架下的Linux与RT-Thread实战解析

本文深入解析STM32MP157多核异构通信,重点介绍OpenAMP框架下Linux与RT-Thread的实战应用。通过Virtio、RPMsg和Remoteproc三大组件,实现高效异核通信,涵盖硬件配置、代码实现及性能优化,为嵌入式开发提供实用指南。

tcp8optimizer的博客 560

10.2 在新能源、储能及电网节点的应用实践

构网型变流器技术在电力系统中的应用进展 构网型变流器技术正从理论研究走向规模化工程应用,为新能源并网提供主动支撑能力。该技术在光伏电站采用"部分构网"混合架构,由构网单元实现黑启动和弱网稳定;在风电场利用叶轮动能提供惯量响应。储能系统是理想的构网载体,可提供快速调频和动态电压支撑。在电网节点,构网型STATCOM可增强弱电网电压稳定性,大容量变流器可替代传统调相机。当前面临标准滞后、宽频振荡风险等共性挑战,需在可靠性、经济性间取得平衡。系统级协调控制和精确阻抗建模是应用成功的关键。

技术工作者 1111

从零构建异构通信:OpenAMP框架下的STM32MP157双核对话实战

本文详细介绍了如何在STM32MP157双核处理器上使用OpenAMP框架实现异构通信。通过实战代码解析Linux与RT-Thread系统的协同工作,深入讲解共享内存配置、中断机制和数据传输优化,帮助开发者掌握异核通信的核心技术,提升工业控制和边缘计算应用的开发效率。

hadoop5ranger的博客 629

手把手教你用Python实现双三次插值(附OpenCV对比测试)

本文深入解析了双三次插值算法的数学原理,并提供了从零开始的Python实现教程。通过与OpenCV官方实现的对比测试,详细评估了不同插值算法(包括最邻近差值、双线性插值)在图像质量与计算性能上的差异,帮助开发者掌握高质量图像缩放的核心技术。

weixin_29310605的博客 296

即插即用系列(代码实践) | WACV 2024 CSAM:面向各向异性医学图像分割的 2.5D 跨切片注意力模块

文章摘要: 论文《CSAM: A 2.5D Cross-Slice Attention Module for Anisotropic Volumetric Medical Image Segmentation》提出了一种解决医学图像各向异性问题的创新模块CSAM。针对MRI/CT数据中切片间分辨率差异大的挑战,该模块通过2.5D跨切片注意力机制,结合2D卷积的轻量性和3D上下文感知能力。核心包括语义注意力(通道级)、位置注意力(空间级)和跨切片注意力(支持不确定性建模),能在几乎不增加参数量的情况下有效捕捉

分享顶会顶刊论文即插即用模块 106

作为物联网网关的“脊梁”:基于ZYNQ/STM32MP157的Linux+RTOS混合部署经验谈

一个核跑Linux做界面,一个核跑RTOS做实时控制——异构多核混合部署,正在成为物联网网关的“脊梁”。 本文基于ZYNQ和STM32MP157真实项目: ✅ 为什么需要混合部署?Linux生态强但实时性差,RTOS实时性好但生态弱 ✅ OpenAMP框架:RPMsg+VirtIO+Remoteproc,异构通信的“桥梁” ✅ 实战部署:在ZYNQ上加载FreeRTOS固件、STM32MP157上跑RT-Thread ✅ 更高级玩法:FPGA硬件加速(4μs级核间通信)

m0_58189820的博客 1243

ENVI_基于无人机数据的果树提取与相对健康监测

一、数据处理 1.计算植被指数VDVI或GDVI:Band Math / Spectral Indices 2.制作掩膜:ROI——Threshold——Subset 二、单地块果树提取 1.绘制感兴趣区shp 2.确定果树提取参数:Count Crops 3.输出果树矢量文件:Convert Crops To Shapefile 4.果树相对健康程度分析:Calculate Crop Me...

提供技术服务、资源分享 429690771 1400

保姆级教程:在STM32MP157开发板上,用CubeIDE搞定A7与M4的OpenAMP通信

本文详细介绍了在STM32MP157开发板上使用CubeIDE实现Cortex-A7与Cortex-M4双核OpenAMP通信的完整流程。从异构架构解析、环境配置到双核固件烧录,再到通信实战与性能优化,提供了一套多核协同开发的保姆级教程,帮助开发者快速掌握工业级嵌入式通信技术。

weixin_30460489的博客 400

3D打印开源硬件MKS Monster8 V2.0 原理图赏析--更新中

MKS MONSTER8 主板是创客基地为满足市场需求而推出的主板,可用于Voron 2.4机器安装,支Marlin 固件和Klipper固件,支持U盘打印(暂时只有Marlin固件支持),支持TMC驱动UART模式,它包含了3D打印机所需要的主要部件和接口,通过MCU集中控制,是一款功能强大的主板。下面详细分析一下。

我的专栏 7224

面经-2023-哲库Zeku-数字芯片设计

面经-2023-哲库Zeku-数字芯片设计

w0shishabi的博客 3907

【Xilinx-Petalinux学习】-08-OpenAMP系统实现

openAMP系统实现。 一个核跑Linux,一个核裸跑。 -----> 已经实现。 一个核跑Linux,一个核跑UCOS -----> 还未实现。 Micrium的ucos OpenAMP例子与Xilinx的例子框架结构有些不同,尝试修改共享内存基地址、改变程序结构,还未成功。先放一放,以后再来实验,或者等Micrium给出官方的例程~~~~TT ste...

weixin_30294295的博客 2332

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: Oracle MERGE INTO实战:如何用一条SQL搞定员工数据同步(附完整案例)
下一篇: 压缩感知信号恢复的数学基础:稀疏性、RIP条件与矩阵不相关性的深层逻辑解析
杠精协会主席
博客等级 码龄3年 75粉丝 1287原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值