1

我正在开发由我的客户提供的定制/专有 RTOS。

RTOS 使用具有优先级抢占的循环调度。

情景是——

  1. 瑞萨 H8S 控制器以 20 MHz 运行
  2. 我已经为以太网中断配置了中断(LAN9221 芯片正在中断)
  3. 从 LAN 控制器读取数据的 OS 任务在 OS 中以最高优先级运行
  4. 另一个操作系统任务 TCP,它是系统中优先级第二高的任务
  5. 一个引用看门狗的操作系统任务

我已经生成了网络流量来模拟网络上的轰炸情况。问题是以太网 ISR 看门狗的高数据速率(超过 500 个数据包/秒)被触发,配置为 1 秒。

看门狗配置为由操作系统的较低优先级任务提供服务,以检测操作系统功能中的任何问题。

我怀疑 ISR 和更高优先级任务的频率不会让看门狗任务被安排。为了证实我的怀疑,我已经为 ISR 本身的看门狗提供了服务,发现它的工作速度为 2000 个数据包/秒。

您能否建议如何处理这种情况,以便即使在更高的数据/中断率下看门狗也不会触发。

看门狗在以正常操作系统优先级运行的操作系统任务中刷新,这有助于捕获无限循环。

操作系统优先级最高的任务是以太网数据包读取任务。当以太网接收数据包时会引发一个硬件中断,并且在 ISR 中我们安排等待以太网数据包读取任务。

同样在我的系统中,操作系统没有使用定时器中断运行(就像其他操作系统运行一样)。操作系统是循环的并自动放弃控制。因此,不可能将看门狗任务的优先级提高到高于正常水平,否则操作系统将始终发现它处于更高的优先级并准备就绪(看门狗在无限循环中刷新,不等待任何事件),其他任务将没有时间执行。只有等待某个事件的任务才能具有高优先级。

所以问题是看门狗任务没有时间刷新,因为频繁的中断和高优先级任务的连续调度(以太网数据包读取)。

4

4 回答 4

4

试着给你看门狗更高的优先级。

乍一看,这似乎是错误的。看门狗不应该获得高优先级,但这仅适用于负载不重的系统。在重负载下,调度会将看门狗向后推(毕竟它是低优先级的),这可能会导致虚假超时。

给看门狗一个高优先级不应该对性能产生很大的影响(这是一个小任务,不经常运行,由中断触发),但要确保它不会饿死。

缺点是你不能再捕获无限循环(因为循环现在可以被看门狗中断)。

您还应该考虑设计不良的硬件或不良的中断映射。也许你可以给看门狗IRQ比网卡更高的优先级。这将允许看门狗及时处理其中断,而不必为任务赋予更高的优先级。

或者,您可以尝试在处理网络数据包时增加计数器。一个新的、高优先级的看门狗线程可以监视这个计数器并重新配置低优先级的看门狗任务,只要计数器发生变化就不会触发。

于 2012-05-21T08:35:50.193 回答
1

In any form of real-time application you need, by definition, to be 100% aware of what is going on. You must know how much time each task consumes. Measure the time needed for each task with an oscilloscope by toggling a pin. Then calculate these times for the whole system. If the higher priority tasks take too much time, well, then obviously the dog will starve.

If this is too complex to measure because of acyclic or non-deterministic behavior, the program needs to be fixed. If the watchdog sits in a high priority task, you have pretty much disabled it for any task with lower prio. You might as well shut the watchdog off entirely then.

Trial & error patches, giving the watchdog higher prio, or increasing the CPU clock until the bug goes away is simply not a professional approach.

But then of course, the hardware might not be sufficient to service such a high data load as you expect. Then you may have no other option but to either use dirty patches or re-design the product from scratch with a suitable MCU.

于 2012-05-22T06:45:21.030 回答
0

如果处理网络数据包的任务消耗了太多时间,导致负责刷新看门狗的任务无法获得 CPU 时间;则系统无法处理高网络负载。看门狗问题只是这种“无法处理高网络负载”问题的症状。

解决方案是使用更快的 CPU、降低网络速度、减少处理数据包的开销,或者这些选项的某种组合;这样系统就可以处理高网络负载(并且刷新看门狗的任务确实可以运行)。请注意,“处理高网络负载”可能包括丢弃数据包,这是处理网络拥塞的正常/已建立的方法。

于 2012-05-21T18:57:38.763 回答
0

您描述的架构应该可以工作,这可能不是告诉如何去做的问题。您需要做的是找出为什么看门狗没有得到服务。

如果您的 RTOS 没有用于调试和测试的仪器或工具,您可以在看门狗循环中添加 I/O 切换并使用示波器观察它 - 它停止切换的所有时间段都是更高优先级任务或中断正在运行的时间 - 如果这发生超过一秒钟,看门狗将触发。然后,您可以将类似的工具添加到您的其他任务和 ISR 中,以查看花费时间的内容。

您是否有可能在高负载下死锁以致系统实际上出现故障?看门狗触发完全有效的情况。如果它实际上检测到系统故障,您不想停止它 - 您想修复系统故障。

于 2012-05-21T18:23:45.050 回答