Rodolfo wrote:
> Gilles Chanteperdrix wrote:
> 
>>Rodolfo wrote:
>>  
>>
>>>Hi,
>>>I am totally new to Xenomai and have no experience with RTAI. I'm trying
>>>to load a kernel module that uses the native API for testing, but I get
>>>the following segmentation fault. Can anyone help me out??
>>>    
>>
>>Please post here the sources of your module.
>>
>>  
> 
> 
> 
> here's the source of the testing module.
> 
> #include <linux/module.h>
> #include <linux/kernel.h>
> #include <linux/proc_fs.h>
> #include <native/task.h>
> #include <native/types.h>
> #include <native/timer.h>
> #include <rtdm/rtdm_driver.h>
> #include <nucleus/pod.h>
>  
> MODULE_LICENSE("GPL");
> MODULE_DESCRIPTION("Hello World Xenomai Application");
>  
> /************************* Global Variables ******************************/
>  
> RT_TASK thread;
> RTIME timer_period_ns;
> RTIME task_period_ns;
> RTIME expected;
> int timer_period_counts;
> unsigned long overrun; // rt_task_wait_period() writes here overrun
> count.0 if everything OK
>  
> /************************* Periodic realtime thread **********************/
>  
> void fun(int dummy) {
>     int count = 0;
>     while(1) {
>         ++count;
>         rt_task_wait_period(&overrun);

Before calling rt_task_wait_period, you should have called
rt_task_set_periodic. Here, rt_task_wait_period will continuously return
 -EWOULDBLOCK and you will get a hard lockup.

>         if ((count%100)==0) {
>             rtdm_printk("Periode %d ist abgelaufen\n",count);
>         }
>     }
> }
>  
> /************************* Initialisation *******************************/
>  
> static int hello_init(void)
> {
>     //testing rt_task_create(...);
>     int count = 0;
>     printk("task create");
>     rt_task_create(&thread,"fun_task",3000,1,0);
>     printk("created..");
>     printk("task start");
>     rt_task_start(&thread,fun,0);

At this point you do not know if rt_task_create succeeded, since you did
not check its return value.

>     printk("started........");
>  
>      
>  
>     //timer_period_ns = 10000000;/*10ms*/
>     /*timer_period_counts = start_rt_timer(nano2count(timer_period_ns));*/
>    
> //timer_period_counts=rt_timer_set_mode(rt_timer_ns2tsc(timer_period_ns));

Setting the timer to periodic mode results in a lower timer resolution.
Aperiodic mode, the default is usually fine.

>     /* Calculate the start time for the task. */
>     /* We set this to "now plus 10 periods"   */
>     //expected = xnpod_get_time()  + 10 * timer_period_counts;

xnpod_get_time is not part of the native API, what you want is
rt_timer_read.

>  
>     /* Task period initialization */
>     //task_period_ns =50000000;/*5ms*/
>     /*rt_task_make_periodic(&thread, expected,
> nano2count(task_period_ns));*/
>     //rt_task_set_periodic(&thread, expected,
> rt_timer_ns2tsc(task_period_ns));
>     return 0;
> }
>  
> /************************* Cleanup *********************************/
>  
> static void hello_exit(void)
> {
>   /*stop_rt_timer();*/
>  
>   /* Now delete our task */
>  // rt_task_delete(&thread);
> }
>  
> module_init(hello_init);
> module_exit(hello_exit);

Why do you want to use Xenomai in kernel-space ? Since, as you said it,
you are a beginner, you should use Xenomai in user-space. There, gdb
will help you debug your segmentation faults.

-- 
                                                 Gilles Chanteperdrix

_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to