2013-08-24 142 views
0

目前,我很難發現RPi上多線程C程序的問題。我已經編寫了一個依賴於兩個pthread的應用程序,其中一個從GPS設備讀取數據並將其寫入文本文件,另一個使用完全相同的溫度傳感器。在我的筆記本電腦上(英特爾®酷睿™i3-380M,2.53GHz),我的程序很好地工作並寫入我的文件,直到兩臺設備發送信息的頻率(分別爲10 Hz和500 Hz)。Raspberry PI上的多線程C程序

當我編譯並執行我的C程序在RPi上運行時,出現真正的問題;在RPi上運行我的程序的性能大大降低,我的GPS日誌文件以3赫茲的頻率寫入,溫度日誌文件以17赫茲的頻率寫入(每秒寫入17次測量值)。

我不真的知道我爲什麼在PI上運行我的代碼時遇到了這些性能問題。是否因爲RPi只有700 MHz ARM處理器,並且無法處理這種Multithreaded應用程序?還是因爲我的兩個線程程序擾亂了PI正常執行的良好工作?預先感謝很多人...... !!!

在這裏我的代碼。我只發佈了一個線程函數,因爲我只用一個線程測試了性能,而且它仍然以很低的頻率(〜4 Hz)寫入。起初,主要功能:

int main(int argc, char *argv[]) { 
    int s1_hand = 0; 
    pthread_t routines[2]; 
    printf("Creating Thread -> Main Thread Busy!\n"); 

    s1_hand = pthread_create(&(routines[1]), NULL, thread_2, (void *)&(routines[1])); 

    if (s1_hand != 0){ 
     printf("Not possible to create threads:[%s]\n", strerror(s1_hand)); 
     exit(EXIT_FAILURE); 
    } 
    pthread_join(routines[1], NULL); 

    void* result; 
    if ((pthread_join(routines[1], &result)) == -1) { 
     perror("Cannot join thread 2"); 
     exit(EXIT_FAILURE); 
    } 
    pthread_exit(NULL); 

    return 0; 
} 

現在,線程數2個功能:

void *thread_2(void *parameters) { 
    printf("Thread 2 starting...\n"); 
    int fd, chars, parsing, c_1, parse, p_parse = 1; 
    double array[3]; 
    fd = open("dev/ttyUSB0", O_RDONLY | O_NOCTTY | O_SYNC); 
    if (fd < 0){ 
     perror("Unable to open the fd!"); 
     exit (EXIT_FAILURE); 
    } 
    FILE *stream_a, *stream_b; 
    stream_a = fdopen(fd, "r"); 
    stream_b = fopen (FILE_I, "w+"); 
    if (stream_a == NULL || stream_b == NULL){ 
     perror("IMPOSSIBLE TO CREATE STREAMS"); 
     exit(EXIT_FAILURE); 
    } 
    c_1 = fgetc(stream_a); 
    parse = findit(p_parse, c_1, array); 
    printf("First Parse Done -> (%i)\n", parse); 
    while ((chars = fgetc(stream_a)) != EOF){ 
     parsing = findit(0, (uint8_t)chars, array); 
     if (parsing == 1){ 
      printf("MESSAGE FOUND AND SAVED -> (%i)\n", parsing); 
      fprintf(stream_b,"%.6f %.3f %.3f %.3f\n", time_stamp(), array[0], array[1], array[2]); 
     } 
    } 
    fflush(stream_b); 

    fclose(stream_b); 
    fclose(stream_a); 

    close(fd); 

    pthread_exit(NULL); 

    return 0; 
} 

注意,在我的線程2功能,我使用findit()函數的情況下,返回0或1找到並解析了來自gps的消息,在我的數組中寫入解析的信息(0找不到,1找到並解析)。函數time_stamp()只是調用clock_gettime(CLOCK_MONOTONIC,& time_stamp)函數,以便在每個寫入的事件上有時間參考。希望這些信息你們可以幫助我。謝謝!

+0

如果是你的Pi上的IO通道是罪魁禍首,我不會感到驚訝。一些儀器周圍的代碼與各個部分的時間輸出到第三個文件可能會泄露這一點。 – WhozCraig

回答

2

顯然,處理器能夠每秒運行20件事。我首先檢查你的文件系統性能。

編寫一個小程序,模擬寫入操作的方式,看看其性能如何。

除此之外,我建議這是任務交換導致延遲。嘗試沒有一個線程。你會得到什麼類型的表演?

但我猜這是文件系統。嘗試將寫入緩衝到內存中,並且每隔幾秒鐘執行一次大寫(4k +),我敢打賭這會讓您的系統更加快樂。

此外,發佈您的代碼。否則,我們所能做的只是猜測。

+0

+1我同意pi上潛在的IO通道不安。這並不是我的想象力。 – WhozCraig

+0

非常感謝你的回答傢伙。現在我張貼我的源代碼... – JIPers