我们将嵌入式C用于VxWorks实时操作系统 目前,我们所有的UDP连接都以TaskSpawn()开头。
此例程使用指定的创建并激活新任务 优先级和选项,并返回系统分配的ID。
我们指定任务大小,优先级,并传入入口点 这些是连续的连接,因此每个入口点都包含一个无限循环,我们在下一次迭代之前延迟。
然后我发现了period()。
period会产生定期调用函数的任务。
期间听起来像我们应该使用的,但我找不到任何关于何时比TaskSpawn更喜欢这个功能的信息。期间也不允许指定任务大小或优先级,那么如何确定?任务规模是否动态?优先权是什么?
还有watchdogs。
任何任务都可以创建一个看门狗定时器并使用它来运行指定的 在指定的之后,在系统时钟ISR的上下文中的例程 延迟。
同样,这似乎与以特定速率处理数据的目标一致。当任务必须以相同的速率(即实时)连续执行代码时,我选择哪一个? 这三种方法有什么区别?
答案 0 :(得分:2)
这里有一点澄清:
taskSpawn(..)
创建了一项任务,您可以随意与自己做任何事情。
看门狗只能用于监控时间限制。请记住,看门狗的回调是在系统时钟ISR的上下文中执行的,它具有许多限制(例如,自由堆栈大小,从不在ISR中使用阻塞函数调用,......)。另外执行"很多代码"在系统时钟中,ISR会降低整个系统的速度。
period(..)
旨在成为VxWorks shell的助手,而不是程序使用。
说到你的唯一选择就是使用taskSpawn(..)
,除非你做了一些非常简单的事情,period(..)
可以使用。
如果您需要在特定时间范围内循环执行某些操作,可以查看计时器,或taskDelay(..)
与sysClkRateSet(..)
结合使用。
另一种选择是创建两个任务。一个是在特定时间间隔之后设置信号量而另一个是" worker"任务等待这个信号量做某事。通过这种方法,您可以分开"计时"来自"行动"根据我的经验证明这是有益的。您还可能希望监控"工作人员的执行时间。通过使用看门狗来完成任务。