Well, the first thing i can pick out that might be making this not
work is that you need to set the scheduling for the thread where you do the
wait.  See below where i inserted code as to how i would do it.

On Tue, Jan 09, 2001 at 07:58:38PM +0100, Peter Helbig wrote:
> Hello Everybody! 
> 
> I updated from rtlV2.2 to V3.0p10 and found a different behaviour of  
> pthread_make_periodic_np(...,...,0). In V2.2 it works as suspected: The 
>  thread is called once and is sentenced to wait with a 
> pthread_wait_np()  afterwards.  In V3.0p10 the call of 
> pthread_wait_np() blocks the thread  forever. 
> 
> Code example: 
> 
> void *thread_code(void *param) 
> { 
> 
        struct sched_param my_sparam;
> // blabla 
> --------------- snip ----------------------------------------------- 
>     do 
>      { 
>            min_diff = 2000000000; 
>             max_diff = -2000000000; 
> 
>         for (i = 0; i < ntests; i++) 
>         { 
>                 now = clock_gethrtime(rtl_getschedclock()); 
>                  if (advance && !mode) 
>                  { 
>                       if (now < expected) 
>                       { 
>                              rtl_delay (expected - now); 
>                       } 
>                         now = clock_gethrtime(CLOCK_UST); 
>                   } 
> 
>                         /* start of next time element */ 
>                         do_rayonic_start(); 
>                         do_rayonic(loops); 
>                         do_rayonic_fini(); 
> 
>                         /* finished user part of measurement */ 
>                         fini = clock_gethrtime(rtl_getschedclock()); 
>                         samp.fini = fini; 
> 
>                         /* calculate time for next activation */ 
>                         /* 1) difference from expectation */ 
>                         diff = now - expected; 
>                         samp.diff = diff; 
>                         if (diff < min_diff) 
>                         { 
>                                 min_diff = diff; 
>                         } 
> 
>                         if (diff > max_diff) 
>                         { 
>                                 max_diff = diff; 
>                         } 
> 
>                         /* 2) theoretical sleeping duration */ 
>                         sleepfor = CYCLETIME-(fini-now); 
>                         samp.sleepfor = sleepfor; 
> 
>                         /* 3) adaptive control towards expected time */ 
>                         sleepfor -= diff; 
> 
>                         /* 4) avoid processor overload */ 
>                         expected += CYCLETIME; 
>                         while (sleepfor < MAXLOAD) 
>                         { 
>                                 sleepfor += CYCLETIME; 
>                                 expected += CYCLETIME; 
>                                 samp.skipped ++; 
>                         } 
> 
>                         /* 5) absolute time for reactivation */ 
>                         sleepto = (now+sleepfor); 
>                         samp.sleepto = sleepto; 
> 
        my_sparam.sched_priority = 1;

        if (
            (retval =
             pthread_setschedparam(pthread_self(), SCHED_FIFO,
                                   &my_sparam)) != 0) {
                return (void *) retval;
        }

>                         pthread_make_periodic_np 
> (pthread_self(),sleepto,0); 
> //++++++++++++++++++++++++++++++++++++++++++++++++ 
>                       // In V3.0p10 the next call blocks the thread 
> forever, 
>                       // in V2.2 it works properly....         
> //++++++++++++++++++++++++++++++++++++++++++++++++ 
>                      pthread_wait_np(); 
>                 } 
> 
>                 samp.min = min_diff; 
>                 samp.max = max_diff; 
>                 write (fifo_monitor, &samp, sizeof(samp)); 
> 
>         } while (1);    // endless... 
>                                                                      
> ----------------- snap 
> ----------------------------------------------------------- 
> } // thread end 
> 
> 
> Any hints will be welcome! 
> 
> 
> Peter 
> 
> 
> Peter Helbig
> Rayonic Sensor Systems GmbH
> Entwicklung Software
> Bayreuther Strasse 108
> D-91301 Forchheim
> 
> Tel: ++49 (0) 9191 72 818-0
> Fax: ++49 (0) 9191 640 333
> Email: [EMAIL PROTECTED]
> http://www.rayonic.de
> -- [rtl] ---
> To unsubscribe:
> echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> echo "unsubscribe rtl " | mail [EMAIL PROTECTED]
> ---
> For more information on Real-Time Linux see:
> http://www.rtlinux.org/rtlinux/
> 
> 
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
---
For more information on Real-Time Linux see:
http://www.rtlinux.org/rtlinux/

Reply via email to