C 从linux代码到qnx代码有哪些变化?
我创建了一个套接字,通过ip地址和端口号从客户端接收数据。我创建了一个计时器,每2ms、10ms和100ms调用一次任务。上面的代码在linux上运行良好。但是如何将上述代码转换为QNX RTOS。我应该为QNX RTO做哪些更改。谁能帮帮我吗C 从linux代码到qnx代码有哪些变化?,c,linux,sockets,timer,qnx,C,Linux,Sockets,Timer,Qnx,我创建了一个套接字,通过ip地址和端口号从客户端接收数据。我创建了一个计时器,每2ms、10ms和100ms调用一次任务。上面的代码在linux上运行良好。但是如何将上述代码转换为QNX RTOS。我应该为QNX RTO做哪些更改。谁能帮帮我吗 如果我在qnx中使用相同的代码,那么它将在int fd_2ms=create_timer;时崩溃 请记住,QNX与Linux基本相同。如果我在Linux中通过更改库来使用上述代码,那么它将在create_定时器处崩溃;功能仅限!!!你能详细说明一下破裂的
如果我在qnx中使用相同的代码,那么它将在int fd_2ms=create_timer;时崩溃 请记住,QNX与Linux基本相同。如果我在Linux中通过更改库来使用上述代码,那么它将在create_定时器处崩溃;功能仅限!!!你能详细说明一下破裂的原因吗?你有编译器错误吗?链接器错误?运行时错误?请编辑您的问题,以包含这些信息,以及可能出现的编译器错误(如果有)的完整且未经编辑的日志。首先,您在Linux和QNX以及任何其他POSIX平台上使用的是错误的。timer_create只返回一个布尔成功/失败指示器,它是调用timer_settime时需要使用的timer_id。如果您的程序是为Linux工作的,那么您就很幸运了!可能您创建的第一个计时器的id为0,您只是更改了一个计时器,而不是三个不同的计时器。
int CreateSocket()
{
//pthread_attr_t attr;
// Socket creation for UDP
acceptSocket = socket(AF_INET,SOCK_DGRAM,0);
if(acceptSocket == -1)
{
printf("Failure: socket creation is failed, failure code\n");
return 1;
}
else
{
printf("Socket started!\n");
}
memset(&addr, 0, sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(port);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
rc=bind(acceptSocket,(struct sockaddr*)&addr,sizeof(addr));
fcntl(acceptSocket, O_NONBLOCK);
if(rc== -1)
{
printf("Oh dear, something went wrong with bind()! %s\n", strerror(errno));
return -1;
}
else
{
printf("Socket an port %d \n",port);
}
return acceptSocket;
}
int create_timer (void)
{
timer_t timer_id;
int timerfd = timer_create (CLOCK_REALTIME, 0, &timer_id);
if (timerfd < 0) {
perror ("timerfd_create:");
return -1;
}
return timerfd;
}
int start_timer_msec (int fd, int msec)
{
struct itimerspec timspec;
memset (&timspec, 0, sizeof(timspec));
timspec.it_value.tv_sec = 0;
timspec.it_value.tv_nsec = msec * 1000 * 1000;
if (timer_settime(fd, 0, &timspec, NULL) < 0) {
return -1;
}
return 0;
}
int main(int argc, char *argv[])
{
Xcp_Initialize();
int fd_2ms = create_timer();
int fd_10ms = create_timer();
int fd_100ms = create_timer();
int rval = 0;
if ((fd_2ms < 0) || (fd_10ms < 0) || (fd_100ms < 0)) {
exit (1);
}
if ((sock = CreateSocket()) < 0) {
perror ("Create_socket");
// fclose (fp);
exit (1);
}
start_timer_msec (fd_2ms, 2);
start_timer_msec (fd_10ms, 10);
start_timer_msec (fd_100ms, 100);
do
{
socklen_t len;
int max_fd = 0;
fd_set rdfds;
FD_ZERO (&rdfds);
GET_MAX_FD (max_fd, sock);
FD_SET (sock, &rdfds);
GET_MAX_FD (max_fd, fd_2ms);
FD_SET (fd_2ms, &rdfds);
GET_MAX_FD (max_fd, fd_10ms);
FD_SET (fd_10ms, &rdfds);
GET_MAX_FD (max_fd, fd_100ms);
FD_SET (fd_100ms, &rdfds);
rval = select (max_fd, &rdfds, NULL, NULL, NULL);
if (rval < 0) {
if (errno == EINTR)
continue;
} else if (rval > 0) {
/*Process CLI*/
if ((FD_ISSET (sock, &rdfds)))
{
FD_CLR(sock, &rdfds);
len = sizeof(client);
printf("NEW DATA ARRIVED\n");
//non blocking mode : MSG_DONTWAIT
rc=recvfrom(sock, buf, 256, 0, (struct sockaddr*) &client, &len);
//I am calculating the time here
//InterruptTime = GetTimeStamp();
//measurements[17] = InterruptTime;
if(rc==0)
{
printf("Server has no connection..\n");
break;
}
if(rc==-1)
{
if (errno == SIGINT)
continue;
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
break;
}
ConfigureISR( );
XcpIp_RxCallback( (uint16) rc, (uint8*) buf, (uint16) port );
}
if ((FD_ISSET (fd_2ms, &rdfds))) {
FD_CLR(fd_2ms, &rdfds);
TASK1(Task2ms_Raster);
start_timer_msec (fd_2ms, 2);
}
if ((FD_ISSET (fd_10ms, &rdfds))) {
FD_CLR(fd_10ms, &rdfds);
TASK2(Task10ms_Raster);
start_timer_msec (fd_10ms, 10);
}
if ((FD_ISSET (fd_100ms, &rdfds))) {
FD_CLR(fd_100ms, &rdfds);
TASK3(Task100ms_Raster);
start_timer_msec (fd_100ms, 100);
}
}
} while (1);
close(sock);
//fclose (fp);
return 0;
}