2015-06-15 4 views
0
static int pthrd_setthread_prio(int thred_prio) 
{ 
    int      thrd_policy = SCHED_RR; 
    struct sched_param   thr_prio; 
    int      res=0; 

    thr_prio.sched_priority = thred_prio; 

    /* Try setting the thread/process priority via pthread */ 
    res = pthread_setschedparam( pthread_self(), 
           thrd_policy, 
           (const struct sched_param*) &thr_prio); 

    //pthread_setschedparam has two return values 0 on successs, >0 on failure 
    if(res != 0) 
    { 
     deb_err("pthread_setschedparam failed withe error %d\n",res); 
    } 

    res = pthread_getschedparam(pthread_self(), 
           &thrd_policy, 
           &thr_prio); 
    if(res < 0) 
    { 
     deb_err("pthread_getschedparam failed\n"); 
    } 

    printf("Thread policy %s priority %d process id %ld\n", \ 
        ((thrd_policy == SCHED_FIFO) ? "SCHED_FIFO" : 
        (thrd_policy == SCHED_RR) ? "SCHED_RR" : 
        (thrd_policy == SCHED_OTHER) ? "SCHED_OTHER" : "???"), thr_prio.sched_priority, syscall(SYS_gettid)); 

    if ((thr_prio.sched_priority != thred_prio) || (thrd_policy != SCHED_RR)) 
    { 
     deb_err("Thread priority == %d, this should be %d ERROR! using pthread\n",thr_prio.sched_priority ,thred_prio); 
     res=-1; 
    } 

    return (res); 
} 

С вышеприведенным кодом, используемым для установки приоритета нити и создания потока-2, моя система зависает в определенной точке.Проблема с pthread_setschedparam, система зависает

Я установил сеанс telnet и использовал команду «ps -ef», чтобы проверить приоритет в реальном времени для потока-2 и правильно увидеть его набор. Но на более позднем этапе его вызывающая система зависает. Я подтвердил это, удалив эту конкретную функцию и назначив приоритет по умолчанию для потока.

Может кто-нибудь, пожалуйста, дайте мне знать, если мне что-то не хватает?

+0

Hi Olaf, не зависящий от встроенных устройств/систем, но где код реализован во встроенном устройстве. – Murali

+0

Привет, Олаф и все спасибо за поддержку. Я попытался увеличить приоритет потока родительского потока, и он решил проблему. В нашем дизайне подобный thread2 (дочерний поток) передает данные в thread1 (родительский поток) путем непрерывного опроса на каждые 100 мсек. В противном случае оба должны иметь более высокий приоритет, мы в конечном итоге сталкиваемся с проблемой повесить. Увеличение проблемы с приоритетом до максимума устраняет эту проблему. – Murali

+0

Как бы я хотел похвалиться, но я уверен, что это не я, чтобы поблагодарить. Поскольку он, очевидно, не связан со встроенным, я могу предложить удалить «встроенный» -tag? Просто не путать других. – Olaf

ответ

1

Вы настраиваете политику планирования в реальном времени в своем потоке. Это означает, что только задачи с более высоким приоритетом в реальном времени могут вытеснить его, поэтому, если ваш поток входит в бесконечный цикл (или просто очень долго работает), где он потребляет процессор и не блокирует его, он будет голодать от других задач, не связанных с реальным временем.

Тяжелые потоки, которые не блокируются, должны, вероятно, не иметь политики планирования в реальном времени.

+0

Привет, спасибо, за информацию. Это имеет смысл теперь, потому что созданный поток (после установки выше политики и приоритета) имеет цикл, который имеет опрос, который просыпается каждые 100 мс для чтения данных с драйвера более низкого уровня. Есть ли альтернатива этому. Основная цель этого потока - собрать данные с данных USB более низкого уровня за каждые 100 секунд (если есть) – Murali

+0

@Murali: Можете ли вы обновить свой вопрос кодом, отображающим цикл 'poll()? – caf

+0

Привет Caf, я попытался увеличить приоритет потока родительского потока, и он решил проблему. В нашем дизайне подобный thread2 (дочерний поток) передает данные в thread1 (родительский поток) путем непрерывного опроса на каждые 100 мсек. В противном случае оба должны иметь более высокий приоритет, мы в конечном итоге сталкиваемся с проблемой повесить. Увеличение проблемы с приоритетом до максимума устраняет эту проблему. Спасибо за поддержку. – Murali

0

Я попытался увеличить приоритет потока родительского потока, и он решил проблему. В нашем дизайне подобный thread2 (дочерний поток) передает данные в thread1 (родительский поток) путем непрерывного опроса на каждые 100 мсек. В противном случае оба должны иметь более высокий приоритет, мы в конечном итоге сталкиваемся с проблемой повесить. Увеличение проблемы с приоритетом до максимума устраняет эту проблему.

Смежные вопросы