您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 湖北汽院嵌入式系统开发实验
实验二嵌入式Linux多线程通信实验程(thread)是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。P(S):①将信号量S的值减1,即S=S-1;②如果S≥0,则该进程继续执行;否则该进程状态置为阻塞状态,进程PCB排入信号量PCB队列末尾,放弃CPU,等待V操作的执行。V(S):1将信号量S的值加1,即S=S+1;2如果S≤0,释放信号量队列中第一个PCB所对应的进程,将进程状态由阻塞态改为就绪态。执行V操作的进程继续执行。#includestdio.h#includeunistd.h#includepthread.h#includesemaphore.h#defineMAXSIZE10intstack[MAXSIZE];intsize=50;intfront=-1,rear=0;sem_tavail,full;//avail表示可用的空缓冲区,full表示已存放产品的缓冲区//生产者pthread_tprovider,customer,end;voidprovider_fun(void)//full表示已存放产品的缓冲区{inti=1;sleep(5);while(i=size)//生产50个产品,需要放入到MAXSIZE个缓冲区中{sem_wait(&avail);//avail信号量P操作,表示将可用的空缓冲区个数减1stack[rear]=i;printf(producethe%dproduct\n,stack[rear]);rear=(rear+1)%MAXSIZE;i++;sleep(1);sem_post(&full);//full信号量V操作,表示将存放产品的缓冲区个数加1}pthread_exit(NULL);}//消费者voidcustomer_fun(void){inti=1;while(i=size){sem_wait(&full);//fulll信号量P操作,表示将存放产品的缓冲区个数减1front=(front+1)%MAXSIZE;printf(\tconsumethe%dproduct\n,stack[front]);stack[front]=0;sleep(2);sem_post(&avail);//avail信号量V操作,表示将可用的空缓冲区个数加1i++;}pthread_exit(NULL);}voidend_fun(void){charch;scanf(%c,&ch);pthread_cancel(provider);pthread_cancel(customer);dpthread_exit(NULL);printf(exit!\n);}voidmain(){pthread_tprovider,customer;//定义生产者线程对象和消费者线程对象sem_init(&avail,0,MAXSIZE);//将avail信号量初始化为MAXSIZEsem_init(&full,0,0);//将full信号量初始化为0pthread_create(&provider,NULL,(void*)provider_fun,NULL);//创建生产者线程pthread_create(&customer,NULL,(void*)customer_fun,NULL);//消费者线程pthread_create(&end,NULL,(void*)end_fun,NULL);pthread_join(provider,NULL);pthread_join(customer,NULL);pthread_join(end,NULL);sem_destroy(&avail);sem_destroy(&full);}实验三、嵌入式Linux网络通信实验3、TCP套接字通信步骤服务器端:(1)调用socket()创建套接字,然后初始化structsockaddr_in结构体。(2)调用bind函数()为套接字绑定一个IP地址和一个端口号。(3)调用listen()函数使套接字成为监听套接字,侦听指定的端口。(4)调用accept()函数,使服务器处于阻塞状态,等待接受客户端连接请求。一旦建立连接,将产生新的套接字,此时就有两个套接字了,原来的那个套接字还在监听等待指定的端口,而新产生的套接字则准备发送或接受数据。(5)利用send/sendto和recv/recvfrom进行数据传输。当然也可以调用write或read.(6)数据传输完毕,关闭套接字。请补充server.c中代码//fuwuqi#includesys/types.h#includesys/socket.h//包含套接字函数库#includestdio.h#includenetinet/in.h//包含AF_INET相关结构#includearpa/inet.h//包含AF_INET相关操作的函数#includeunistd.h#includestring.h//bzero()#defineMAXDATASIZE50intmain(){intserver_sockfd;//服务器端socket描述符变量,用以监听客户端的TCP连接intnew_sockfd;//当监听到并接受一个TCP连接时,accept()返回一个新的socket,用这个socket接受数据structsockaddr_inserver_addr;//服务器端sockaddr_in的数据结构structsockaddr_inclient_addr;//用于accept()存放客户端的socket数据结构intclient_addr_len;//用于返回structsockaddr_in的长度,作为accept()中的一个参数charbuf[MAXDATASIZE];//创建一个buf来存放接受的数据intnumbytes;//用以返回接受到的字节数server_sockfd=socket(AF_INET,SOCK_STREAM,0);//创建一个TCP套接字,其中协议族为AF_INET,套接字类型为SOCK_STREAM,第三个参数为0server_addr.sin_family=AF_INET;//server_addr.sin_family为AF_INETserver_addr.sin_addr.s_addr=inet_addr(10.10.58.130);//server_addr.sin_addr.s_addr为服务器端IP地址,需经inet_addr()转化为网络IP字节序server_addr.sin_port=htons(1025);//server_addr.sin_port为一个大于1024的端口号,需经htons()转化为网络字节序bind(server_sockfd,(structsockaddr*)&server_addr,sizeof(structsockaddr));//将server_sockfd绑定到server_addr指定的IP和端口上listen(server_sockfd,5);//为server_sockfd创建包含5个TCP连接的监听队列,将其设置为监听套接字while(1){client_addr_len=sizeof(structsockaddr_in);//计算sockaddr_in的长度new_sockfd=accept(server_sockfd,(structsockaddr*)&client_addr,&numbytes);//等待接受客户端发来的TCP连接,若连接成功,返回新的socketnumbytes=recv(new_sockfd,buf,20,0);//将客户端发来的数据存放在buf中,返回接受到的字节数if(numbytes){printf(%s\n,buf);//输出buf中数据}sleep(3);send(new_sockfd,Iamserver,20,0);//向客户端发送Iamserverclose(new_sockfd);if('8'==getchar()){break;}}close(server_sockfd);return0;}客户端:(1)调用socket()创建套接字,然后初始化structsockaddr_in结构体,注意服务器端和客户端的structsockaddr_in结构体应该一致。(2)调用connection()函数与服务器建立连接。(3)利用send/sendto和recv/recvfrom进行数据传输.当然也可以调用write或read.(4)数据传输完毕,关闭套接字。请补充client.c中代码//KEHU#includesys/types.h#includesys/socket.h//包含套接字函数库#includestdio.h#includenetinet/in.h//包含AF_INET相关结构#includearpa/inet.h//包含AF_INET相关操作的函数#includeunistd.h#includestring.h//bzero()#defineMAXDATASIZE50intmain(intargc,char*argv[]){intsockfd,result;//客户端socket描述符变量structsockaddr_inserver_addr;//与服务器端sockaddr_in的数据结构一致charbuf[MAXDATASIZE];//用以接受服务器端发送过来的数据intnumbytes;//用以返回从服务端发送过来的数据字节数sockfd=socket(AF_INET,SOCK_STREAM,0);//创建一个TCP套接字,其中协议族为AF_INET,套接字类型为SOCK_STREAM,第三个参数为0server_addr.sin_family=AF_INET;//address_addr_addr.sin_family为AF_INETserver_addr.sin_addr.s_addr=inet_addr(10.10.58.130);//address_addr_addr.sin_addr.s_addr为服务器端IP地址,需经inet_addr()转化为网络IP字节序server_addr.sin_port=htons(1025);//address_addr_addr.sin_port为一个大于1024的端口号,需经htons()转化为网络字节序result=connect(sockfd,(structsockaddr*)&server_addr,sizeof(structsockaddr));//与address_addr_addr指定的服务器建立连接send(sockfd,thisisclient,20,0);//向服务器端发送thisisclientsleep(3);numbytes=recv(sockfd,buf,50,0);//接受服务器端发送过来的数据,保存在buf中if(numbytes){printf(%s\n,buf);//输出buf里面的数据}close(sockfd);return0;}实验四、嵌入式Linux串行端口编程实验6.什么是全双工和半双工全双工(Fullduplex)是说计算机可以同时接受和发送数据——也就是它有两个分开的数据传输通道(一个传入,一个传出)。半双工(Halfduplex)表示计算机不能同时接受和发送数据,而在某一时刻它只能单一的传送或者接收。这通常意味着,它只有一个数据通道。半双工并不是说RS-232的某些信号不能使用,而是,它通常是使用了有别于RS-232的其他不支持全双工的标准。#includestdio.h/*标准输入输出定义*/#includestdlib.h/*标准函数库定义*/#includeunistd.h/*Unix标准函数定义
本文标题:湖北汽院嵌入式系统开发实验
链接地址:https://www.777doc.com/doc-5890195 .html