#申请原创# 目前先后用过 ESP32、STM32H7 双核芯片做 IoT 设备与工业伺服采集板,前期踩过不少资源浪费的坑,很长一段时间直接单核跑完全部业务,另一颗内核全程闲置,直到多任务负载飙升、实时性不达标,才认真做多核任务划分,这里分享落地经验与踩坑教训。
最开始开发图省事,所有采集、电机 FOC、串口通讯、OTA 升级、人机触控逻辑全部丢给主核,副核仅初始化后空循环休眠,多核硬件完全没有利用。设备低负载时看不出问题,一旦同时开启多通道 ADC 采样、EtherCAT 报文收发、无线数据上传,主核任务堆积,出现指令响应延迟、触控卡顿,只能被迫重构代码拆分双核业务。
任务划分遵循实时业务与非实时业务隔离原则:主核承担硬实时任务,电机控制 PWM 中断、高速 ADC 采样、总线报文解析、紧急故障保护等高优先级逻辑全部放在这里,保障运动控制、设备保护无延迟;副核处理低实时后台业务,包含蓝牙 / WiFi 无线交互、日志存储、OTA 固件升级、触控界面刷新、上位机数据打包上报。
核间通信选用芯片自带 Mailbox 搭配小块受保护共享内存,不使用复杂 RPC 框架,降低调度开销。主核计算出电机力矩、位置数据后,通过 Mailbox 发送通知信号,副核读取共享内存缓存的数据打包上传;副核收到手机远程调速指令时,同样通过邮箱同步参数给主核执行闭环调节,全程加互斥锁防止数据读写冲突。
负载均衡是多核开发的重中之重,我采用定时统计各内核 CPU 占用率的方式动态评估,一旦某一内核负载长期超过 85%,就拆分部分轻量任务移交另一内核。同时兼顾功耗策略:设备待机时,无任务的内核进入深度休眠,仅保留唤醒中断,避免双核同时高频运行拉高整机功耗。
调试阶段遇到过典型翻车事故:最初未加互斥锁,双核同时读写共享内存内的电机参数,出现数据错乱,机械臂运行轨迹偏移、抖动严重;还有一次 Mailbox 消息队列溢出,核间指令丢失,远程启停功能间歇性失效,排查两天才定位到消息无上限缓存的问题。也曾试过嫌多核调试工具复杂、同步逻辑难维护,一度打算简化方案退回单核,但单核算力无法满足多轴同步实时性要求,只能优化同步机制坚持多核架构。
对比不同芯片开发体验:ESP32 双核架构轻量化,适合消费 IoT 产品,Mailbox 接口简单上手快;STM32H7 异构双核算力差距更大,需要严格区分强实时与普通任务;i.MX RT 多核适合复杂人机界面加工业控制复合设备。
总结下来,多核 MCU 绝不是简单叠加两颗单核,合理的任务隔离、高效低延迟核间通信、完善的资源互斥保护缺一不可。如果只是简单小型设备、任务量极低,单核开发更省事;但凡同时存在硬实时控制与大量后台交互业务,必须充分拆分双核负载,才能发挥多核芯片的算力优势,规避卡顿、数据错乱等工程问题。
|
|