嵌入式安防监控项目——网页控制开发板设备与Zigbee设备
创始人
2025-05-30 07:02:02
0

目录

一、pthread线程间的同步互斥

二、具体实现


一、pthread线程间的同步互斥

线程间同步互斥的操作:

1、线程间同步    ==== 有序执行

    1、多个信号量

    2、条件变量+互斥锁  ===>broadcast signal

2、线程间互斥  ==== "你死我活"

    1、单个信号量

    2、互斥锁

同步和互斥是为了什么?

    为了保护临界资源

   

什么是临界资源:

    全局变量

        pthread_create之前的成为 全局资源 =====>当有线程操作全局资源的时候 ===>变为临界资源

/*************************************************************************#	 FileName	: pthreadsem.c#	 Author		: fengjunhui #	 Email		: 18883765905@163.com ************************************************************************/#include
#include 
#include #define N 64
typedef struct message{char buf[N];int len;
}msg_t;sem_t sem_reverse;
sem_t sem_printf;void* reverse_msgbuf(void* arg)
{msg_t *msg = (msg_t *)arg;int i = 0;char tmp;while(1){sem_wait(&sem_reverse);printf("reverse_msgbuf -------------\n");//printf("hello reverse_msgbuf.\n");
#if 1for(i = 0; i < msg->len/2; i ++){tmp			 = msg->buf[i];msg->buf[i]  = msg->buf[msg->len - i - 1];msg->buf[msg->len - i -1] = tmp;}
#endif sleep(1);printf("reverse_msgbuf :%s\n",msg->buf);sem_post(&sem_printf);}
}void* printf_msgbuf(void* arg)
{msg_t *msg = (msg_t *)arg;while(1){sem_wait(&sem_printf);printf("printf_msgbuf :***********\n");printf("printf_msgbuf :%s\n",msg->buf);sem_post(&sem_reverse);}
}int main(int argc, const char *argv[])
{msg_t msg = {"123456789",9};pthread_t tid[2];sem_init(&sem_reverse,0,1);sem_init(&sem_printf,0,0);pthread_create(&tid[0],NULL,reverse_msgbuf,(void *)&msg);pthread_create(&tid[1],NULL,printf_msgbuf,(void *)&msg);pause();return 0;
}
/*************************************************************************#	 FileName	: flaglock.c#	 Author		: fengjunhui #	 Email		: 18883765905@163.com ************************************************************************/#include
#include #define N 64
typedef struct message{char buf[N];int len;
}msg_t;pthread_mutex_t mymutex;void* reverse_msgbuf(void* arg)
{msg_t *msg = (msg_t *)arg;int i = 0;char tmp;while(1){pthread_mutex_lock(&mymutex);for(i = 0; i < msg->len/2; i ++){tmp			 = msg->buf[i];msg->buf[i]  = msg->buf[msg->len - i - 1];msg->buf[msg->len - i -1] = tmp;}pthread_mutex_unlock(&mymutex);}
}void* printf_msgbuf(void* arg)
{msg_t *msg = (msg_t *)arg;while(1){pthread_mutex_lock(&mymutex);printf("buf :%s\n",msg->buf);pthread_mutex_unlock(&mymutex);sleep(1);}
}int main(int argc, const char *argv[])
{msg_t msg = {"123456789",9};pthread_t tid[2];pthread_mutex_init(&mymutex,NULL);pthread_create(&tid[0],NULL,reverse_msgbuf,(void *)&msg);pthread_create(&tid[1],NULL,printf_msgbuf,(void *)&msg);pause();return 0;
}

/*************************************************************************#	 FileName	: flaglock.c#	 Author		: fengjunhui #	 Email		: 18883765905@163.com ************************************************************************/#include
#include #define N 64
typedef struct message{char buf[N];int len;
//	int busy_flag;
}msg_t;int flag = 0;
pthread_mutex_t mymutex;
pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;void* reverse_msgbuf(void* arg)
{msg_t *msg = (msg_t *)arg;int i = 0;char tmp;while(1){pthread_mutex_lock(&mymutex);printf("reverse_msgbuf -------------\n");while(flag != 0){pthread_cond_wait(&mycond,&mymutex);}//printf("hello reverse_msgbuf.\n");
#if 1for(i = 0; i < msg->len/2; i ++){tmp			 = msg->buf[i];msg->buf[i]  = msg->buf[msg->len - i - 1];msg->buf[msg->len - i -1] = tmp;}
#endif printf("reverse_msgbuf :%s\n",msg->buf);flag = 1;pthread_mutex_unlock(&mymutex);pthread_cond_broadcast(&mycond);}
}void* printf_msgbuf(void* arg)
{msg_t *msg = (msg_t *)arg;while(1){pthread_mutex_lock(&mymutex);printf("printf_msgbuf :***********\n");while(flag != 1){pthread_cond_wait(&mycond,&mymutex);}printf("printf_msgbuf :%s\n",msg->buf);flag = 0;pthread_mutex_unlock(&mymutex);pthread_cond_broadcast(&mycond);}
}int main(int argc, const char *argv[])
{//msg_t msg = {"123456789",9,0};msg_t msg = {"123456789",9};pthread_t tid[2];pthread_cond_init(&mycond,NULL);pthread_mutex_init(&mymutex,NULL);pthread_create(&tid[0],NULL,reverse_msgbuf,(void *)&msg);pthread_create(&tid[1],NULL,printf_msgbuf,(void *)&msg);pause();return 0;
}

/*************************************************************************
#	 FileName	: flaglock.c
#	 Author		: fengjunhui 
#	 Email		: 18883765905@163.com ************************************************************************/#include
#include #define N 64
typedef struct message{char buf[N];int len;//	int busy_flag;
}msg_t;pthread_mutex_t mymutex;
pthread_cond_t mycond_reverse = PTHREAD_COND_INITIALIZER;
pthread_cond_t mycond_printf  = PTHREAD_COND_INITIALIZER;void* reverse_msgbuf(void* arg)
{msg_t *msg = (msg_t *)arg;int i = 0;char tmp;while(1){pthread_mutex_lock(&mymutex);pthread_cond_wait(&mycond_reverse,&mymutex);printf("reverse_msgbuf -------------\n");
#if 1for(i = 0; i < msg->len/2; i ++){tmp			 = msg->buf[i];msg->buf[i]  = msg->buf[msg->len - i - 1];msg->buf[msg->len - i -1] = tmp;}
#endif printf("reverse_msgbuf :%s\n",msg->buf);pthread_mutex_unlock(&mymutex);}
}void* printf_msgbuf(void* arg)
{msg_t *msg = (msg_t *)arg;while(1){pthread_mutex_lock(&mymutex);pthread_cond_wait(&mycond_printf,&mymutex);printf("printf_msgbuf :***********\n");printf("printf_msgbuf :%s\n",msg->buf);pthread_mutex_unlock(&mymutex);}
}int main(int argc, const char *argv[])
{//msg_t msg = {"123456789",9,0};msg_t msg = {"123456789",9};pthread_t tid[2];pthread_cond_init(&mycond_printf,NULL);pthread_cond_init(&mycond_reverse,NULL);pthread_mutex_init(&mymutex,NULL);pthread_create(&tid[0],NULL,reverse_msgbuf,(void *)&msg);pthread_create(&tid[1],NULL,printf_msgbuf,(void *)&msg);while(1){pthread_cond_signal (&mycond_printf);sleep(1);	pthread_cond_signal (&mycond_reverse);sleep(1);}pause();return 0;
}

二、具体实现

由于没用到sqlite并且忘记设置风扇的锁了,所以先借用了一下。

nice成功了

下面是执行控制功能的客户端线程

#include "data_global.h"#include "buzzer.h"
#include "linuxuart.h"extern int msgid;
extern key_t key;extern pthread_mutex_t mutex_client_request,mutex_refresh,mutex_sqlite,mutex_transfer,mutex_analysis,mutex_sms,mutex_buzzer,mutex_led,mutex_camera;extern pthread_cond_t  cond_client_request,cond_refresh,cond_sqlite,cond_transfer,cond_analysis,cond_sms,cond_buzzer,cond_led,cond_camera;extern unsigned char cmd_led;
extern unsigned char cmd_buzzer;
extern unsigned char cmd_seg;
extern unsigned char cmd_fan;extern char recive_phone[12] ;
extern char center_phone[12] ;struct msg msgbuf;//��2N��Ԫ�ر�ʾ����   ��2N+1��Ԫ�ر�ʾ��������ʱ��
unsigned char MUSIC[500] ={//ף��ƽ��0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
#if 00x30,0x1c,0x10,0x20,0x40,0x1c,0x10,0x18,0x10,0x20,0x10,0x1c,0x10,0x18,0x40,0x1c,0x20,0x20,0x20,0x1c,0x20,0x18,0x20,0x20,0x80,0xff,0x20,0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0xff,0x20,0x20,0x1c,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,0x20,0x1c,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1c,0x10,0x20,0x10,0x1c,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,0x15,0x1f,0x05,0x20,0x10,0x1c,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,0x20,0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1c,0x10,0x18,0x40,0x1c,0x20,0x20,0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,
#endif
};void *pthread_client_request(void *arg)
{if((key = ftok("/tmp",'g')) < 0){perror("ftok failed .\n");exit(-1);}msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);if(msgid == -1)	{if(errno == EEXIST){msgid = msgget(key,0777);}else{perror("fail to msgget");exit(1);}}printf("pthread_client_request\n");while(1){bzero(&msgbuf,sizeof(msgbuf));printf("wait form client request...\n");msgrcv (msgid, &msgbuf, sizeof (msgbuf) - sizeof (long), 1L, 0);printf ("Get %ldL msg\n", msgbuf.msgtype);printf ("text[0] = %#x\n", msgbuf.text[0]);switch(msgbuf.msgtype){case 1L:pthread_mutex_lock(&mutex_led);printf("hello led\n");cmd_led = msgbuf.text[0];pthread_mutex_unlock(&mutex_led);pthread_cond_signal(&cond_led);break;case 2L:printf("beep\n");pthread_mutex_lock(&mutex_sqlite);printf("hello beep\n");cmd_buzzer = msgbuf.text[0];printf("cmd_buzzer :%#x.\n",cmd_buzzer);int i = 0;int buzzer_fd;beep_desc_t beeper;buzzer_fd = open(BEEPER_DEV,O_RDWR | O_NONBLOCK);if ( buzzer_fd == -1 ) {perror("open beeper failed.\n");//return -1;}printf("buzzer_fd ;%d.\n",buzzer_fd);	if(cmd_buzzer == 0x51){ioctl(buzzer_fd,BEEP_ON);
#if 1for(i = 0;i < sizeof(MUSIC)/sizeof(MUSIC[0]); i += 2){beeper.tcnt = MUSIC[i];beeper.tcmp = MUSIC[i]/2;ioctl(buzzer_fd,BEEP_FREQ,&beeper);usleep(MUSIC[i+1] * 20000);} //��ʱ���������������̵߳Ĵ��������б�����ʱ����printf("music play over....\n");close(buzzer_fd);
#endif }else if(cmd_buzzer == 0x50){ioctl(buzzer_fd,BEEP_OFF);}else {printf("cmd_buzzer error.\n");}pthread_mutex_unlock(&mutex_sqlite);break;case 3L:pthread_mutex_lock(&mutex_led);printf("hello seg\n");cmd_seg = msgbuf.text[0];pthread_mutex_unlock(&mutex_led);pthread_cond_signal(&cond_led);break;case 4L:pthread_mutex_lock(&mutex_sqlite);printf("hello fan\n");cmd_fan = msgbuf.text[0];int fan_fd = open_port("/dev/ttyUSB0"); //�����豸if(fan_fd < 0){printf("open failed\n");}set_com_config(fan_fd, 115200, 8, 'N', 1); //���ô��ڲ���char cmdbuf[4] = {0};if(cmd_fan == 0x21){strcpy(cmdbuf,"1\n"); //ע����write(fan_fd,cmdbuf,sizeof(cmdbuf)/sizeof(cmdbuf[0]));sleep(2);}if(cmd_fan == 0x20){strcpy(cmdbuf,"0\n");write(fan_fd,cmdbuf,sizeof(cmdbuf)/sizeof(cmdbuf[0]));sleep(2);}char buf[32] = {0};//get data from zigbeeread(fan_fd,&buf,sizeof(buf));printf("sizeof(buf) = %d.\n",sizeof(buf));printf(">>>>>>%s\n",buf);sleep(1);pthread_mutex_unlock(&mutex_sqlite);break;case 5L:printf("set env data\n");printf("temMAX: %d\n",*((int *)&msgbuf.text[1]));printf("temMIN: %d\n",*((int *)&msgbuf.text[5]));printf("humMAX: %d\n",*((int *)&msgbuf.text[9]));printf("humMAX: %d\n",*((int *)&msgbuf.text[13]));printf("illMAX: %d\n",*((int *)&msgbuf.text[17]));printf("illMAX: %d\n",*((int *)&msgbuf.text[21]));break;case 6L:case 7L:case 8L:case 9L:printf("�����Խ���Щ��Ϊ��չ��ѧϰ������.\n");break;case 10L:{pthread_mutex_lock (&mutex_sms);int i = 0 , j = 0 ;for(i = 0 ; i < 11; i++){recive_phone[i] = msgbuf.text[i]; 	}recive_phone[i] = '\0';printf("recive:%s\n",recive_phone);for(j = 0 ;msgbuf.text[i] != '\0' && j < 12; i++, j++){center_phone[j] =  msgbuf.text[i];}center_phone[j] = '\0';printf("center:%s\n",center_phone);cmd_sms = msgbuf.text[0];pthread_cond_signal(&cond_sms);pthread_mutex_unlock(&mutex_sms);}break;default:break;}}}#if 0long msgtype;//��������Ϣ����
��Ϣ���͵ķ��䣺
1L: 		LED����
2L:			����������
3L:			��·LED��ģ����������
4L:			����
5L:			��ʪ����ֵ����
6L-7L-8L-9L,���ڸ��˵���չ
10L: 		3Gͨ��ģ��-GPRS 
switch(msgbuf.msgtype){case 1L: ...  break;....default ....  break;
}
#endif

除了风扇现在都没问题了,风扇这里zigbee程序有问题,不能处理usb串口发送的指令,只能通过zigbbe自组的网络进行控制。

 

相关内容

热门资讯

最新或2023(历届)杭州小升...  3月  3月初,预备参与杭城民办初中自主招生的六年级学生,赶紧登陆各校官网预报名。不过,面向全省招...
最新或2023(历届)北京小升...  再过两个月,小学就将开始进行入学信息采集工作。根据此前北京市教委发布的《关于最新或2023(历届)...
最新或2023(历届)广州玉岩...  最新或2023(历届)广州玉岩天健实验学校小升初招生简章包括最新或2023(历届)广州玉岩天健实验...
最新或2023(历届)海南小升... 省特长生总量将逐步减少  优质初中学校适当增招足球特长生  海南日报海口3月12日讯(记者郭景水见习...
最新或2023(历届)北京小升... 北京市教委发布的《最新或2023(历届)义务教育入学工作的意见》将正式实施,其中特长生招生部分的相关...
c语言的基础知识之结构体 目录前言结构体结构的自引用typedef函数结构体内存对齐修改默认对齐数位段什么是位段位段的内存分配...
OpenGL学习日志之深度测试 为什么需要深度缓冲区? 当绘制一个四边形的时候,由于我们绘制的时候是一个...
最新或2023(历届)北京小升... 再过两个月,小学就将开始进行入学信息采集工作。根据此前北京市教委发布的《关于最新或2023(历届)义...
天津市和平区教育局局长谈最新或...  近年来,和平区在区内各校全面推广义务教育现代化达标建设以及优秀教师交流、校长轮岗等制度,使义务教育...
安卓拍照、裁切、选取图片实践 安卓拍照、裁切、选取图片实践 前言 最近项目里面有用到裁切功能,没弄多复杂࿰...
最新或2023(历届)北京小升...  1、 听说师达风雨无阻?真的吗?雾霾天也要去?女孩子生理期也要去?  回答:估计这个问题应该是指体...
使用“Database Con... 使用“Database Configuration Assistant”(数据库配置助...
备战最新或2023(历届)天津...  最新或2023(历届)天津小升初政策已经公布,小升初各种考试基本都将取消。民办校将不再采用考试方式...
一位小学校长看教育:孩子的核心... 1我是家长,是校长,是爷爷,但爷龄不长。今天我们谈“厚德养志,家教有方”。“德”,按照我们的想法,先...
最新或2023(历届)上海幼升... 最新或2023(历届)上海幼升小小升初招生入学工作日程安排 1月 市、区县教育行政部门做好义务教育阶...
广州小升初备战最新或2023(...  广州小升初家长必须考虑的事  1、即使冲优秀的学校有百分之百的把握,也要找好至少两个保底的学校,以...
你不知道的javascript... github start:https://github.com/paiDaXing-w...
蚂蚁教育第二期家庭教育公益讲座... 家庭教育观点分享亲爱的孩子: 我为什么要你努力?因为,生活并不是为你私人订制的,当我们日后感到不满,...
学习Java——代理 目录 静态代理 动态代理 动态代理的几种实现方式 Java实现动态代理的大致步骤 Java 实现动态...
菜鸟刷题Day2 菜鸟刷题Day2 一.判定是否为字符重排:字符重排 描述 给定两个由小写字母组成的字符...