Hi Daniel,
I tried your example on my system and the timing works as expected, ie I
get an LED transition every 1 second. I am using rtai-1.3 and
Linux-2.2.14. I have attached the code for the example that I used,
hope that it helps,
Best regards,
Steve
daniel sheltraw wrote:
>
> Steve and others
>
> I hope I don't have to take Victors suggestion just yet (but maybe).
> Here is the pertinent code (obviously a highly edited version). The fifo
> handler is:
>
> int start_fifo_handler(unsigned int)
> {
> rtf_get(START_FIFO, &num_events, sizeof(int));
> rt_task_resume(&Task);
> return 1;
> }
>
> and the task looks like this:
>
> static void task_fun(int task_arg)
> {
> int n;
> RTIME time_incr = 1000000000;
>
> rt_task_suspend(&Task); /*The task to be resumed through START_FIFO*/
>
> /* oneshot mode task */
> start_time = rt_get_time();
> for(n=0; n<num_events; n++){
> rt_sleep_until(start_time + nano2count((n+1)*time_incr);
> /* Function to produce beeps on speaker on control an LED an
> the parallel port would go here*/
> }
> rt_task_suspend(&Task);
> }
>
> A user-space write to the fifo does start the task and pass the num_events
> value to the kernel-module but the timing is all wrong.
> As you can see the task should execute once per second but what I get
> is once per 2 seconds. If I remove the first rt_task_suspend the timing
> then works fine (but of course I can't start the task in the manner I wanted
> to).
>
> Thanks for any help,
> Daniel
>
> >From: Steve Papacharalambous <[EMAIL PROTECTED]>
> >To: daniel sheltraw <[EMAIL PROTECTED]>
> >CC: [EMAIL PROTECTED]
> >Subject: Re: [rtl] oneshot mode timing problem
> >Date: Sun, 16 Jul 2000 08:18:14 +0100
> >
> >Hi Daniel,
> >
> >Can you send me the pertinent code please,
> >
> >Best regards,
> >
> >Steve
> >
> >
> >daniel sheltraw wrote:
> > >
> > > Hello RT World
> > >
> > > I wrote to this mailing list previously with a somewhat less clear
> >version
> > > of this question. Please let me know if you need to see the pertinent
> >code
> > > to help with this problem.
> > >
> > > In case it influences the answer to the following question let it be
> >known
> > > that I am using 0.7 RTAI (I know... I will upgrade soon especially if
> >the
> > > 0.7 version is the source of my problem).
> > >
> > > I am using a fifo which when written to by a user-space program passes a
> > > single int and resumes a previously
> > > suspended task (by using a fifo handler). The problem is that if I use
> > > sleep_until and program certain events to occur at 1 second intervals
> >when I
> > > run the code I get 2 second intervals. If I omit the code from
> >user-space
> > > and the kernel module that uses the fifo to resume the task the
> >timinging
> > > works fine.
> > >
> > > So I guess my question is how can I properly resume a previous suspended
> > > task from within a fifo handler?
> > >
> > > Thanks all. Please bail me out again.
> > > Daniel
> ________________________________________________________________________
> Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com
>
> -- [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/
--
Lineo Industrial Solutions Group
Visit http://www.lineo.com/
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <asm/system.h>
#include <asm/smp.h>
#include <asm/bitops.h>
#include <asm/io.h>
#include <rtai.h>
#include <rtai_sched.h>
#include <rtai_fifos.h>
RT_TASK Task;
#define LPT_PORT 0x378
static int num_events = 0;
int start_fifo_handler(unsigned int arg)
{
rtf_get(4, &num_events, sizeof(int));
rt_task_resume(&Task);
return 1;
}
static void task_fun(int task_arg)
{
int n;
static int output = 0x0;
static RTIME start_time;
RTIME time_incr = 1000000000;
rt_task_suspend(&Task); /*The task to be resumed through START_FIFO*/
/* oneshot mode task */
start_time = rt_get_time();
for(n=0; n<num_events; n++) {
rt_sleep_until(start_time + nano2count((n+1)*time_incr));
/* Function to produce beeps on speaker on control an LED an
the parallel port would go here*/
output ^= 1;
outb(output, LPT_PORT);
}
rt_task_suspend(&Task);
}
// ------------------------------------------------------------------------
int init_module(void)
{
rtf_create(4, 100);
rt_task_init(&Task, task_fun, 0, 1000, 2, 0, 0);
rtf_create_handler(4, start_fifo_handler);
start_rt_timer_ns(1E8);
rt_task_resume(&Task);
return 0;
}
void cleanup_module(void)
{
rtf_destroy(4);
stop_rt_timer();
rt_task_delete(&Task);
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char **argv) {
int rtf_fd;
int out_buf = 0;
if(argc == 2) {
out_buf = atoi(argv[1]);
} else {
out_buf = 10;
}
printf("%s - output buffer: %d\n", argv[0], out_buf);
if((rtf_fd = open("/dev/rtf4", O_RDWR)) < 0) {
perror("open");
exit(1);
}
if(write(rtf_fd, &out_buf, sizeof(out_buf)) < 0) {
perror("write");
exit(1);
}
close(rtf_fd);
printf("%s completed okay\n\n", argv[0]);
}