多路温度采集控制系统(5)进程通信

2024-04-18 04:18

本文主要是介绍多路温度采集控制系统(5)进程通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

嵌入式项目实践–多路温度采集控制系统(5)进程通信

整个项目运行时,有三个进程:主控服务程序,菜单界面程序,网页监控程序。
进程间通信的功能代码由主控程序中的void* ipcs_pro(void* arg) 线程完成。

通信进程对象

消息队列

  • 菜单界面传送网页更新时间,四路温度报警上限。
  • 主控程序接收菜单界面设置的数据消息。
  • 主控程序接收网页数据更新请求消息。

共享内存

  • 主控程序更新共享内存数据。
  • 网页程序读取更新的共享内存数据。

消息处理线程

    while(1){    //接收菜单程序数据   msg_menu_update(msgid_menu,g_dev);if(msg_recv_webreq(msgid_web)>0){//更新共享内存数据}                   sleep(2);}

系统main( )函数

int main(int argc,char* argv[])
{pthread_t pth_ipc,pth_com,pth_net;//set net portif(argc < 2){g_net_port = DEF_PORT_8848;printf("sys default net port=[8848]\n");}else{g_net_port = atoi(argv[1]);}init_sys(); //创建系统各功能线程pthread_create(&pth_ipc,NULL,ipcs_pro,NULL);pthread_create(&pth_com,NULL,com1_pro,NULL);pthread_create(&pth_net,NULL,net_pro,NULL);pthread_join(pth_ipc,NULL);pthread_join(pth_net,NULL);pthread_join(pth_com,NULL); 
}

程序代码

进程通信头文件

#ifndef _TC9000_SYS_IPC_H
#define _TC9000_SYS_IPC_H#include "config.h"//消息队列接收时索引值
#define TEMP_SMG_INDEX_BASE 10
#define WEB_SMG_INDEX 2
#define WEB_UPDATE_SMG_INDEX 3
#define UPDATE_TIME_SMG_INDEX 4//菜单更新消息
struct st_msg{long int index;int dat;
};
//网页更新消息
struct st_msg_dev{long int index;struct st_sys dev;
};
//网页请求消息
struct st_msg_req{long int index;char req;       
};int get_msgid_web(void);//网页消息队列id
int get_msgid_menu(void);//菜单消息队列id
int msg_recv_webreq(int msgid);//接收网页请求消息
void* set_web_shm(void);//设置网页共享内存
int msg_send_webupdate(int msgid,struct st_sys * g_dev);//向网页发送数据消息
int msg_menu_update(int msgid,struct st_sys* g_dev);//菜单更新消息
#endif

进程通信实现程序

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>#include "sys_ipc.h"
#include "config.h"//同网页进程通信的队列,key=1234
int get_msgid_web(void)
{int id = -1;id = msgget((key_t)1234,0666|IPC_CREAT);if(id == -1){printf("msgget error\n");exit(1);}return id;
}//同菜单进程通信的队列,key=4455
int get_msgid_menu(void)
{int id = -1;id = msgget((key_t)4455,0666|IPC_CREAT);if(id == -1){printf("msgget error\n");exit(1);}return id;
}int msg_menu_update(int msgid,struct st_sys* g_dev)
{int i;long int msg_type;struct st_msg cmd;msg_type = UPDATE_TIME_SMG_INDEX;if(msgrcv(msgid,(void*)&cmd,4,msg_type,IPC_NOWAIT)==-1){//return -1;//如果退出,后面的消息收不到}else{g_dev->update_time=cmd.dat;printf("update_time=%d\n",g_dev->update_time);save_dev(g_dev);        }for(i=0;i<4;i++){msg_type = TEMP_SMG_INDEX_BASE+i;if(msgrcv(msgid,(void*)&cmd,4,msg_type,IPC_NOWAIT)==-1){//return -1;//如果退出,后面的消息收不到}else{g_dev->temp_max[i]=cmd.dat;printf("temp_max[%d]=%d\n",i,g_dev->temp_max[i]);save_dev(g_dev);        }       }return 0;
}int msg_recv_webreq(int msgid)
{int i;long int msg_type;struct st_msg_req cmd;msg_type = WEB_UPDATE_SMG_INDEX;if(msgrcv(msgid,(void*)&cmd,1,msg_type,IPC_NOWAIT)==-1){return -1;}else{if(cmd.req==0x1)return 1;}return 0;       
}int msg_send_webupdate(int msgid,struct st_sys * g_dev)
{struct st_msg_dev cmd;cmd.index = WEB_SMG_INDEX;memcpy(&cmd.dev,g_dev,sizeof(struct st_sys));if(msgsnd(msgid,(void*)&cmd,sizeof(struct st_sys),0)==-1)return -1;return 0;
}//设置共享内存
void* set_web_shm(void)
{int shmid;void* shmaddr=(void*)0;if((shmid=shmget((key_t)2345,sizeof(struct st_sys),0666|IPC_CREAT))<0){return NULL;}else{  if((shmaddr=shmat(shmid,(void*)0,0))==(char *)-1){return NULL;}}printf("set shm ok...\n");return shmaddr;
}

系统主控程序
功能:初始化系统数据,处理各进程间数据通信,创建串口处理线程,网络处理线程,通信处理线程。

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>    #include "sys_ipc.h"
#include "config.h"
#include "net_pro.h"
#include "com_pro.h"struct st_sys g_dev[1]; //系统配置结构体全局变量
int g_net_port;//网络端口int init_sys(void)
{   printf("init system struct,LED flash.\n");load_dev(g_dev);
}//进程间通信处理
void* ipcs_pro(void* arg)
{int i,msgid_menu,msgid_web;struct st_sys* shm_dev;printf("temp control pthread start...\n");if((msgid_menu=get_msgid_menu()) < 0){printf("msg_menu error\n"); exit(1);}   if((msgid_web=get_msgid_web()) < 0){printf("msg_web error\n");  exit(1);}if((shm_dev=(struct st_sys*)set_web_shm())==NULL){printf("shm_web error\n");  exit(1);}   while(1){       msg_menu_update(msgid_menu,g_dev);if(msg_recv_webreq(msgid_web)>0){//update shmfor(i=0;i<DEF_MAX_CHANNEL;i++){shm_dev->temp_max[i] = g_dev->temp_max[i];shm_dev->temp_data[i] = g_dev->temp_data[i];shm_dev->status[i] = g_dev->status[i];}shm_dev->update_time = g_dev->update_time;}                   //msg_send_webupdate(msgid_web,g_dev);sleep(2);}
}int main(int argc,char* argv[])
{pthread_t pth_ipc,pth_com,pth_net;//set net portif(argc < 2){g_net_port = DEF_PORT_8848;printf("sys default net port=[8848]\n");}else{g_net_port = atoi(argv[1]);}init_sys(); //创建系统各功能线程pthread_create(&pth_ipc,NULL,ipcs_pro,NULL);pthread_create(&pth_com,NULL,com1_pro,NULL);pthread_create(&pth_net,NULL,net_pro,NULL);pthread_join(pth_ipc,NULL);pthread_join(pth_net,NULL);pthread_join(pth_com,NULL); 
}

这篇关于多路温度采集控制系统(5)进程通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913741

相关文章

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

WordPress网创自动采集并发布插件

网创教程:WordPress插件网创自动采集并发布 阅读更新:随机添加文章的阅读数量,购买数量,喜欢数量。 使用插件注意事项 如果遇到404错误,请先检查并调整网站的伪静态设置,这是最常见的问题。需要定制化服务,请随时联系我。 本次更新内容 我们进行了多项更新和优化,主要包括: 界面设置:用户现在可以更便捷地设置文章分类和发布金额。代码优化:改进了采集和发布代码,提高了插件的稳定

使用JWT进行安全通信

在现代Web应用中,安全通信是至关重要的。JSON Web Token(JWT)是一种流行的安全通信方式,它允许用户和服务器之间安全地传输信息。JWT是一种紧凑的、URL安全的表示方法,用于在两方之间传输信息。本文将详细介绍JWT的工作原理,并提供代码示例帮助新人理解和实现JWT。 什么是JWT? JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSO

小红书商家电话采集软件使用指南

使用小红书商家电话采集软件可以提高商家电话的采集效率,以下是使用指南及附带代码。 步骤一:安装Python和相关库 首先,确保你的电脑已经安装了Python运行环境(建议安装Python3版本)。安装完成后,同样需要安装一些相关的库,如requests、beautifulsoup4等。在命令行窗口中输入以下命令进行安装: pip install requestspip install bea

温湿度采集及OLED显示

目录 软件I2C和硬件I2C每隔2秒钟采集一次温湿度数据,显示到OLED上,同时通过串口发送到上位机的“串口助手”软件 软件I2C和硬件I2C "I2C"代表Inter-Integrated Circuit,是一种用于在数字电路之间进行通信的串行通信协议。软件I2C和硬件I2C是两种实现这种协议的方式。 软件I2C是通过软件来模拟I2C通信协议的实现方式。在这种情况下,微控制

ROS话题通信机制实操C++

ROS话题通信机制实操C++ 创建ROS工程发布方(二狗子)订阅方(翠花)编辑配置文件编译并执行注意订阅的第一条数据丢失 ROS话题通信的理论查阅ROS话题通信流程理论 在ROS话题通信机制实现中,ROS master 不需要实现,且连接的建立也已经被封装了,需要关注的关键点有三个: 发布方(二狗子)订阅方(翠花)数据(此处为普通文本) 创建ROS工程 创建一个ROS工程

毫米波移动通信系统中的波束赋形

在毫米波移动通信系统中,系统的频点较高,因此毫米波系统的射频器件易于小型化,然而同时也带来绕射能力差、穿透损耗大、路径损耗大[4][5]等缺点,这将大大降低了毫米波通信系统的接收功率,其中阻挡效应被认为是制约毫米波应用于移动通信系统的关键因素之一。为了对抗毫米波移动通信系统的噪声受限问题,目前普遍认为在毫米波移动通信系统中将会在发射端和接收端上同时使用天线阵列进行发送和接收[4][5],因此必须要

Android进程保活全攻略(中)

在上一篇博客Android进程保活全攻略(上)中介绍了进程保活的背景和一些方法的思路和实现方式,本篇博客我将承接上篇博客,继续进行介绍。 9) 1像素悬浮层 **思路:**1像素悬浮层是传说的QQ黑科技,监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉。注意该 Activity 需设计成用户无感知。通过该方案,可以使进程的优先级在屏幕