Leonardo Pappagallo wrote:
> hi,
> I have tried to use the Timeout handling for the function
> recvfrom_rt(...) in my code.
> But, when I start the program the function is always blocked, and my
> program doesn't stop. I'm working in user space.
>
> my code is the next:
>
> [...
> // set time_out
> TimeOut=500000000; //500ms
> ioctl_rt(udpSocket,RTNET_RTIOC_TIMEOUT,&TimeOut);
>
> // inizializzo il task real-time, tutti i metodi usati devono essere RT
> task_rt = rt_task_init(4907,1,0,0); //Id_Task, priorità, ...
> if (task_rt==NULL) // controllo che il task sia stato creato
> {
> close_rt(udpSocket); //chiudo il socket
> printf("task non creato\n");
> exit(1);
> }
>
> i=0; //i conta i segmenti
> t_sum=0;
> while (i<Npkt) //aspetto l'invio di 10 segmenti 1200000
> {
> *((long*)(&(Buffer[1])))=i;
> rt_make_hard_real_time();
> t_start=rt_get_time();
> a=sendto_rt(udpSocket, Buffer, BufferLen,flags,
> (sockaddr*)&slaveAdrs,(socklen_t) sizeof(sockaddr));
> // ricevo il segmento e lo reinvio al mittente
> for (i_slave=0; i_slave<SLAVE;) // I have 2 Slave
> {
> BufferLenRx=recvfrom_rt(udpSocket, BufferRx, sizeof(BufferRx),flags,
> (sockaddr*)&slaveRx,&lenRx );
> if (BufferLenRx==ETIMEDOUT)
> {//Time Out
> rt_make_soft_real_time();
> rt_task_delete(task_rt);
> close_rt(udpSocket);
> printf("TimeOut %d\n",BufferLenRx);
> exit(1);
> }
> //il confronto è tra due unsigned long
> for(j_slave=0; j_slave<SLAVE; j_slave++)
> {// controllo chi mi ha risposto
> if (slaveRx.sin_addr.s_addr==slaveIP[j_slave])
> {
> if (i==(*((long*)(&(BufferRx[1])))))
> {
> i_slave++;
> continue;
> }
> else
> {
> //errore uscita
> rt_make_soft_real_time();
> rt_task_delete(task_rt);
> close_rt(udpSocket);
> printf("dati errati\n");
> exit(1);
> }
> }
> }
> }
> t_stop=rt_get_time();
> rt_make_soft_real_time();
> t_sum+=((long)count2nano(t_stop-t_start)/1000);
> i++;
> }
>
> ...]
>
> do you have any idea?Typically a sign that the timer has not been started (start_rt_timer) or stopped accidentally (if you are running RTmac/TDMA+RTcfg, the rtcfg module will start the timer). Can't remember right now if RTAI provides information about the current timer state via /proc/rtai as Xenomai does. Jan
signature.asc
Description: OpenPGP digital signature

