您的位置:首页 > 其它

基于ARM的智能灯光控制系统(6)进程通信

2016-10-20 14:43 295 查看

基于ARM的智能灯光控制系统(6)进程通信

进程通信的作用

通信方式程序中的功能
消息队列用于接受网页不同的事件请求
共享内存实现主控程序与网页程序的数据共享
.

进程通信机制

Created with Raphaël 2.1.0网页程序1网页程序1主控程序主控程序网页程序2网页程序2显示系统数据消息队列(0x01)更新共享内存设置系统数据消息队列(0x02)更新共享内存、链表,保存文件

进程通信头文件(sys_ipc.h)

函数功能
ipcs_pro通信处理线程,接收网页事件进行处理
get_msgid_web获得消息队列ID
msg_recv_webreq接收网页消息队列的消息
set_web_shm设置共享内存
shm_to_stu共享内存数据更新到全局结构体
stu_to_shm全局结构体数据更新到共享内存
.

#ifndef _SL2000_SYS_IPC_H
#define _SL2000_SYS_IPC_H

#include "config.h"
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>

void* ipcs_pro(void* arg);
int get_msgid_web(void);
int msg_recv_webreq(int msgid);
void* set_web_shm(void);
int shm_to_stu(const struct sys_all* shm_dev);
int stu_to_shm( struct sys_all* shm_dev);


进程通信实现文件(sys_ipc.c)

#include "sys_ipc.h"
#include "config.h"
#include "link_pro.h"

extern struct sys_all g_dev[1];
extern struct sys_dev *head_node;
int area_update_flag;

void* ipcs_pro(void* arg)
{
int msgid_web;
struct sys_all* shm_dev=NULL;
int i,cmd;

printf("ipcs pthread start...\n");
if((msgid_web=get_msgid_web()) < 0){
printf("msg_web error\n");
exit(1);
}

if((shm_dev=(struct sys_all*)set_web_shm())==NULL){
printf("shm_web error\n");
exit(1);
}

stu_to_shm(shm_dev);
while(1){
cmd = msg_recv_webreq(msgid_web);
switch(cmd){
case 1://网页更新0x01
stu_to_shm(shm_dev);
break;
case 2://设置更新0x02
shm_to_stu(shm_dev);
save_dev(g_dev);
head_node = stu_to_link(head_node);
area_update_flag = 1;
break;
default:
break;
}
sleep(2);
}
}

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;
}

int msg_recv_webreq(int msgid)
{
int i,ret;
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)
ret = cmd.req;
printf("recv %d cmd...\n",ret);
return ret;
}
return 0;
}

void* set_web_shm(void)
{
int shmid;
void* shmaddr=(void*)0;

if((shmid=shmget((key_t)1122,sizeof(struct sys_all),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;
}

int stu_to_shm( struct sys_all* shm_dev)
{
int i;
if(shm_dev==NULL)
return -1;
memcpy(shm_dev,g_dev,sizeof(struct sys_all));
return 0;
}

int shm_to_stu(const struct sys_all* shm_dev)
{
int i;
if(shm_dev==NULL)
return -1;
memcpy(g_dev,shm_dev,sizeof(struct sys_all));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: