Hello,

I want to use a thread for doing some fp ops. The thread is called by a callback 
function (comedi_callback). The problem is, after the thread was created
the system hangs. Why ? Who has experience (maybe with some code examples)
with comedi callback?

Thanks  Olaf

Here are the code:

void *thread_code(void *param) 
{
    static size_t ctr = 0; 
    static char buf[80];  
    while(1) { 

        sprintf(buf, "%10d\n", ctr++); 
        rtf_put(1, buf, 11);  
        pthread_suspend_np(pthread_self()); 
        rtl_printf("suspended pthread self\n");
     }  

    return 0; 
}                                                                             
      
int callback(unsigned int flags, void *arg)
{
    //pthread_wakeup_np(rt_thread);
 
    return 1;
}   

    int init_module(void)
{
    int ret = 0;
    pthread_attr_t attr;
    struct sched_param sched_param;
 
    // install rtf
    rtf_destroy(1);
    ret = rtf_create(1, 4096);                                                         
                                                                        
   [...]

    // lock the subdevices
    comedi_lock_ioctl(ai_dev,ai_subdev);
    comedi_lock_ioctl(ao_dev,ao_subdev);
 
    // ... create the realtime task with the default function
    pthread_attr_init(&attr);
    //pthread_attr_setstacksize(&attr, THREAD_STACK_SIZE);
    //sched_param.sched_priority = 100;
    //pthread_attr_setschedparam(&attr, &sched_param);
 
    rtl_printf("create thread\n");
    if((ret = pthread_create(&rt_thread, &attr, thread_code, (void *)0)) != 0) {
        rtl_printf("unable to create realtime thread (error %d) !\n", ret);
    }
 
    rtl_printf("set FP on thread\n");
    if((ret = pthread_setfp_np(rt_thread, 1)) != 0) {
        rtl_printf("unable to use floating-point operations in realtime thread (error 
%d) !\n",
                   ret);
    }                                                                                
 
#if 0
    rtl_printf("register our callback function\n");
    ret=comedi_register_callback(ai_dev, ai_subdev, COMEDI_CB_EOS, &callback, (void 
*)0);
 
    /* start acq. */
    ret=comedi_trig_ioctl(ai_dev,ai_subdev,&ai_trig);
#endif                                                                          

    rtl_printf("comedi_callback module started\n");
 
    return 0;
}
 
void cleanup_module(void)
{
    comedi_cancel_ioctl(ai_dev,ai_subdev);
    comedi_unlock_ioctl(ai_dev,ai_subdev);
    comedi_unlock_ioctl(ao_dev,ao_subdev);
 
    pthread_suspend_np(rt_thread);
    pthread_setfp_np(rt_thread, 0);
    pthread_delete_np(rt_thread);
 
    rtf_destroy(1);
 
    rtl_printf("comedi_callback stopped\n");
}                                                                                    
-- [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