From mboxrd@z Thu Jan 1 00:00:00 1970 Message-ID: <46543C86.3040006@domain.hid> Date: Wed, 23 May 2007 15:07:18 +0200 From: Gilles Chanteperdrix MIME-Version: 1.0 References: <46543091.3040308@domain.hid> <465434B9.6010805@domain.hid> <46543535.5090106@domain.hid> In-Reply-To: <46543535.5090106@domain.hid> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Xenomai-help] loading module List-Id: Help regarding installation and common use of Xenomai List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Rodolfo Cc: Xenomai help 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 > #include > #include > #include > #include > #include > #include > #include > > 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