⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 SystemC可以由C语言直接开发硬件
💻 CPP
字号:
/************************************************************************ * file name:	main.cpp * description:	SystemC module with UDP clientt and server, *			compiled in linux. * * modification history * -------------------- * 04.4.7, created by zhuwei *//* includes----------------------------------------------------------- */#include "systemc.h"#include <sys/socket.h>#include <netinet/in.h>#include <string.h>#include <sys/select.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <deque> // STL/* defines------------------------------------------------------------ */#define UDP_PORT 3456#define BUF_SIZE 128/* typedefs----------------------------------------------------------- */void send_data(void *data, int size);deque<int >	buf(BUF_SIZE, 0);struct module_a: sc_module{	sc_in<bool>			clk;	int 				i, j;	void reg_fun()	{		i++;		if(i % 1000000 == 0)		{			j++;			send_data((void *)&j, sizeof(int));			cout << name() << " send data: " << j << endl;		}	}	SC_CTOR(module_a): j(245)	{		SC_METHOD(reg_fun);		sensitive_pos << clk;	}};struct module_b: sc_module{	sc_in<bool>			clk;	int				data;	void reg_fun()	{		if(!buf.empty())		{			data = *buf.begin();			buf.pop_front();			cout << name() << " recv data: " << data << endl;		}	}	SC_CTOR(module_b)	{		SC_METHOD(reg_fun);		sensitive_pos << clk;	}};/* externs------------------------------------------------------------ *//* globals------------------------------------------------------------ */char				*dest_ip = "127.0.0.1";int				sockfd;/* forward declarations----------------------------------------------- */void run_svr(void * p){	struct sockaddr_in	local_addr;	//-----------------------------------	fd_set 			read_set;	memset(&local_addr, 0 , sizeof(struct sockaddr));	local_addr.sin_family = AF_INET;	local_addr.sin_port = htons(UDP_PORT);	local_addr.sin_addr.s_addr = INADDR_ANY;	if(bind(sockfd, (struct sockaddr *)&local_addr, sizeof(struct sockaddr))!=0) fprintf(stderr, "error bind");	while(1)	{		//printf("wait to receive...\n");		FD_ZERO (&read_set);		FD_SET(sockfd, &read_set);		if(select(sockfd+1, &read_set, NULL, NULL, NULL) <= 0)continue;		//--UDP recevie--		if (FD_ISSET (sockfd, &read_set))		{			unsigned char	buffer[1024];			int		recv_size;			int		data;			socklen_t addr_size = sizeof(struct sockaddr);						while((recv_size = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&local_addr, &addr_size))>0)			{				memcpy(&data, buffer, sizeof(int));				//printf("%d\n", data);				buf.push_back(data);			}		}	}}void send_data(void *data, int size){	struct sockaddr_in	dest_addr;	int				ret;	memset(&dest_addr, 0 , sizeof(struct sockaddr));	dest_addr.sin_family = AF_INET;	dest_addr.sin_port = htons(UDP_PORT);	dest_addr.sin_addr.s_addr =  inet_addr(dest_ip);	ret = sendto(sockfd, data, size, 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));	if(ret<0)fprintf(stderr, "error sending.\n");}int sc_main(int argc, char *argv[]){	sc_clock		clk("clk", 1000, SC_NS);	//sc_signal<int>	data;	//-----------------------------	pthread_t 		svr_thrd;	int 			ret;		buf.clear();		sockfd = socket( AF_INET, SOCK_DGRAM, 0 );	if(sockfd < 0) fprintf(stderr, "error create socket\n");		module_a	ma("ma");	ma(clk);		module_b	mb("mb");	mb(clk);	ret = pthread_create(&svr_thrd, NULL, (void *(*) (void *))run_svr, /*(void *)&data*/ NULL);	if(ret)	{		perror("pthread_create: run_svr");		exit(EXIT_FAILURE);	}	sc_start(-1);		close(sockfd);		return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -