2013-08-24 143 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