hi, I've tried to use the function start_rt_timer(...) in my code but nothing happens. I've controlled that module rtcfg is loaded.
Could you tell me where have i to insert the start_rt_timer(...) in the code? I'm working in user space. code: // MASTER [M1] #ifdef HAVE_CONFIG_H #include <config.h> //lpx: ??? #endif #include <iostream> //lpx: ??? #include <cstdlib> //lpx: ??? #include <sys/socket.h> //lpx: socket, PF_INET, SOCK_DGRAM #include <netinet/in.h> //lpx: socket, PF_INET, SOCK_DGRAM #include <arpa/inet.h> // for inet_addre() //lpx: necessarie per cambiare la priorità di un processo #include <sys/time.h> #include <sys/resource.h> //lpx: necessario per sprintf() #include <stdio.h> //lpx: lettura del tempo #include <time.h> #include <rtnet.h> using namespace std; int main(int argc, char *argv[]) { RT_TASK *task_rt; //lpx: task real time int udpSocket; //lpx: Socket UDP int nFamily=AF_INET; //lpx: protocollo di rete: IP int nType=SOCK_DGRAM; //lpx: protocollo di trasporto: UDP int nProtocol = 0; //lpx: ??? int nAddr=INADDR_ANY; //lpx: Questo indirizzo int nPort=15000; //lpx: porta 5000,... // indirizzo interno struct sockaddr_in MyAdrs; //lpx: indirizzo IP memset( &MyAdrs, 0, sizeof( MyAdrs ) ); //lpx: azzero variabile // primo Socket MyAdrs.sin_family = nFamily; //lpx: tipo di indirizzo MyAdrs.sin_addr.s_addr = htonl( nAddr ); //lpx: indirizzo IP host MyAdrs.sin_port = htons( nPort ); //lpx: porta su cui collegarsi // indirizzi degli slave a cui mi devo connettere char slaveAddress[16] = "192.0.0.255\0"; int slavePort=6000; // l'inirizzo a cui invierò sarà di tipo broadcast struct sockaddr_in slaveAdrs; //indirizzo del server che si vuole connettere int len; //dimensione della struttura masterAdrs // i valori li otterro dal primo mesaggio che mi giunge memset(&slaveAdrs, 0, sizeof( slaveAdrs ) ); //lpx: azzero variabile // socket verso il primo slave S1 slaveAdrs.sin_family = nFamily; //lpx: tipo di indirizzo slaveAdrs.sin_addr.s_addr = inet_addr(slaveAddress); //lpx: indirizzo IP host slaveAdrs.sin_port = htons(slavePort); //lpx: porta su cui collegarsi const int BufferLen=256; //lpx: lunghezza buffer di trasmissione int BufferLenRx; char Buffer[BufferLen]; // lpx: punta ai dati da trasmettere char BufferRx[BufferLen]; //lpx: buffer di ricezione Buffer[0]=0; for (int j=1; j<BufferLen; j++) {// il Buffer[0] lo uso per inserire il numero di datagram Buffer[j]=j; } int flags=0; // lpx: vedi info sendoto() o recvfrom() int a,i; // a: ritorno errore , i indice const char SLAVE=2; //numero di slave unsigned long int slaveIP[SLAVE] = {inet_addr("192.0.0.235"),inet_addr("192.0.0.244")}; char response_slave[SLAVE]; //se uno slave risponde pongo a 1 il suo byte char i_slave; //indice slave char j_slave; //indice slave char flag_slave; struct sockaddr_in slaveRx; //indirizzo dello slave che ha risposto socklen_t lenRx; //dimensione della struttura masterAdrs int add_rtskbs=100; //numero di buffer in più da allocare per il socket int new_rtskbs; //contiene la quantità dei nuovi buffer realmente allocata RTIME t_start; //tempo in cui ho spedito il pkt RTIME t_stop; RTIME t_sum; //sommatoria delle differenze const int Npkt=100/*200000*/; //Numero di pkt da inviare :x1ora: 7.2M //nice(-15); long TimeOut; //timeout, espresso in ns // creo i socket udpSocket = socket_rt( nFamily, nType, nProtocol); //lpx: inizializzo un soket di tipo IP/UDP if (udpSocket<0) { printf("errore Socket non creato %d!\n",udpSocket); //devo rimuovere i socket precedentemente creati close_rt(udpSocket); //chiudo il socket exit(1); } //aggiungo nuovi buffer al socket new_rtskbs=ioctl_rt(udpSocket,RTNET_RTIOC_EXTPOOL,&add_rtskbs); if (new_rtskbs!=add_rtskbs) // buffer allocati sono in egual numero a quelli richiesti? { //non ho allocato tutti i buffer close_rt(udpSocket); printf("non creati new buffer = %d \n",new_rtskbs); exit(1); } printf("new buffer = %d \n",new_rtskbs); // faccio l'associazione tra soket e porta if (bind_rt(udpSocket,(sockaddr*)&MyAdrs,sizeof(MyAdrs))<0) //lpx: effettuo il Bind { //asssociazione nn riuscita close_rt(udpSocket); printf("errore BIND\n"); exit(1); } // setto il time_out TimeOut=500000000; //7ms ioctl_rt(udpSocket,RTNET_RTIOC_TIMEOUT,&TimeOut); // inizializzo il task real-time, tutti i metodi usati devono essere RT task_rt = rt_task_init(4901,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); } start_rt_timer(50000); 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 //memset(&response_slave, 0, sizeof( response_slave ) ); //lpx: azzero variabile */ for (i_slave=0; i_slave<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++; } // per chiudere gli slave rt_make_hard_real_time(); Buffer[0]=1; sendto_rt(udpSocket, Buffer, BufferLen,flags, (sockaddr*)&slaveAdrs,(socklen_t) sizeof(sockaddr)); rt_make_soft_real_time(); // Passo nella modalità non real time //rt_make_soft_real_time(); // chiudo il socket close_rt(udpSocket); // rimuovo il task rt_task_delete(task_rt); if (a<0) printf("errore %s!\n",strerror(a)); printf("flusso eseguito\n"); printf("tempo medio=%d\n",(t_sum/Npkt)*1000); return 0;// EXIT_SUCCESS; } ------------------------------------------------------- This SF.Net email is sponsored by the JBoss Inc. Get Certified Today Register for a JBoss Training Course. Free Certification Exam for All Training Attendees Through End of 2005. For more info visit: http://ads.osdn.com/?ad_idv28&alloc_id845&op=click _______________________________________________ RTnet-users mailing list RTnet-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rtnet-users