2014-05-22 5 views
0
uint64_t GetTimeStamp() 
{ 
    struct timespec start; 

    if ((clock_gettime(CLOCK_MONOTONIC, &start)) == -1) 
    { 
     perror("clock gettime\n"); 
    } 

    return(start.tv_sec + start.tv_nsec * 1e-9);    // seconds 
} 

const struct sigevent *intHandler(void *arg, int id) 
{ 
    start_clock = ClockCycles(); 
    // printf("start clock: %lld\n", start_clock); 

    return(&event); 
} 

void *ConfigureISR() 
{ 
    // Get IO privilege 
    ThreadCtl(_NTO_TCTL_IO, 0); 
    // Setup COID and event 
    SIGEV_INTR_INIT(&event); 

    interruptID = InterruptAttach(intrNum, intHandler, NULL, 0, 0); 
    if (interruptID == -1) 
    { 
     fprintf(stderr, "can't attach to IRQ %d\n", intrNum); 
     perror(NULL); 
     exit(EXIT_FAILURE); 
    } 

    while (loop) 
    { 
     InterruptWait(0, NULL); 
     end_clock = ClockCycles(); 
     InterruptLatency = (uint32) ((end_clock - start_clock) * 1000000/(SYSPAGE_ENTRY(qtime)->cycles_per_sec)); 
     printf("Current Interrupt Latency microseconds: %ld\n", InterruptLatency); 
     InterruptUnmask(intrNum, interruptID); 
     measurements[17] = InterruptLatency; 
    } 
    return(EXIT_SUCCESS); 
} 

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 main(int argc, char *argv[]) 
{ 
    pthread_t thread_id, thread_id1; 

    Xcp_Initialize(); 

    pthread_create(&thread_id1, NULL, &ConfigureISR, NULL); 

    if ((sock = CreateSocket()) < 0) 
    { 
     perror("Create_socket"); 
     exit(1); 
    } 

    if (pthread_create(&thread_id, NULL, &rastertask, NULL)) 
    { 
     perror("pthread_create"); 
     exit(1); 
    } 

    do 
    { 
     socklen_t len; 
     len = sizeof(client); 
     printf("NEW DATA ARRIVED\n"); 
     // non blocking mode : MSG_DONTWAIT 
     rc = recvfrom(sock, buf, 256, 0, (struct sockaddr *) &client, &len); 
     Receive = GetTimeStamp(); 
     receiveTime = (uint32) (Receive/1000000); 
     printf("Receive time: %lu\n", receiveTime); 
     // printf("RECEIVE from Time in microseconds: %lu\n", ReceiveTimestamp); 
     // measurements[19] = ReceiveTimestamp; 
     if (rc == 0) 
     { 
      printf("Server has no connection..\n"); 
      loop = 0; 
      break; 
     } 
     if (rc == -1) 
     { 
      if (errno == SIGINT) 
       continue; 
      printf("Oh dear, something went wrong with read()! s\n", strerror(errno)); 
      loop = 0; 
      break; 
     } 

     XcpIp_RxCallback((uint16) rc, (uint8 *) buf, (uint16) port); 
    } while (1); 


    close(sock); 

    return 0; 
} 

Вышеупомянутый код сервера, который принимает данные через IP-адрес и номер порта.Не получать UDP и выводить данные в многопоточной программе

Позже отправка данных обратно клиенту. Я получаю данные, но после получения данных беру отметку времени (вы можете увидеть в приведенном выше коде: Send= GetTimeStamp()).

Почему это ничего не печатает? Я получаю данные через сокет, и я дал printf("new data arrived\n");, а затем он не печатает. Я тоже не получаю там времени! Может ли кто-нибудь сказать мне, что может быть причиной?

+0

После получения данных в основной функции: он не печатает как полученные данные. Что-то странное :( – user3635707

+0

* формат * ваш код (используйте правильный отступ), * удалите * нерелевантные части, придумайте минимальный пример. –

ответ

0

Функция GetTimeStamp() возвращает uint64_t; возвращение утверждение:

return (start.tv_sec + start.tv_nsec * 1e-9); 

Это создает double значение (1e-9 является double константа), которая затем округляется до целого числа, так же, как если бы вы вернулись:

return (start.tv_sec); 

Обратите внимание, что это дает вам время в секундах (с эпохи - 1970-01-01 00:00:00 +00: 00).

Может быть, вы хотите:

return (start.tv_sec * 1E9 + start.tv_nsec); 

Это дает общее число наносекунд, начиная с эпохи. Это может быть касательно других проблем, которые у вас есть, но не получения разумных значений для отправки означает, что вы не получите разумных значений для получения, поэтому вы должны быть уверены в том, какое значение вы ожидаете от GetTimeStamp(). Например:

Receive = GetTimeStamp(); 
    receiveTime = (uint32) (Receive/1000000); 
    printf("Receive time: %lu\n", receiveTime); 

Это будет печатать значение, такие как 1400 (потому что текущая метка времени приблизительно 1400755363 = 2014-05-22 10:42:43), так что значение, деленное на 1 млн 1400.

+0

Это то, что находится в секундах? – user3635707

+0

Почему не печатает после получения данных! Я могу видеть данные в режиме отладки, но он ничего не печатает :( – user3635707