c - 我如何在 taskSpawn()、period() 和看门狗之间做出选择?

标签 c multithreading real-time vxworks

我们正在为 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 中执行“大量代码”会降低整个系统的速度。

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

话虽如此,你唯一的选择是使用 taskSpawn(..) 除非你正在做一些非常简单的事情,在这种情况下 period(..) 可能可以使用。

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

另一种选择是创建两个任务。一个在特定时间间隔后设置信号量,其他“工作”任务等待该信号量做某事。通过这种方法,您可以将“时间”与“行动”分开,根据我的经验,这被证明是有益的。您可能还想通过使用看门狗来监视“worker”任务的执行时间。

关于c - 我如何在 taskSpawn()、period() 和看门狗之间做出选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37423432/

相关文章:

c - 在 C 程序中获取段错误

c - int (*ptr)[4] 的真正含义是什么,它与 *ptr 有何不同?

c - 如何在C中存储void的返回值?

c - K 和 R 逆波兰表示法

java - OSGI 包和线程

android - 具有实时框架的内容提供者 [PubNub]

c# - 我对字典的使用需要锁定吗?

c - NtQueryInformationThread 在我的代码中总是失败?

java - 在 java 中录制音频并实时确定是否播放了 x 频率的音调(如果播放)

javascript - jQuery map 实时数据更新