VxWorks中的轮询任务

时间:2013-11-13 22:16:39

标签: loops multitasking polling vxworks

我想编写一个对某些IO进行轮询的任务。现在,我需要它不阻止cpu,而是每1微秒左右检查一次IO。 我是一个相对的VxWorks新手,只是意识到在我的轮询循环中插入usleep(1);可能不会做我需要它做的事情。我最好怎么做呢?

我已经发现sysClkRateGet()会返回60,这对我来说还不够好。我需要快速轮询和反应,但不能阻止CPU中发生的其他事情,所以我想taskDelay()不会为我做这个......还有什么可以让我更短我的任务停机时间(超过1/60秒)?

修改

我想我已经发现,在每1us执行我的短轮询功能时,让计时器踢得更聪明。 我按这样触发了计时器:

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));

但是我还不确定,计时器的优先级是什么,以及是否(以及如何)能够抢占当前任务,任何人?

1 个答案:

答案 0 :(得分:2)

posix定时器无法按照系统时钟的速度执行操作(正如您所指出的那样是60Hz)。

没有“内置”操作系统功能可以为您提供100KHz定时器。

  • 您必须在电路板上找到一些未使用的硬件定时器(CPU参考手册很有用)

  • 您必须为您配置100KHz的定时器寄存器(再次参考手册是好的)

  • 您必须将定时器中断线连接到您的函数:intConnect(vector,fn,arg)

VxWorks内核程序员手册提供了有关编写中断服务程序的信息。