stdcerr
stdcerr

Reputation: 15608

polling task in VxWorks

I want to write a task that does some polling on some IOs. Now, I need it to not block the cpu but to check the IOs every 1 microsecond or so. I'm a relative VxWorks newbie and just realized that inserting a usleep(1); into my polling loop probably won't do what I need it to do. How do I best go about this?

I have figured out that sysClkRateGet() returns 60 which isn't good enough for me. I need to poll and react fast but can't block the other things that are going on in the CPU, so I guess taskDelay() won't do it for me... is there anything else that allows for a shorter downtime of my task (than 1/60 seconds)?

edit

I think I've figured out that it's much smarter to have a timer kicking in every 1us that executes my short polling function. i triggered the timer like this:

timer_t polltimerID;
struct itimerspec poll_time;
poll_time.it_value.tv_sec = 0;
poll_time.it_value.tv_nsec= 1000; 

poll_time.it_interval.tv_sec = 0;
poll_time.it_interval.tv_nsec= 1000; // execute it every 1us

if(timer_create (CLOCK_REALTIME, NULL, &polltimerID))
    printf("problem in timer_create(): %s",strerror(errno));

if(timer_connect (polltimerID,MyPollFunction,0))
    printf("problem in timer_connect(): %s",strerror(errno));

if(timer_settime (polltimerID, 0, &poll_time, NULL))
    printf("problem in timer_settime(): %s",strerror(errno));

But I'm not exactly sure yet, what the priority of the timer is and if (and how) it is able to preempt a current task, anyone?

Upvotes: 0

Views: 1036

Answers (1)

Benoit
Benoit

Reputation: 39064

The posix timer won't do what you want as it's driven off the system clock (which as you pointed out is at 60Hz).

There is no "built-in" OS function that will give you a 100KHz timer.

  • You will have to find some unused hardware timer on your board (CPU reference manual is useful)

  • You will have to configure the timer registers for you 100KHz (again Ref. Manual is good)

  • You will have to hook up the timer interrupt line to your function: intConnect (vector, fn, arg)

The VxWorks Kernel programmers manual has information about writing Interrupt Service Routines.

Upvotes: 2

Related Questions