我如何在 taskSpawn()、period() 和看门狗之间做出选择?
How do I decide between taskSpawn(), period(), and watchdogs?
我们正在为 VxWorks 实时操作系统使用嵌入式 C。
目前,我们所有的 UDP 连接都以 TaskSpawn() 开头。
This routine creates and activates a new task with a specified
priority and options and returns a system-assigned ID.
我们指定任务大小、优先级并传入入口点。
这些是连续的连接,因此每个入口点都包含一个无限循环,我们在下一次迭代之前延迟。
然后我发现了period()。
period spawns a task to call a function periodically.
Period 听起来像是我们应该使用的,但我找不到任何关于您何时更喜欢此功能而不是 TaskSpawn 的信息。 Period 也不允许指定任务大小或优先级,那么它是如何决定的呢?任务大小是动态的吗?优先事项是什么?
还有watchdogs。
Any task may create a watchdog timer and use it to run a specified
routine in the context of the system-clock ISR, after a specified
delay.
同样,这似乎符合以特定速率处理数据的目标。当任务必须以相同的速率(即实时)连续执行代码时,我应该选择哪个?
这3种方法有什么区别?
这里稍微说明一下:
taskSpawn(..)
创建一个任务,您可以随心所欲地做任何事情。
看门狗只能用于监视时间限制。请记住,看门狗的回调是在系统时钟 ISR 的上下文中执行的,它有很多限制(例如,可用堆栈大小,从不在 ISR 中使用阻塞函数调用,...)。此外,在系统时钟 ISR 中执行 "a lot of code" 会降低整个系统的速度。
period(..)
旨在成为 VxWorks shell 的助手,而不是被程序使用。
话虽这么说,你唯一的选择是使用 taskSpawn(..)
,除非你正在做一些非常简单的事情,在这种情况下 period(..)
可能没问题。
如果您需要在特定时间范围内循环执行操作,您可以查看计时器或 taskDelay(..)
结合 sysClkRateSet(..)
。
另一种选择是创建两个任务。一个在特定时间间隔后设置信号量,另一个 "worker" 任务等待这个信号量做某事。使用这种方法,您可以将 "timing" 与 "action" 分开,根据我的经验,这被证明是有益的。您可能还想使用看门狗监视 "worker" 任务的执行时间。
我们正在为 VxWorks 实时操作系统使用嵌入式 C。
目前,我们所有的 UDP 连接都以 TaskSpawn() 开头。
This routine creates and activates a new task with a specified
priority and options and returns a system-assigned ID.
我们指定任务大小、优先级并传入入口点。
这些是连续的连接,因此每个入口点都包含一个无限循环,我们在下一次迭代之前延迟。
然后我发现了period()。
period spawns a task to call a function periodically.
Period 听起来像是我们应该使用的,但我找不到任何关于您何时更喜欢此功能而不是 TaskSpawn 的信息。 Period 也不允许指定任务大小或优先级,那么它是如何决定的呢?任务大小是动态的吗?优先事项是什么?
还有watchdogs。
Any task may create a watchdog timer and use it to run a specified routine in the context of the system-clock ISR, after a specified delay.
同样,这似乎符合以特定速率处理数据的目标。当任务必须以相同的速率(即实时)连续执行代码时,我应该选择哪个?
这3种方法有什么区别?
这里稍微说明一下:
taskSpawn(..)
创建一个任务,您可以随心所欲地做任何事情。看门狗只能用于监视时间限制。请记住,看门狗的回调是在系统时钟 ISR 的上下文中执行的,它有很多限制(例如,可用堆栈大小,从不在 ISR 中使用阻塞函数调用,...)。此外,在系统时钟 ISR 中执行 "a lot of code" 会降低整个系统的速度。
period(..)
旨在成为 VxWorks shell 的助手,而不是被程序使用。
话虽这么说,你唯一的选择是使用 taskSpawn(..)
,除非你正在做一些非常简单的事情,在这种情况下 period(..)
可能没问题。
如果您需要在特定时间范围内循环执行操作,您可以查看计时器或 taskDelay(..)
结合 sysClkRateSet(..)
。
另一种选择是创建两个任务。一个在特定时间间隔后设置信号量,另一个 "worker" 任务等待这个信号量做某事。使用这种方法,您可以将 "timing" 与 "action" 分开,根据我的经验,这被证明是有益的。您可能还想使用看门狗监视 "worker" 任务的执行时间。