嵌入式开发:RTOS调试—当CPU有太多事情要做的时候

更新时间: 2022-11-19 15:25:39来源: 粤嵌教育浏览量:6069

  在嵌入式开发中,在使用多任务处理的嵌入式系统中,你可能会遇到某些任务运行缓慢或根本不运行的情况。这叫做任务饥饿(受影响的任务缺乏CPU时间),发生这种情况的原因有很多;今天我们来看看一个特殊的原因——一个固定的优先级计划,其中任务优先级碰巧是错误的,或者至少是不合适的。

  在具有固定优先级的场景中,开发人员需要在创建任务时为每个任务分配一个运行时优先级。显然,高优先级任务应该总是在低优先级任务之前执行,但是当低优先级任务收到的CPU时间太少而无法完成任务时,你可能会遇到资源匮乏问题。这可以在许多方面表现出来,例如,设备可能在大多数时间都工作正常,但有时会变得没有反应。

  一个简单的解决方法是提高受影响任务的优先级,但是这种想法最终会使优先级变得无用,因为每个任务都会变成“最高优先级”。相反,要非常小心哪些任务具有高调度优先级:将其保留给可预测的任务,以类似“每x毫秒”的循环模式执行,并且理想情况下,与循环间隔相比,执行时间也要短。

  

  保持关键部分较小

  因此,在嵌入式开发中,外部事件(如用户按下按钮或网络流量)的处理程序应该以相对较低的优先级执行,因为根据定义,这些事件几乎都是不规则事件,并且可以在任何时候调用处理程序。毫无疑问,执行时间长的任务也应该以低优先级执行。

  “但是,等等,”你现在可能会想,“我有时间关键的中断服务例程,需要大量的CPU时间来移动所有的数据。”在这种情况下,最好的解决方案是使用DMA等硬件功能来卸载处理器内核,但在其他情况下,将这种处理分成几个任务并在不同阶段使用不同的优先级通常是一个好主意。将真正时间关键的东西隔离在一个小的、高优先级的任务中,并让该任务提醒一个中等优先级的任务来完成大部分处理。你可能还有第三个阶段,在低优先级的任务中实现。

  当任务没有更多的工作要做时,让它们进入睡眠状态是非常重要的。你应该避免轮询和其他形式的繁忙等待;毕竟,这无异于浪费处理器时间。完成后,你的任务应该延迟自己或等待RTOS事件(例如,信号量信号),因为这将允许RTOS在任务等待时以较低的优先级调度任务。睡眠任务在适当的时候被RTOS唤醒。

  单调速率调度

  如果你有一个非常关键的系统,你可能想研究一下叫做单调速率调度(有效值)。这是一种正式的技术,用于计算一组任务的响应时间,给定它们各自的执行时间。在分析过程中,根据任务的执行时间为任务分配优先级,以便最快的任务以最高的优先级运行。

  在嵌入式开发中RMS可以向你正式保证任务饥饿不会发生,或者从另一个角度来看,告诉你系统需要多少处理能力来避免饥饿。另一方面,你需要有关于你的任务的非常好的信息——执行时间、周期等等——来进行分析。

免费预约试听课