如何实现多线程检测传感器的值

顾小白xx 2021-01-06 10:24:32
现在有一个这样的问题,我要做一个插件,这个插件的功能是在主程序执行到某一个步骤的时候会使用wm_copydata消息发送一个通知,然后我这边接受到通知以后开始执行业务逻辑,检测设备的传感器的值。主程序是有12个线程每个线程相当于一个通道,这个12个通道可能同时发送消息也可能不同时发送,所以我要区分是哪个进程发送的然后检测哪个传感器的值,请问这样的场景需不需要线程池来做,这个对实时性要求还是比较高的。最好能提供一下思路。
...全文
259 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yshuise 2021-01-18
  • 打赏
  • 举报
回复
每个线程设定一个标记,async返回一个future,就可以知道是哪个线程了
顾小白xx 2021-01-18
  • 打赏
  • 举报
回复
引用 3 楼 赵4老师 的回复:
你无法精确控制线程执行的时间。 除非 用硬中断控制线程启动 或 单个线程中加锁后,依此执行原来多个线程完成的任务,再解锁。
赵老师 ,假如A 有12个线程给B发送一个事件每个事件都会告诉B是哪个子线程发送的,B接收到以后要按照A 的发送顺序启动对应的线程来执行任务,这种情况B的线程改如何创建,直接创建12个线程吗。还是可以12个线程可以使用一个处理函数呢
赵4老师 2021-01-07
  • 打赏
  • 举报
回复
你无法精确控制线程执行的时间。 除非 用硬中断控制线程启动 或 单个线程中加锁后,依此执行原来多个线程完成的任务,再解锁。
顾小白xx 2021-01-06
  • 打赏
  • 举报
回复
主要是不知道怎么控制这个12个线程,因为每个线程开启和关闭的时间不一样,而且最好能精确控制线程执行的时间所以,有点懵。
赵4老师 2021-01-06
  • 打赏
  • 举报
回复
12个线程还不至于要用线程池。
【RT-Thread作品秀】家庭医用多功能检测仪作者:李元江 概述背景随着人们生活水平不断提高,人们越来越注重身心健康。现在家用型的医用检查仪器太少,很多人想要检查一些简单的项目,也要专门去医院检查,这样很不方便。普通的家用医用型检查仪器,功能简单,缺少智能性。所以智能家庭医用多功能检测仪器是很有需要的。 功能实时时间显示 网络时间获取、自动对时 天气情况获取、显示 显示室内温度、气压 检测心率、血氧浓度,检测时可以实时查看心率变化。 开发环境硬件:APT-Pi V1.5 、ESP32-01S 、LPS22HH 、MAX30102 、4.3寸触摸屏(480*272) RT-Thread版本:V4.0.2 开发工具及版本:RT_Thread StudioV1.1.5 RT-Thread使用情况概述内核部分: 任务调度,本软件设计五个执行线程,分别为Main线程、RTC线程、LPS22HH线程、MAX30102线程、TouchGFX线程。 组件部分: Finsh、C++、libc、i2c框架。 C++,i2c在移植TouchGFX需要使用到。 软件包部分: cJson、gt9147 通过cJson解析从网络上获取到的天气数据。 触摸屏触摸芯片为gt9147,所以需要gt9147软件包。 库部分: TouchGFX库 GUI界面显示框架。 硬件框架该设计硬件大体有五大部分:主控、触摸屏、wifi模块、温度传感器、心率血氧传感器。它们的连接框图如下图所示。 主控板使用的是ART_Pi。 触摸屏使用RGB888和I2C接口与主控板进行连接,触摸屏芯片为GT9147。 温度传感器使用的是LSP22HH,LSP22HH是一款兼容IIC和SPI接口的芯片,能够采集温度和气压,这里使用使用SPI与主控板进行通信。 心率血氧传感器使用的是MAX30102,主要通过IIC接口与主控板进行通信,INT中断输出引脚与主控GPIO进行连接,主控可以根据INT信号,判断数据是否可读。 Wifi模块使用的是ESP32-01S,ART_Pi自带有Wifi模块但是最近没有时间去研究该自带模块该怎么去使用,所以先使用ESP32-01S进行开发。ESP32-01S主要使用UART串口与主控板进行通信。主控板的两个GPIO口与ESP32-01S的CH_PD和RST连接。CH_PD是ESP32-01S的使能信号,RST是重启信号。 软件框架说明本设计使用RT_Thread进行开发,主要设计有五个执行线程,分别为Main线程、RTC线程、LPS22HH线程、MAX30102线程、TouchGFX线程。 总的软件框图如下图所示。 系统开启后,主要进行RT_Thread系统内部初始化,然后进行各个线程的调用。 软件模块说明Main线程进入Main线程后,会先通过Wifi模块获取网络时间和天气情况。这就相当于系统启动后,会先获取网络时间和天气情况,到达开机自动对时功能。之后会进入while(1)循环,在While循环中根据RefreshFlag标志位,来判断是否手动获取网络时间和天气数据。在触摸屏主界面点击刷新按钮,会置位RefreshFlag标志位,从而手动获取网络时间个天气数据。 其流程图如下所示。 RTC线程我这里没使用RT_Thread的RTC,而是自己实现了一个RTC。线程设置为每1S进入该线程,进入后,时间戳数据+1,然后通过把时间戳转化为北京时间,就可以得到时间数据。当然,这里如果长时间运行,时间偏差肯定会大,考虑到设备一般不会长时间使用,所以暂时使用该方案。 LPS22HH线程LPS22HH线程任务主要是获取温度和气压情况。刚开始进入该线程时,先进行SPI的初始化和LPS22HH传感器的初始化,然后每2S调度一次进行获取温度和气压。 其流程图如下所示。 MAX30102线程MAX30102线程任务主要是获取血氧和心率。刚进入该线程时,先进行IIC的初始化和MAX30102器件初始化。然后进入一个循环调度过程,在循环调度过程中,根据checkFlag标志位状态,来判断是否进行获取血氧和心率。CheckFlag可以在触摸屏检测界面进行置位和清零。点击第一次checkFlag置位,点击第二次chechFlag清零。 其流程图如下所示。 TouchGFX线程触摸屏GUI方面用的TouchGFX框架。为TouchGFX设置了一个循环调度线程。该线程主要包括两个任务处理,显示处理和触摸处理。显示处理主要是更新时间、温度气压情况、血氧、心率和心率曲线。触摸处理主要是进行界面更换,获取网络时间、实时天气情况,心率、血氧检测操作。 其流程图如下所示。 GUI界面GUI使用TouchGFX框架,主要设计有两个界面:主界面和检测界面。 主界面 主界面主要功能是显示时间、
概述:分布式温度监控系统基于 STM32 系类芯片开发,支持采集多达六个分节点的温度数据,网关节点收集分节点的数据并通过 WIFI 上传云端远程实时监视,也可本地连接串口与 PC 端通讯,上位机实时显示分节点数据。该系统适用于家庭、办公室、教室等小面积场所的多点温度监控,无线传输距离可达 100m ~ 500m,具有功耗低,丢包率低,传输距离远等特点,是一个相当实用的设计。 开发环境硬件:stm32f407-atk-explorer 扩展板:DS18B20数字温度传感器,NRF24L01无线射频模块,ESP8266 WIFI模块 RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:MDK 5.27 RT-Thread使用情况概述内核部分:调度器,信号量,消息队列。 调度器:创建多个线程来实现不同的工作。 信号量:用来同步线程。 消息队列:用来实现线程之间传递的数据。 组件部分:SPI框架, Sensor框架,SAL 套接字抽象层 SPI框架:使用 SPI 框架来驱动温度传感器,上层代码可以提高代码的可重用性。 Sensor框架:为上层提供统一的操作接口,提高上层代码的可重用性;简化底层驱动开发的难度,只要实现简单的 ops(operations: 操作命令) 就可以将传感器注册到系统上。 SAL套接字抽象层:组件完成对不同网络协议栈或网络实现接口的抽象并对上层提供一组标准的 BSD Socket API,这样开发者只需要关心和使用网络应用层提供的网络接口,而无需关心底层具体网络协议栈类型和实现,极大的提高了系统的兼容性,方便开发者完成协议栈的适配和网络相关的开发 软件包部分: Webclient:提供设备与 HTTP Server 的通讯的基本功能。 pahomqtt,:本软件包是在 Eclipse paho-mqtt 源码包的基础上设计的一套 MQTT 客户端程序。 Onenet:是 RT-Thread 针对 OneNET 平台连接做的的适配,通过这个软件包,可以让设备在 RT-Thread 上非常方便的连接 OneNet 平台,完成数据的发送、接收、设备的注册和控制等功能。 cJSON:C语言实现的极简的解析 JSON 格式的软件包。 at_device:是由 RT-Thread AT 组件针对不同 AT 设备的移植文件和示例代码组成,目前支持的 AT 设备有:ESP8266、M26、MC20、RW007、MW31、SIM800C 以及 SIM76XX 系列设备等。 nRF24L01:是一个 RT-Thread 的软件包,该软件包提供了 nRF24L01 模块的驱动。 硬件框架MCU 定时读取 DS180B20 的温度数据,然后通过 NRF24L01 传输到接收节点,接收节点把数据分别传输到云端和PC上位机。 软件框架说明本项目使用分布节点的方式来实现温度的采集与上传,从而避免一个节点的系统崩溃并不影响到其余的节点,本项目软件分为两部分: 第一部分:采集节点 MCU 上电之后完成板级外设初始化,并初始化温度传感器DS18B20 准备采集温度数据,无线射频芯片NRF24L01,在一切准备妥当之后,就会定时向接收节点发送温度数据。 第二部分:接收节点 MCU 上电之后首先完成板级外设的初始化,并初始化 ESP8266 实现与 ONENET 的连接。初始化 NRF24L01 准备接收来自采集节点的温度信息,接收到节点发送过来的温度数据,分别发送到 ONENET 平台和PC 端上位机。 软件模块说明发送节点: 发送节点创建了3个线程,1个消息队列 read_temp_entry:周期性的读取温度传感器,并把读取到的通过消息队列发送 nrf24l01_send_entry:使用消息队列来接收传感器检测到的温度,并通过 BRF24L01 发送到接收节点 led_shine_entry:LED 在每次发送成之后,来改变当前的状态,来检测当前系统的运行状态 接收节点: 接收节点创建了6个线程,1个信号量,1个事件集,2个ringbuff,1个邮箱,1个消息内存池 nrf24l01_receive_entry:NRF24L01 数据接收线程,正确收到数据后会发送WRITE_EVENT_P0事件,然后把数据放到 ringbuff,申请一块内存池,然后把数据放入内存池,最后把内存池的首地址放到邮箱。 save_recv_p0_data_entry:保存数据线程,接收WRITE_EVENT_P0 事件后,读取ringbuff0的数据,保存 节点0 的温度与时间戳。 save_recv_p1_data_entry:保存数据线程,接收WRITE_EVENT_P1 事件后,读取ringbu
概述心率测试仪基于stm32H750芯片进行开发,支持对人的心率进行测量。通过心率传感器用于采集人的心率并显示在屏幕上。该心率测试仪可以在家中使用,不必在跑去医院进行心率测量,体积小巧,易于使用。 开发环境硬件:ART-Pi 扩展板:心率传感器,HMI串口屏 RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:RT-Thread Studio,USART HMI RT-Thread使用情况概述内核部分:调度器。 调度器:创建多个线程来实现不同的工作。 组件部分:ADC框架, UART框架 ADC框架:使用 ADC框架来采集引脚上的电压。 UART框架:使用UART框架用于给串口屏发送指令,让串口屏幕显示心电图。 硬件框架MCU 定时读取心率传感器的电压,然后通过串口发送到串口屏。 软件框架本项目使用ART-Pi来采集心率电压,而不用考虑屏幕的刷新显示,刷新显示由串口屏负责。本项目软件分为两部分: 第一部分:采集心率 MCU上电之后完成板级外设初始化,并初始化ADC采集引脚,并可以直接启动心率采集。 第二部分:心率显示 MCU上电之后,串口屏幕会自动上电,并等待MCU发送显示数据。 演示效果视频地址 代码地址再附件。 比赛感悟通过 RT-Thread官网上的文档中心,我学习了线程的创建、内存管理、定时器等内核组件,并通过实际的心率测试仪项目巩固加深了对RT-Thread的认识。RT-Thread的软件包很好用,我通过查询文档中心的ADC设备与UART设备的使用,顺利完成了项目,也感谢RT-Thread交流群中的伙伴们给予积极的帮助。最后感谢主办方提供了这么好的一个平台,学到很多知识,未来我将会更加深入的使用RT-Thread开发各种物联网设备,为社区贡献自己的代码。下载所有

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧