我想写一个任务,对某些IO进行一些轮询 . 现在,我需要它不阻止cpu,而是每1微秒左右检查一次IO . 我是一个相对的VxWorks新手,只是意识到在我的轮询循环中插入_1789413可能不会做我需要它做的事情 . 我最好怎么做?
我已经发现 sysClkRateGet()
返回60,这不会阻止CPU中发生的其他事情,所以我猜 taskDelay()
不会对我这么做......还有什么能让我的停机时间缩短任务(超过1/60秒)?
edit
我想我已经发现,每执行一次执行我的短轮询功能的计时器就会更加明智 . 我触发了这样的计时器:
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 回答
posix定时器不会做你想要的,因为它是从系统时钟驱动的(正如你所指出的那样是60Hz) .
没有“内置”操作系统功能可以为您提供100KHz定时器 .
您必须在电路板上找到一些未使用的硬件定时器(CPU参考手册很有用)
您必须为您配置100KHz的定时器寄存器(再次参考手册是好的)
您必须将定时器中断线连接到您的函数:intConnect(vector,fn,arg)
VxWorks内核程序员手册包含有关编写中断服务程序的信息 .