【问题标题】:Best task schedule strategies in embedded applications嵌入式应用程序中的最佳任务调度策略
【发布时间】:2019-09-05 14:05:43
【问题描述】:

我正在尝试找到一种更好的方法来组织嵌入式应用程序的子任务。我对电力电子应用更感兴趣。我不是软件工程师,而是电力电子工程师。但是,在大多数情况下,我需要开发代码。

在这些应用程序中,主程序将处于无限循环中,而控制算法将在 ISR(中断服务程序)中运行。但是,在某些应用程序中,需要额外的低优先级子任务(例如通信、警报处理)。由于时间限制,这些子任务不能在 ISR 例程中运行(控制算法具有更高的优先级)。我想知道处理嵌入式应用程序任务计划的最佳方法。

在下面的代码 sn-p 中,一种简单的方法是将所有子任务放入无限循环中(如果所有子任务具有相同的优先级)。应用程序将定期运行 ISR 例程(例如,每个切换周期)并使用剩余时间以循环方式运行子任务。但是,在这种方法中,所有子任务都将在未知的时间段内运行。因此,我将无法在这些任务中添加计时器例程(增量和检查)。此外,如果软件在低优先级任务中停留(由于某些错误代码),则不会执行其他任务(或将激活看门狗定时器)。

void main(void)
{
    Init();

    for(;;)      /* There is a ISR routine with the control Algorithm*/
    {
        SubTask1();

        SubTask2();

        SubTask3();
    }
}

可以使用其他 ISR 例程(例如,由定时器模块控制)并控制中断优先级以运行一项特定任务。但是,这种方法需要对设备进行更仔细的研究,才能正确设置所有中断优先级。

你知道更好的方法吗?哪种调度任务方法对嵌入式应用程序最有效?

【问题讨论】:

  • “最佳”算法是最适合您的特定应用程序的算法。从您的描述中无法判断它是什么。有许多不同的调度方案有据可查,您可以阅读这些并选择您最喜欢的一个。
  • 获取实时操作系统。 FreeRTOS 几乎总是一个不错的选择。
  • 这个范围很广。一种常见的设计方法是不允许任何任务执行忙等待。所以与其拥有while(!flag) {},不如说是if(!flag) return ;。也就是说,每个没有工作的任务都会优雅地让其他人进入。对于有错误的任务,唯一的解决方案是修复错误。
  • @yhyrcanus 但是如果程序很简单,那就太矫枉过正了。这听起来不像是 RTOS 合理的情况。
  • 我第二个'得到一个 RTOS'。

标签: c embedded scheduled-tasks


【解决方案1】:

这个问题涉及嵌入式软件的一些一般原则。

1) 将您在 ISR 中的工作限制在最低限度 2) 使用 RTOS 协调不同的活动 3) 通过将软件设计为事件驱动来提高性能

有效实现子任务的方法是将它们从轮询循环移动到事件驱动。如果它们是您想要定期检查的警报条件,请使用您的 RTOS 从计时器调用该代码。对于通信,让该代码阻塞等待事件,例如消息的到达。事件驱动的代码效率更高,因为它不必通过所有轮询来寻找要处理的事件。

事件驱动设计的工具(线程、定时器、阻塞等)由 RTOS 提供,第 3 点引出第 2 点)。如果有剩余的任务不是事件驱动的,RTOS 还可以解决您在未知时间和未知持续时间运行的子任务的问题。

最后,有多种原因可以限制您在 ISR 中的工作量。调试 ISR 代码更难。将 ISR 所做的事情与其他任务同步变得更加困难。另一种方法是与等待来自 ISR 的事件的高优先级任务执行相同的操作。

但最大的原因是未来的灵活性。在 ISR 中运行控制算法使得添加另一个高优先级任务变得困难。或者,控制算法可能会有新的要求来报告状态或写入磁盘。将代码移出 ISR 可为您提供更多选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多