0

我想编写一个对某些 IO 进行轮询的任务。现在,我需要它不要阻塞 CPU,而是每 1 微秒左右检查一次 IO。我是一个相对的 VxWorks 新手,刚刚意识到usleep(1);在我的轮询循环中插入 a 可能不会做我需要它做的事情。我如何最好地解决这个问题?

我发现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));

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

4

1 回答 1

2

posix 计时器不会做你想做的事,因为它被驱动了系统时钟(正如你所指出的那样,它是 60Hz)。

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

  • 您将不得不在您的板上找到一些未使用的硬件计时器(CPU 参考手册很有用)

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

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

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

于 2013-11-16T02:12:28.633 回答