我如何在taskSpawn(),句点()和看门狗之间做出决定?

时间:2016-05-24 20:39:21

标签: c multithreading real-time vxworks

我们将嵌入式C用于VxWorks实时操作系统 目前,我们所有的UDP连接都以TaskSpawn()开头。

  

此例程使用指定的创建并激活新任务   优先级和选项,并返回系统分配的ID。

我们指定任务大小,优先级,并传入入口点 这些是连续的连接,因此每个入口点都包含一个无限循环,我们在下一次迭代之前延迟。

然后我发现了period()

  

period会产生定期调用函数的任务。

期间听起来像我们应该使用的,但我找不到任何关于何时比TaskSpawn更喜欢这个功能的信息。期间也不允许指定任务大小或优先级,那么如何确定?任务规模是否动态?优先权是什么?

还有watchdogs

  

任何任务都可以创建一个看门狗定时器并使用它来运行指定的   在指定的之后,在系统时钟ISR的上下文中的例程   延迟。

同样,这似乎与以特定速率处理数据的目标一致。当任务必须以相同的速率(即实时)连续执行代码时,我选择哪一个? 这三种方法有什么区别?

1 个答案:

答案 0 :(得分:2)

这里有一点澄清:

  • taskSpawn(..)创建了一项任务,您可以随意与自己做任何事情。

  • 看门狗只能用于监控时间限制。请记住,看门狗的回调是在系统时钟ISR的上下文中执行的,它具有许多限制(例如,自由堆栈大小,从不在ISR中使用阻塞函数调用,......)。另外执行"很多代码"在系统时钟中,ISR会降低整个系统的速度。

  • period(..)旨在成为VxWorks shell的助手,而不是程序使用。

说到你的唯一选择就是使用taskSpawn(..),除非你做了一些非常简单的事情,period(..)可以使用。

如果您需要在特定时间范围内循环执行某些操作,可以查看计时器,或taskDelay(..)sysClkRateSet(..)结合使用。

另一种选择是创建两个任务。一个是在特定时间间隔之后设置信号量而另一个是" worker"任务等待这个信号量做某事。通过这种方法,您可以分开"计时"来自"行动"根据我的经验证明这是有益的。您还可能希望监控"工作人员的执行时间。通过使用看门狗来完成任务。