当前位置: 首页 > news >正文

基于FET6254-C多核异构处理器的智能运动控制系统设计与实践

1. 项目概述:当运动控制遇上嵌入式智能

最近在做一个智能运动控制的项目,从传统的PLC方案转向了更灵活、更智能的嵌入式平台。选型过程中,飞凌嵌入式的FET6254-C核心板进入了我的视野,经过一番深度评估和实际测试,它确实在多个维度上为我们的智能运动控制系统提供了强有力的支撑。今天就来聊聊这块板子,以及它如何在实际项目中“赋能”。

所谓智能运动控制,早已不是简单的“电机转起来、停下去”。它需要实时、精准地处理多轴联动、轨迹规划、力矩控制,同时还要能处理视觉引导、力觉反馈、网络通信等上层任务。这对控制器的算力、实时性、接口丰富度和可靠性都提出了苛刻要求。FET6254-C核心板基于TI的AM62x系列处理器,其多核异构架构(Cortex-A53 + Cortex-M4F + PRU-ICSSG)恰好精准地切入了这个细分领域。它不像一些纯应用处理器那样实时性不足,也不像一些纯微控制器那样算力捉襟见肘,这种“大小核”协同的设计思路,为构建高性能且确定性的控制系统提供了理想的硬件基础。

对于系统集成商和终端设备开发者而言,选择核心板意味着将复杂的硬件设计、电源管理、高速信号完整性等问题交给专业的原厂,自己则可以更专注于运动控制算法、应用逻辑和行业know-how的实现。FET6254-C提供的稳定、可靠的硬件平台,正是这种分工协作的体现。接下来,我将从设计思路、核心细节、实操要点和常见问题几个层面,拆解这块核心板在智能运动控制系统中的价值与应用。

2. 核心板选型与系统架构设计思路

2.1 为何是“多核异构”?

在运动控制领域,实时性和通用计算能力常常是一对矛盾。传统的做法可能是“PC+运动控制卡”,或者“高端MCU+FPGA”。前者成本高、体积大,后者开发难度大、生态弱。FET6254-C的AM62x处理器提供了一种优雅的集成方案。

它的Cortex-A53核心(最高1.4GHz)可以轻松运行Linux或Android系统,负责非实时任务:例如,运行基于ROS(机器人操作系统)的上层应用、处理HMI人机界面、执行视觉识别算法(通过其内置的GPU或ISP)、管理以太网/Wi-Fi/蓝牙通信、读写数据库等。这部分任务对时效性要求不那么苛刻,但需要丰富的软件生态和强大的通用算力。

而它的Cortex-M4F核心和两个PRU-ICSSG(可编程实时单元和工业通信子系统)则是为实时性而生的。M4F内核可以运行FreeRTOS、TI-RTOS等实时操作系统,专门处理高精度的PID控制环、运动轨迹插补计算。PRU更是TI的“独门利器”,它是运行在200MHz左右的超低延迟可编程逻辑单元,可以直接访问和操控外设引脚,实现纳秒级的硬件级IO响应。我们可以将最苛刻的实时任务,如电子凸轮、高速位置比较输出、精准的PWM生成、增量式编码器信号解码等,卸载到PRU上执行,确保控制的绝对确定性。

这种架构设计,使得我们可以在一个芯片内实现“大脑”(A核)和“小脑”(M核+PRU)的协同工作,通过芯片内部的高速互联进行数据交换,既保证了系统功能的丰富性,又确保了运动控制核心的硬实时性能。这比外挂多个芯片的方案,在成本、功耗、可靠性和数据交互延迟上都有显著优势。

2.2 FET6254-C核心板的接口能力解析

一块核心板能否“赋能”,其接口资源是关键。FET6254-C的接口配置堪称为工业与运动控制量身定制:

  1. 工业以太网与现场总线:板载双端口千兆以太网,并特别支持TSN(时间敏感网络)。这对于需要多设备高精度同步的分布式运动控制系统至关重要。PRU-ICSSG原生支持EtherCAT、Profinet、EtherNet/IP等主流工业以太网协议,无需外挂ASIC,降低了成本和复杂度。这意味着我们可以直接用这块核心板作为EtherCAT主站或从站,构建高性能的实时运动控制网络。

  2. 丰富的运动控制接口

    • 多路PWM/HRPWM:可生成高分辨率PWM信号,用于伺服驱动器的速度/转矩控制。
    • QEP(正交编码器脉冲)接口:直接连接伺服电机的编码器,实现高精度位置反馈。
    • 多路ADC:用于采集模拟量信号,如力矩传感器、模拟量速度给定等。
    • 高速GPIO:通过PRU控制,可以实现自定义的通信协议或高速IO触发。
  3. 显示与交互接口:支持RGB/LVDS显示接口、触摸屏接口(I2C)、多路UART、CAN-FD等。这使得开发带触摸屏的一体化运动控制器成为可能,无需额外增加HMI模块。

  4. 扩展与存储:双路OSPI接口可接高速Flash,SD/eMMC接口用于存储系统和程序,PCIe接口可用于扩展更强大的视觉处理单元或其他功能卡。

这样的接口配置,使得以FET6254-C为核心构建的系统,可以是一个高度集成的控制单元:既能做多轴运动控制,又能做人机交互,还能做简单的机器视觉和网络通信网关,实现“一板多用”,极大简化了系统架构。

注意:在方案设计初期,一定要根据你的具体运动控制轴数、通信协议、显示需求等,仔细核对核心板的每个接口资源是否够用,并预留一定的余量。例如,如果需要控制8个伺服轴,就要确认PWM/QEP接口数量是否满足;如果要做EtherCAT主站,要确认PRU-ICSSG的资源分配。

3. 开发环境搭建与系统镜像构建实操

3.1 基础开发环境准备

拿到核心板后,第一步是搭建开发环境。飞凌嵌入式提供了比较完善的软件开发套件(SDK),基于TI的Processor SDK Linux和RTOS进行定制。我的建议是直接在Ubuntu 20.04 LTS或22.04 LTS系统上进行开发,兼容性最好。

首先,需要安装一些基础的编译工具和依赖库:

sudo apt-get update sudo apt-get install -y git build-essential diffstat texinfo gawk chrpath socat doxygen \ libsdl1.2-dev xterm sed cvs subversion coreutils texi2html docbook-utils \ python3-pysqlite2 help2man make gcc g++ desktop-file-utils libgl1-mesa-dev \ libglu1-mesa-dev mercurial autoconf automake groff curl lzop asciidoc \ u-boot-tools libssl-dev device-tree-compiler bison flex

接下来,获取飞凌提供的SDK包。通常是一个很大的压缩文件,解压后,其目录结构包含了Linux内核源码、U-Boot源码、文件系统构建工具(Yocto/OpenEmbedded或Debian根文件系统)、以及针对核心板预编译的镜像和工具链。

设置环境变量是关键一步,它能告诉编译系统工具链的位置和目标架构:

export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- # 假设你的工具链路径是 /opt/fet6254/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/ export PATH=/opt/fet6254/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH

请务必根据你实际SDK中工具链的路径进行修改。验证工具链是否生效:

aarch64-linux-gnu-gcc --version

3.2 系统镜像的定制与编译

飞凌一般会提供几种类型的镜像:全功能镜像、最小系统镜像、QT镜像等。但我们做运动控制,往往需要根据自己的需求进行裁剪和定制。

1. U-Boot编译:U-Boot是系统的引导程序。进入SDK中的U-Boot源码目录,通常已经有为FET6254-C配置好的默认配置文件(如fet6254c_defconfig)。

cd u-boot-source make fet6254c_defconfig make menuconfig # 可选,进行高级配置,如修改启动参数、环境变量等 make -j$(nproc)

编译完成后会生成tiboot3.bin,tispl.bin,u-boot.img等文件。这些是启动第一阶段所需的二进制文件。

2. Linux内核配置与编译:内核配置是重中之重,它决定了系统支持哪些驱动和功能。

cd linux-kernel-source # 导入飞凌提供的默认配置 make ARCH=arm64 fet6254c_defconfig # 进入图形化配置界面,进行定制 make ARCH=arm64 menuconfig

在内核配置中,需要重点关注:

  • 设备树(Device Tree):确认使用的设备树源文件(DTS)是否正确对应FET6254-C核心板及你的载板。设备树描述了硬件的所有资源,驱动依赖它来工作。
  • 实时性补丁:对于运动控制,虽然关键实时任务在M4F/PRU上,但A核的Linux系统若需要较好的实时响应,可以启用CONFIG_PREEMPT_RT(实时抢占补丁)。但这会增加系统复杂度,需评估必要性。
  • 驱动启用:确保所需的驱动已编译进内核或编为模块。如:
    • CONFIG_TI_PRUSS- PRU子系统驱动
    • CONFIG_PWM_TIEHRPWM- HRPWM驱动
    • CONFIG_QEP_TIEQEP- 正交编码器驱动
    • CONFIG_ETHERNETCONFIG_TI_ICSSG_PRUETH- 工业以太网驱动
    • CAN、SPI、I2C、USB等外设驱动。 配置完成后进行编译:
make ARCH=arm64 -j$(nproc) Image dtbs modules

编译产物主要是arch/arm64/boot/Image(内核镜像)和arch/arm64/boot/dts/ti/目录下对应的.dtb文件(设备树二进制)。

3. 根文件系统构建:如果你使用Yocto,这是一个相对复杂但高度定制化的过程,需要按照飞凌提供的手册,在build/conf/local.conf中定制软件包。更快捷的方式是使用飞凌预编译的Debian根文件系统,然后通过chroot或直接在目标板上用apt安装你需要的软件,如Python3、ROS2、自定义的运动控制库等。

4. 镜像打包:最后,需要将U-Boot、内核、设备树和根文件系统打包成可供SD卡或eMMC烧写的完整镜像。飞凌通常会提供打包脚本(如mkimage.sh)。你需要根据脚本说明,指定各个组件的路径。最终会生成一个.img文件,使用dd命令或飞凌提供的烧写工具即可烧录到存储介质。

实操心得:第一次编译建议先使用飞凌提供的默认配置和预编译镜像,让系统成功跑起来。然后再逐步尝试自定义内核和文件系统。编译内核时,如果遇到驱动问题,最快捷的排查方式是去内核源码目录的Documentation/devicetree/bindings/下查找对应驱动的文档,并核对设备树节点配置是否正确。另外,务必做好每次成功配置的备份(.config文件)。

4. 实时运动控制功能的实现与编程

4.1 PRU-ICSSG的编程与使用

PRU是发挥FET6254-C实时性能的关键。编程PRU通常有两种方式:

方式一:使用RPMsg(Remote Processor Messaging)在Linux用户空间控制这是较新的、更易用的方式。Linux内核中的PRU-RPROC驱动将PRU核心作为远程处理器进行管理。我们可以在A53上运行的Linux应用中,通过RPMsg字符设备(/dev/rpmsg_pru30等)与运行在PRU上的固件进行通信。PRU的固件可以用C语言编写,使用TI提供的PRU C Compilerpru-gcc)进行编译。 基本流程:

  1. 编写PRU端的C代码(例如pru_encoder.pru0.c),实现高速IO读取或PWM生成。
  2. 使用pru-gcc编译生成.out文件。
  3. 在Linux应用端,通过打开RPMsg设备文件,读写数据来向PRU发送指令或获取数据。 这种方式将复杂的实时逻辑封装在PRU固件中,而应用层只需进行简单的数据交换,适合逻辑固定的实时任务。

方式二:使用libpruio或类似库有些第三方库对PRU的访问进行了更高层次的封装。例如,libpruio提供了直接从用户空间配置和控制PRU IO、ADC、PWM等功能的能力,无需编写单独的PRU固件,对于快速原型开发非常友好。

一个简单的PWM生成示例(概念性代码): 假设我们要用PRU生成一个固定占空比的PWM波。 在PRU固件中(简化):

// pru_pwm.pru0.c #include <stdint.h> #include <pru_ctrl.h> #include <pru_intc.h> volatile register uint32_t __R30; // 输出寄存器 volatile register uint32_t __R31; // 输入寄存器 void main(void) { uint32_t high_time = 100; // 高电平周期计数 uint32_t period = 200; // 总周期计数 uint32_t counter = 0; while(1) { if(counter < high_time) { __R30 |= (1 << 0); // 设置某个GPIO为高(假设接在bit0) } else { __R30 &= ~(1 << 0); // 设置为低 } counter++; if(counter >= period) { counter = 0; } __delay_cycles(100); // 每个计数延迟一定时钟周期,控制频率 } }

在Linux应用端,只需要加载固件并启动PRU即可,PWM波会由PRU硬件实时生成,不受Linux系统调度影响。

4.2 Cortex-M4F核的RTOS应用开发

对于更复杂的实时控制算法,如多轴插补、自适应PID,可以在Cortex-M4F核上运行FreeRTOS。TI提供了完整的MCU+SDK,包含驱动程序、RTOS内核和中间件。

开发环境通常使用Code Composer Studio (CCS) 或 TI Clang Compiler Tools。关键步骤包括:

  1. 创建工程:基于AM62x M4F的示例工程创建。
  2. 配置SysConfig:这是一个图形化工具,用于配置引脚复用、时钟、外设(如PWM、QEP、ADC)的初始化代码,非常直观,能避免底层寄存器配置错误。
  3. 编写任务:在FreeRTOS中创建不同优先级的任务。例如,创建一个高优先级任务运行1kHz的PID控制环,一个中优先级任务处理与A核的通信(通过RPMsg或共享内存),一个低优先级任务进行状态监控。
  4. 核间通信:M4F与A53之间可以通过RPMsgMailbox或共享内存(OCRAM)进行数据交换。这是实现“大脑”与“小脑”协同的关键。

经验分享:将运动控制的核心算法(位置环、速度环)放在M4F上,而将轨迹规划、模式切换等逻辑放在A53的Linux上。这样,即使Linux应用因故卡顿或重启,M4F也能保持电机在最后一个有效指令下的稳定运行(例如保持位置或速度),极大地提高了系统的安全性和可靠性。这种“Linux负责智能,RTOS负责可靠”的分层设计模式,在实践中非常有效。

4.3 工业以太网协议栈集成

若需要使用EtherCAT等协议,TI的PRU-ICSSG驱动已经为多种协议提供了底层支持。集成工作主要分为两部分:

  1. 内核驱动与固件:确保内核配置中启用了对应的协议驱动(如CONFIG_ETHERNETCONFIG_TI_ICSSG_PRUETH以及EtherCAT主站驱动,如CONFIG_EC_MASTER如果使用IgH EtherCAT Master)。同时,需要将对应的PRU固件(.out文件)加载到PRU中。这些固件通常由协议栈提供商或TI/飞凌提供。

  2. 用户空间协议栈:以开源的IgH EtherCAT Master为例,需要在Linux上编译安装其用户态工具和库。然后编写或配置XML设备描述文件(ESI),来描述网络中连接的伺服驱动器、IO模块等从站设备。最后,编写自己的控制应用程序,通过IgH提供的库函数来读写从站的PDO(过程数据对象)和SDO(服务数据对象),实现周期性的数据交换和控制。

踩坑记录:工业以太网的调试是个细致活。务必使用支持协议分析的交换机或抓包工具(如Wireshark),从物理链路、链路层、协议层一步步排查。常见的坑包括:网线质量问题、从站EEPROM配置错误、PDO映射不匹配、同步时钟未正确建立等。建议先连接一个简单的从站(如数字量IO模块)进行测试,成功后再接入复杂的伺服驱动器。

5. 系统集成调试与性能优化要点

5.1 启动流程与调试接口

FET6254-C核心板通常通过USB转串口线与PC连接,用于查看启动日志(U-Boot和Linux内核的打印信息)。串口配置一般为115200 8N1。这是最基础也是最重要的调试手段。在U-Boot阶段,可以中断启动,进行环境变量设置、内存测试、网络加载镜像等操作。

更高级的调试需要使用JTAG接口。通过XDS系列仿真器连接核心板的JTAG口,可以在CCS中对A53、M4F甚至PRU进行源码级调试、设置断点、查看内存和寄存器。这对于深入排查复杂的核间通信问题和实时任务调度问题不可或缺。

5.2 实时性测试与优化

系统搭建好后,需要量化其实时性能。以下是一些测试方法:

  • Linux内核延迟测试:使用cyclictest工具。在A核Linux下运行cyclictest -t -p 99 -n -i 1000 -l 10000,可以测试线程唤醒的延迟。如果应用了PREEMPT_RT补丁,延迟可以控制在几十微秒以内。
  • PRU/M4F任务执行时间测试:在PRU或M4F的代码中,用GPIO引脚输出脉冲来标记任务的开始和结束,然后用示波器测量脉冲宽度,即可得到最精确的任务执行时间。确保最坏情况下的执行时间(WCET)小于你的控制周期。
  • EtherCAT通信抖动测试:使用EtherCAT主站提供的诊断工具,查看帧循环周期(Cycle Time)的抖动(Jitter)。高性能系统的抖动应小于循环周期的1%。

优化建议

  1. CPU隔离:使用isolcpus内核启动参数,将某个或某几个CPU核心(例如一个A53核心)隔离出来,专门运行你的关键实时Linux进程(如果存在),避免被其他进程或内核任务打扰。
  2. 中断亲和性:将运动控制相关的外设中断(如EtherCAT、QEP)绑定到特定的CPU核心上,减少中断处理在不同核心间迁移带来的缓存失效和延迟。
  3. 内存与缓存:为M4F和PRU使用的关键数据缓冲区(如与A核共享的传感器数据、控制指令)配置为非缓存(Non-cacheable)或写回(Write-back)模式,避免缓存一致性操作引入的不确定性延迟。
  4. 电源管理:关闭不必要的CPU省电特性(如C-states和动态调频DVFS),虽然会增加一些功耗,但能保证计算延迟的稳定性。

5.3 稳定性与可靠性设计

工业环境要求设备7x24小时稳定运行。

  • 看门狗:充分利用AM62x的内部看门狗。为A53 Linux、M4F RTOS分别配置看门狗。在Linux中,可以编写一个守护进程定期喂狗;在M4F中,在空闲任务或低优先级监控任务中喂狗。一旦某个核心死机,看门狗复位可以触发整个芯片重启,恢复系统。
  • 温度监控:AM62x内部有温度传感器。可以在Linux下编写脚本周期性读取/sys/class/thermal/thermal_zone*/temp,如果温度过高,则触发报警或主动降低负载(如限制电机电流)。
  • EMC与信号完整性:虽然核心板本身经过设计,但在设计载板时,对电机驱动电源、数字电源、模拟信号要做好隔离和滤波。电机动力线与信号线分开走线,必要时使用磁环、屏蔽线。PRU控制的高速IO线,走线要尽量短,并做好阻抗控制。

6. 常见问题排查与实战经验汇总

在实际开发中,总会遇到各种奇怪的问题。这里汇总一些典型场景和解决思路:

问题现象可能原因排查步骤与解决方案
系统无法启动,串口无输出1. 电源问题(电压/电流不足)
2. 启动介质错误(SD/eMMC镜像损坏)
3. 启动模式引脚配置错误
1. 用万用表测量核心板各电源输入引脚电压是否稳定且在规格范围内。
2. 重新烧写镜像,确保烧写工具和过程正确。
3. 查阅核心板手册,确认启动模式选择引脚(BOOTMODE)的上拉/下拉电阻配置是否正确。
Linux内核启动卡住1. 设备树不匹配
2. 内核驱动崩溃
3. 文件系统损坏或找不到
1. 观察串口打印,卡在哪个驱动初始化阶段。核对设备树中该外设的节点配置与硬件是否一致。
2. 尝试使用最简内核配置(去除不必要的驱动)启动。
3. 检查启动参数(bootargs)中的root=是否正确指向根文件系统所在分区。
PRU程序无法加载或运行1. PRU固件格式或加载地址错误
2. 设备树中PRU节点未启用或配置错误
3. PRU时钟或电源域未打开
1. 使用hexpru或相关工具确认固件格式正确。检查U-Boot或Linux加载固件到PRU内存的地址是否正确。
2. 检查设备树中pruss节点状态是否为okaypruss-mem内存区域定义是否正确。
3. 检查内核启动日志,确认PRU相关时钟和电源管理域是否成功使能。
EtherCAT链路无法建立1. 物理链路不通
2. PRU以太网固件未加载
3. 主站与从站配置不匹配
1. 检查网线、交换机。用ethtool命令查看网口链路状态。
2. 使用lsmod查看prussti_icssg_prueth等驱动是否加载。检查/sys/class/remoteproc/下是否有PRU设备,并尝试手动启动。
3. 核对从站EEPROM中的Vendor ID, Product Code是否与主站XML文件一致。检查网络拓扑和DC同步时钟配置。
控制周期出现偶发性抖动1. Linux系统负载过高,抢占实时任务
2. 中断风暴或共享资源竞争
3. 缓存一致性操作
1. 使用tophtop查看CPU占用。使用cyclictest测试基准延迟。考虑使用CPU隔离和实时优先级(SCHED_FIFO)。
2. 使用ftraceperf工具分析中断和调度事件。检查是否有其他进程或中断频繁操作与实时任务共享的内存或外设。
3. 确保M4F/PRU与A53共享的关键数据区配置了正确的缓存属性(如CMA区域或手动设置non-cacheable)。

最后的个人体会:FET6254-C这类多核异构处理器,为智能运动控制打开了一扇新的大门。它最大的价值在于将高性能应用处理、硬实时控制和工业通信无缝地集成在单一芯片上,极大地简化了系统架构。然而,其开发复杂度也高于传统的单一平台。成功的秘诀在于清晰的架构划分:什么任务放A核,什么任务放M核,什么任务放PRU,并且设计好高效、可靠的核间通信机制。初期多花时间在框架搭建和基础测试上,后期开发和调试效率会成倍提升。这块板子的潜力,远不止于运动控制,在边缘AI计算、机器视觉、复合型物联网网关等领域,同样大有可为。关键在于,你是否能驾驭好它内部那颗“三心二意”的强大芯片。

http://www.jsqmd.com/news/830332/

相关文章:

  • 【Claude API企业级接入黄金标准】:20年AI架构师亲授5大避坑指南与3步上线法
  • 2026年呼叫中心等保合规收紧:厂商怎么选,企业怎么准备 - 品牌2025
  • WELearn网课助手:5分钟告别熬夜刷课,实现高效学习自由的终极指南
  • 5分钟掌握TurboWarp Packager:将Scratch项目打包为跨平台可执行文件的终极指南
  • VMware Workstation 16.2 安装 Win11 避坑全记录:绕过TPM限制与虚拟机加密那些事儿
  • Pearcleaner终极指南:如何彻底清理Mac应用残留,释放宝贵存储空间?
  • 深度解析DS4Windows:让PS4手柄在Windows平台重获新生
  • 基于大语言模型的学术论文AI阅读助手:从PDF解析到智能问答全流程解析
  • 嵌入式C语言编码规范:从可读性到稳定性的工程实践指南
  • 别再只写静态标记点了!用uniapp map组件打造一个带实时定位与气泡交互的‘周边服务发现’页面
  • ANNA框架:构建AI原生应用的智能体开发指南
  • 2026年南京AI推广公司实测评测:多维度对比选型全指南 - 奔跑123
  • 工控一体机性能特征解析:从环境适应性到接口扩展的工业标准
  • 通过curl命令直接测试Taotoken聊天补全接口的配置与调用
  • GPT4ALL-collector:自动化构建高质量指令微调数据集的实战指南
  • AI赋能Anki:基于LLM与Prompt工程的智能制卡技能全解析
  • 高分七号光学影像预处理实战:从原始数据到0.65米融合影像
  • 国产多模态大模型“看图说话”指南:原理、应用与未来
  • 书成紫微动,律定凤凰驯:对比臆想歪解,铁哥的天然契合才是真天命
  • 终极Windows多任务解决方案:悬浮透明浏览器如何提升300%工作效率?
  • 保姆级教程:在Ubuntu 20.04上从源码编译运行HKUST的GVINS(含ROS Noetic环境配置)
  • 保姆级教程:为Ultralytics YOLOv8 v8.0+ 添加mAP75和mAP90输出(附完整代码与验证方法)
  • Midjourney Ash印相实战手册(从灰阶分离到银盐颗粒模拟:工业级输出标准首次解密)
  • 从零构建高性能内存键值存储:Memvault架构设计与实现详解
  • Cocos Creator无法识别Android SDK
  • 【权威实测】ElevenLabs匈牙利语发音准确率仅83.7%?我们用CEFR B2-C1语料库做了276次压力测试
  • 开源AI助手框架ANNA:模块化设计与生产部署实战
  • VisualCppRedist AIO:一站式解决Windows系统依赖问题的开源神器
  • 光通信风口已至:芯片巨头加码,产业链满产满销,光进铜退成必然趋势?
  • 【VCS】(6)Code Coverage:从覆盖率收集到报告生成的全流程实战