【问题标题】:How do I decide between taskSpawn(), period(), and watchdogs?如何在 taskSpawn()、period() 和 watchdogs 之间做出选择?
【发布时间】:2016-05-24 20:39:21
【问题描述】:

我们正在为 VxWorks 实时操作系统使用嵌入式 C。
目前,我们所有的 UDP 连接都以TaskSpawn() 开始。

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

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

然后我发现了period()

period 产生一个任务来周期性地调用一个函数。

Period 听起来像是我们应该改用的,但我找不到任何信息说明您何时更喜欢这个函数而不是 TaskSpawn。 Period 也不允许指定任务大小或优先级,那么它是如何决定的呢?任务大小是动态的吗?优先级是什么?

还有watchdogs

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

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

【问题讨论】:

    标签: c multithreading real-time vxworks


    【解决方案1】:

    这里有一点澄清:

    • taskSpawn(..) 会创建一个任务,让您可以随心所欲地做任何事情。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多