【问题标题】:Reduce resource usage of an Idle task减少空闲任务的资源使用
【发布时间】:2010-06-13 04:30:46
【问题描述】:

我发现在 uC/OS-II RTOS 中,当没有其他任务准备好运行时,会执行一个空闲任务。如果一个空闲任务可以消耗资源,我们如何减少它?

【问题讨论】:

  • 你想减少什么?一个空闲任务本质上是while(nothing_ready_to_run) { no_op; } 没有什么可以优化的。
  • 空闲任务可能会消耗内存、电源或 I/O 资源。需要减少哪一项?
  • 内存和电源。有趣的是 I/O 资源在空闲任务期间被使用。如何使用 I/O 资源?
  • S.M:任何以优先级 1 运行的东西都可以被认为是空闲任务,因此空闲任务可以做任何事情。此外,您可以将代码放入OSTaskIdleHook,这样常规的空闲任务也可以做任何事情。如果你没有做任何一个,我不会担心空闲任务。
  • 我不禁认为你在这个问题和你发布的其他问题中汗流浃背。

标签: multithreading real-time embedded-resource rtos multitasking


【解决方案1】:

通常空闲任务是处理器进入低功耗(睡眠)模式的地方,如果它是一个低功耗系统并且处理器具有这样的模式。这通常是特定的汇编指令,例如在 ARM Cortex M3 上,您将执行“WFI”指令。在其他芯片上,可能在内核之外有一个特定的寄存器来管理电源(而不是指令)。

请注意,在进入低功耗模式之前,通常存在一些条件(必须满足的要求)。有时你需要在睡觉前锁定中断,有时解锁中断;检查你的芯片的数据表。

通常在进入低功耗模式之前,您会关闭所有不需要的外围设备。再次,检查您的芯片的数据表。此外,如果您要使用中断唤醒备份,请确保外围设备没有断电,并且启用了中断,否则,您将无法唤醒。

最后一点:通常在调试时(例如在 JTAG 设备的控制下),进入低功耗模式时会发生奇怪的事情,因此您希望在调试时禁用空闲任务中的“睡眠”,并且仅在运行时才这样做调试器。通常这是一个编译时决定(#ifdef ...)

【讨论】:

    【解决方案2】:

    典型的空闲循环可能会使用很少的处理器门,因此在内核中消耗的功率很少,但如果很关键,您可以在空闲循环中调用睡眠模式,这样根本不会执行任何代码 -核心刚刚停止。然而,为了保持实时响应,外围设备可能会保持供电并能够产生中断,因此在实践中收益可能很小。

    就其他资源而言,空闲循环通常只是指向当前指令的分支;一条指令,无数据;它不能比这小得多。提供了uC/OS-II的源码,大家可以看看!

    当然,如果您通过直接修改空闲任务或实现挂钩来扩展空闲任务,则资源使用完全在您的控制范围内,但您不能无所事事。

    【讨论】:

      猜你喜欢
      • 2021-09-02
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2019-01-14
      • 2021-10-18
      相关资源
      最近更新 更多