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

正点原子 STM32MP257 同构多核架构下的 ADC 电压采集与处理应用开发实战

在嵌入式系统中ADC模拟电压的读取是常见的需求。如何高效、并发、且可控地完成数据采集与处理本篇文章通过双线程分别绑定在 Linux 系统的不同 CPU 核心上采集 /sys/bus/iio 接口的 ADC 原始值与缩放系数 scale并在另一个核上计算真实电压值适用于高性能、低延迟的工业控制场景。正点原子STM32MP257开发板 ARM嵌入式Linux异核A35M33 AI工控正点原子 STM32MP257 同构多核架构下的 ADC 电压采集与处理应用开发实战一、背景介绍为什么要用多核并发读取ADC二、系统架构与源码解析1、数据采集线程CPU02、数据处理线程CPU13、两线程同步机制4、完整代码及使用方法1.完整代码展示2.使用方法三、应用场景与实际部署建议1、工业自动化控制2、边缘AI与信号预处理3、多任务实时系统调度四、测试效果与输出示例五、总结与拓展建议一、背景介绍为什么要用多核并发读取ADC在嵌入式 Linux 平台如 STM32MP257、i.MX93 等中我们常使用工业级 ADC 进行传感器数据采集。通过内核 IIO 子系统用户可以在 /sys/bus/iio/devices/iio:deviceX/ 目录下读取原始电压值和电压缩放因子scale从而计算出真实电压。而本项目的设计目标是实现采集线程 处理线程分核运行充分利用 A核多核系统的资源提高数据采集实时性降低主线程阻塞风险。二、系统架构与源码解析该项目通过两个线程分别运行在 CPU0 和 CPU1线程间通过互斥锁和条件变量进行数据同步1、数据采集线程CPU0绑定在 CPU0定时读取原始 ADC值/sys/bus/iio/devices/iio:device0/in_voltage15_raw缩放系数/sys/bus/iio/devices/iio:device0/in_voltage_scale通过共享内存区 shared_data 和 shared_scale将数据传给处理线程intvalread_sysfs_int(SYSFS_ADC_PATH);floatscaleread_sysfs_float(SYSFS_ADC_SCALE);shared_dataval;shared_scalescale;2、数据处理线程CPU1绑定在 CPU1阻塞等待数据更新信号计算真实电压voltage val × scale × 0.001可拓展滤波、特征提取、阈值报警等算法处理floatvoltageval*scale*0.001;printf(处理线程: 处理 %d × %.6f x 0.001 %.2f V\n,val,scale,voltage);3、两线程同步机制使用 pthread_mutex_t 和 pthread_cond_t 进行数据同步确保线程安全。data_ready 标志位控制数据更新通知。4、完整代码及使用方法1.完整代码展示#define_GNU_SOURCE#includestdio.h#includestdlib.h#includeunistd.h#includepthread.h#includefcntl.h#includestring.h#includeerrno.h#includesched.h#defineSYSFS_ADC_PATH/sys/bus/iio/devices/iio:device0/in_voltage15_raw#defineSYSFS_ADC_SCALE/sys/bus/iio/devices/iio:device0/in_voltage_scale#defineACQ_INTERVAL_US500000// 500 msstaticintshared_data0;staticfloatshared_scale0.0f;staticintdata_ready0;staticpthread_mutex_tdata_lockPTHREAD_MUTEX_INITIALIZER;staticpthread_cond_tdata_condPTHREAD_COND_INITIALIZER;staticvoidbind_thread_to_cpu(pthread_ttid,intcpu){cpu_set_tcpuset;CPU_ZERO(cpuset);CPU_SET(cpu,cpuset);if(pthread_setaffinity_np(tid,sizeof(cpuset),cpuset)!0){fprintf(stderr,警告无法将线程绑定到 CPU%d: %s\n,cpu,strerror(errno));}}staticintread_sysfs_int(constchar*path){intfdopen(path,O_RDONLY);if(fd0)return-1;charbuf[32];ssize_tlenread(fd,buf,sizeof(buf)-1);close(fd);if(len0)return-1;buf[len]\0;returnatoi(buf);}staticfloatread_sysfs_float(constchar*path){intfdopen(path,O_RDONLY);if(fd0)return-1.0f;charbuf[32];ssize_tlenread(fd,buf,sizeof(buf)-1);close(fd);if(len0)return-1.0f;buf[len]\0;returnatof(buf);}staticvoid*acquisition_thread(void*arg){pthread_ttidpthread_self();bind_thread_to_cpu(tid,0);printf(采集线程绑定到 CPU0\n);while(1){intvalread_sysfs_int(SYSFS_ADC_PATH);floatscaleread_sysfs_float(SYSFS_ADC_SCALE);if(val0||scale0){perror(读取ADC或Scale失败);usleep(ACQ_INTERVAL_US);continue;}pthread_mutex_lock(data_lock);shared_dataval;shared_scalescale;data_ready1;pthread_cond_signal(data_cond);pthread_mutex_unlock(data_lock);printf(采集线程: 原始值%d, scale%.6f\n,val,scale);usleep(ACQ_INTERVAL_US);}returnNULL;}staticvoid*processing_thread(void*arg){pthread_ttidpthread_self();bind_thread_to_cpu(tid,1);printf(处理线程绑定到 CPU1\n);while(1){pthread_mutex_lock(data_lock);while(!data_ready){pthread_cond_wait(data_cond,data_lock);}intvalshared_data;floatscaleshared_scale;data_ready0;pthread_mutex_unlock(data_lock);floatvoltageval*scale*0.001;printf(处理线程: 处理 %d × %.6f x 0.001 %.2f V\n,val,scale,voltage);}returnNULL;}intmain(intargc,char*argv[]){pthread_ttid_acq,tid_proc;intret;retpthread_create(tid_acq,NULL,acquisition_thread,NULL);if(ret){fprintf(stderr,创建采集线程失败: %s\n,strerror(ret));return1;}retpthread_create(tid_proc,NULL,processing_thread,NULL);if(ret){fprintf(stderr,创建处理线程失败: %s\n,strerror(ret));return1;}pthread_join(tid_acq,NULL);pthread_join(tid_proc,NULL);return0;}2.使用方法将以上代码编辑为adc_app.c文件在 ubuntu 系统里使用以下命令交叉编译为可执行文件即可source/opt/st/stm32mp2/5.0.3-snapshot/environment-setup-cortexa35-ostl-linux${CC}-oadc_app adc_app.c最终生成的adc_app文件就是我们需要放到STM32MP257文件系统里的可执行文件。注意事项在STM32MP257的百度资料网盘里已经提供了交叉编译工具链的安装脚本文件路径是“STM32MP257开发板\05、开发工具\01、出厂系统交叉编译器”请大家可以自行去下载使用。atk-image-openstlinux-weston-stm32mp2.rootfs-x86_64-toolchain-5.0.3-snapshot-20250115-v1.0三、应用场景与实际部署建议本方案适用于以下典型场景1、工业自动化控制实时读取传感器电压信号如压力、温湿度、光强等多核处理确保主线程响应不中断电压计算后可直接用于闭环 PID 控制逻辑2、边缘AI与信号预处理采集模拟数据后可直接进行数字滤波、傅里叶变换等前处理数据处理线程也可通过 RPMsg 发送到 Cortex-M33 协处理核做进一步处理3、多任务实时系统调度多核绑定可防止线程“漂移”适用于带有调度器的 RT-PREEMPT 系统强化线程的确定性和性能隔离四、测试效果与输出示例运行后终端将周期性打印如下信息说明in_voltage15_raw 4095 表示ADC原始数值scale 0.439453 mV/LSB 是 ADC 的电压精度最终电压 4095* 0.439453 * 0.001 ≈ 1.8V执行 adc_app 可执行文件后我们用 ssh 打开 STM32MP257 的新终端用以下指令可以查看 这个例程的调用 cpu 使用情况top-H-p$(pidof adc_app)通过终端显示的消息可以看到 adc_app 主线程在 CPU1 里使用采集数据 和 处理数据的线程 分别在 CPU0 和 CPU1 里分别使用。五、总结与拓展建议通过绑定线程至特定 CPU 核心并使用条件变量进行线程同步我们实现了一个低延迟、高稳定性的 ADC 电压采集处理方案。它可轻松适配到任意支持 Linux 的 ARM 多核平台推荐用于工业控制、信号处理、边缘AI等高实时场景。后续可以拓展将数据通过 Socket/UDP/CanOpen 发送写入共享内存供 GUI 使用增加多通道采集与 Cortex-M 核通信RPMsg如果你也在做 STM32MP257 / i.MX93 / RK3588 等平台的异构核协同处理不妨试试这种方案有问题欢迎评论区一起探讨交流

相关文章:

正点原子 STM32MP257 同构多核架构下的 ADC 电压采集与处理应用开发实战

在嵌入式系统中,ADC模拟电压的读取是常见的需求。如何高效、并发、且可控地完成数据采集与处理?本篇文章通过双线程分别绑定在 Linux 系统的不同 CPU 核心上,采集 /sys/bus/iio 接口的 ADC 原始值与缩放系数 scale,并在另一个核上…...

终极指南:如何使用Azure Quickstart Templates实现成本管理与预算警报

终极指南:如何使用Azure Quickstart Templates实现成本管理与预算警报 【免费下载链接】azure-quickstart-templates Azure Quickstart Templates 项目地址: https://gitcode.com/gh_mirrors/az/azure-quickstart-templates Azure Quickstart Templates是微软…...

NomNom终极指南:3个技巧让你轻松掌控《无人深空》存档

NomNom终极指南:3个技巧让你轻松掌控《无人深空》存档 【免费下载链接】NomNom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each item indi…...

超完整Azure游戏开发模板:游戏服务器架构终极指南

超完整Azure游戏开发模板:游戏服务器架构终极指南 【免费下载链接】azure-quickstart-templates Azure Quickstart Templates 项目地址: https://gitcode.com/gh_mirrors/az/azure-quickstart-templates Azure Quickstart Templates是微软提供的开源项目&…...

利用taotoken模型广场为ai应用快速进行模型选型与测试

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用Taotoken模型广场为AI应用快速进行模型选型与测试 在构建一个需要集成多种AI能力的应用时,开发者面临的首要挑战往…...

Linux操作系统软件编程——多线程

什么是线程线程的定义是轻量级的进程,可以实现多任务的并发。线程是操作系统任务调度的最小单位,一个进程至少有一个线程线程的创建由某个进程创建,且进程创建线程时,会为其分配独立的栈区空间(默认8M)。线…...

三阶段掌握罗技鼠标压枪宏:从新手到精准射击的完整指南

三阶段掌握罗技鼠标压枪宏:从新手到精准射击的完整指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在绝地求生中遇到过这样…...

软银携手DeltaX建储能基地,2027年量产应对AI算力电力挑战

软银与DeltaX合作:储能系统建设的新布局品玩5月12日消息,据The Elec报道,软银集团选定韩国初创公司DeltaX,负责在日本大阪建设数据中心储能系统(ESS)的开发与制造。双方计划于今年下半年在大阪堺市原夏普工…...

GitHub 代码提交常见问题及解决指南

摘要本文聚焦 GitHub 代码提交流程,围绕本地文件上传、远程仓库关联、分支推送等核心操作,梳理常见报错(如可疑所有权、分支不匹配、协议不支持等),解析错误成因并提供分步解决方法,覆盖 Git 命令执行、仓库…...

告别预装旧版Demo:详解mmWave SDK两种刷写模式(Demonstration vs. CCS Development)及适用场景

告别预装旧版Demo:详解mmWave SDK两种刷写模式(Demonstration vs. CCS Development)及适用场景 当你第一次拿到毫米波雷达评估模块(EVM)时,预装的Demo固件可能已经过时半年甚至更久。这时候你会面临一个关键…...

Taotoken提供的审计日志功能如何满足企业级安全与合规需求

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken提供的审计日志功能如何满足企业级安全与合规需求 1. 企业引入大模型能力后的审计挑战 当企业将大模型API能力整合到内部…...

HealthGPT入门教程:5分钟快速搭建你的个人健康助手

HealthGPT入门教程:5分钟快速搭建你的个人健康助手 【免费下载链接】HealthGPT Query your Apple Health data with natural language 💬 🩺 项目地址: https://gitcode.com/gh_mirrors/he/HealthGPT 想要用自然语言查询你的Apple健康…...

在自动化客服场景中利用Taotoken实现多模型智能路由

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在自动化客服场景中利用Taotoken实现多模型智能路由 对于构建智能客服系统的产品团队而言,核心挑战之一是如何在保证服…...

那些被“写不动“耽误的好想法,现在可以试了

脑子里的想法永远比手头的代码多。想做一个新的仲裁逻辑,想验证一种不同的流水线划分,想试试那个"也许能行"的微架构调整——但最终都没动手,因为光是搭环境、写testbench、跑仿真这一套下来,没有一两周根本出不了结论。…...

论文降AIGC教程:从标红区到安全线,2026最新3步攻略与工具测评

今年的交稿季有一点很磨人:除了文章重复率,AIGC检测率几乎也成了各处的标配,很多小伙伴接到通知直接懵了。 我之前也有过长文盲改失败的经历:刚拿到初稿就开始一通操作,觉得把文段里面的词语换换同义词就行&#xff0…...

Flutter + 开源鸿蒙实战 | 极简记账本 Day1:项目初始化 + 底部导航框架搭建

🔥 Flutter 开源鸿蒙实战 | 极简记账本 Day1:项目初始化 底部导航框架搭建欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 系列项目:极简记账本(6 天完结)环境:Flutt…...

5分钟快速上手APK Installer:在Windows上安装Android应用的终极指南

5分钟快速上手APK Installer:在Windows上安装Android应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否想在Windows电脑上直接安装和运行…...

工业通信网络实战:从工业以太网、IO-Link到智能工厂连接架构设计

1. 项目概述:智能工厂的“神经网络”革命如果你最近参观过任何一家现代化的汽车装配线或是消费电子产品的贴片车间,可能会被那些高度协同、几乎无人干预的自动化流程所震撼。机械臂精准地抓取、焊接、组装,AGV小车沿着无形的轨道穿梭运送物料…...

DavyBot开源框架:构建智能对话机器人的模块化实践指南

1. 项目概述:一个开箱即用的智能对话机器人框架最近在折腾聊天机器人项目,发现了一个挺有意思的开源项目,叫geluzhiwei1/davybot。乍一看这个名字,可能觉得有点陌生,但如果你在GitHub上搜索过聊天机器人、智能客服或者…...

从零到一:基于C#与ArcGIS二次开发构建迎风面指数计算插件实战

1. 环境准备与工具搭建 第一次接触ArcGIS二次开发时,我被官方文档里密密麻麻的API吓得不轻。后来发现只要配好环境,开发插件比想象中简单得多。你需要准备三样东西:Visual Studio(建议2019或2022社区版)、ArcGIS Desk…...

LibreHardwareMonitor:你的电脑健康管家,硬件监控从此无忧

LibreHardwareMonitor:你的电脑健康管家,硬件监控从此无忧 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer…...

终极免费PDF转SVG工具:简单3步完成高质量转换

终极免费PDF转SVG工具:简单3步完成高质量转换 【免费下载链接】pdf2svg A simple PDF to SVG converter using the Poppler and Cairo libraries 项目地址: https://gitcode.com/gh_mirrors/pd/pdf2svg 在当今数字化时代,PDF转SVG已成为设计师、开…...

小白程序员必看:收藏这份AI黑话指南,轻松入门大模型世界!

本文用大白话解释了AI领域几个核心概念:AI是总称,LLM是推理模型,Agent能独立执行任务,MCP是标准化接口,Skills是技能包。文章通过生活化比喻和实例,帮助读者理解这些概念如何协同工作,实现高效自…...

Hermes Agent 可视化监控与文档生成工具 hermes-dashboard 详解

1. 项目概述与核心价值如果你正在使用 Hermes Agent 进行 AI 智能体开发,或者对 Agent 的内部运行状态感到好奇,那么你很可能需要一个“上帝视角”。hermes-dashboard正是这样一个工具,它为你提供了一个实时的监控仪表盘和一个自动生成的、可…...

通过 curl 命令在 Ubuntu 终端快速测试 Taotoken 的 API 连通性

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过 curl 命令在 Ubuntu 终端快速测试 Taotoken 的 API 连通性 在服务器或容器环境中进行开发或部署时,直接使用 curl…...

DreamBooth实战案例:从人物肖像到艺术风格的完整训练过程

DreamBooth实战案例:从人物肖像到艺术风格的完整训练过程 【免费下载链接】sd_dreambooth_extension 项目地址: https://gitcode.com/gh_mirrors/sd/sd_dreambooth_extension DreamBooth是一款强大的AI模型训练工具,能够让你通过少量图片快速定制…...

Cursor Pro激活器:终极解决方案告别API限制,实现无限免费使用

Cursor Pro激活器:终极解决方案告别API限制,实现无限免费使用 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youv…...

AI代理技术如何赋能新生儿护理:从数据记录到个性化模式学习

1. 项目概述:当AI成为新手父母的“第二大脑”孩子出生的头三个月,被无数过来人称为“生存模式”。这不是夸张。在那些昼夜颠倒、睡眠被切割成碎片、大脑因极度疲惫而停摆的日子里,新手父母面对的不仅仅是新生儿的啼哭,更是一场信息…...

使用Taotoken后如何清晰观测API用量与成本变化

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken后如何清晰观测API用量与成本变化 对于团队管理者或开发者而言,将大模型能力集成到产品中后,资…...

当1000A牵引电流遇上微安级信号:高铁轨道电路中扼流变压器的‘抗干扰’实战解析

高铁轨道电路中扼流变压器的抗干扰设计与工程实践 电气化铁路的轨道电路系统面临着前所未有的电磁兼容挑战——如何在承载1000A级牵引电流的钢轨上,同时可靠传输微安级的信号电流?这个看似矛盾的需求,正是现代高铁信号系统设计的核心难题之一…...