看门狗在高中断率下触发

时间:2012-05-21 07:14:04

标签: c embedded

我正在研究客户提供的定制/专有RTOS。

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

情景是 -

  
      
  1. Renesas H8S控制器以20 MHz
  2. 运行   
  3. 我已配置以太网中断中断(LAN9221芯片正在中断)
  4.   
  5. 从OS控制器读取数据的OS任务在OS
  6. 中以最高优先级运行   
  7. 另一个OS任务TCP,它是系统中第二高优先级的任务
  8.   
  9. 参考看门狗的操作系统任务
  10.   

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

Watchdog配置为由OS的低优先级任务提供服务,以检测OS功能中的任何问题。

我怀疑ISR和更高优先级任务的频率不会让看门狗任务被安排。为了证实我的疑问,我已经在ISR中为看门狗提供服务,并且发现工作到2000包/秒。

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

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

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

同样在我的系统中,OS没有使用定时器中断运行(与其他OS运行一样)。 操作系统是循环操作并自愿放弃控制。因此,不可能将看门狗任务优先级提高到正常值以上,否则操作系统将始终以更高的优先级和准备就绪(看门狗在无限循环中刷新而不等待任何事件),并且其他任务将无法获得执行时间。 只有在某个事件上等待的任务才能具有高优先级。

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

4 个答案:

答案 0 :(得分:4)

尽量为看门狗提供更高优先级。

乍一看似乎有些不对劲。看门狗不应该获得高优先级,但这仅适用于没有负载的系统。在负载很重的情况下,调度会将监视器推回(毕竟它是低prio),这可能导致虚假的时间。

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

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

您还应该考虑设计糟糕的硬件或中断的错误映射。也许你可以给看门狗IRQ一个比网卡更高的优先级。这样,监管机构就可以及时处理中断,而无需为任务提供更高的优先级。

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

答案 1 :(得分:1)

在任何形式的实时应用程序中,根据定义,您需要100%了解正在发生的事情。您必须知道每个任务消耗的时间。通过切换引脚,使用示波器测量每项任务所需的时间。然后calculate这些时间用于整个系统。如果优先级较高的任务需要花费太多时间,那么显然狗会饿死。

如果由于非循环或非确定性行为而无法进行测量,则需要修复程序。如果看门狗处于高优先级任务中,那么对于任何具有较低prio的任务,您几乎都禁用它。你不妨完全关闭看门狗。

试用&错误补丁,给看门狗更高的prio,或增加CPU时钟,直到bug消失,这根本不是一种专业的方法。

但当然,硬件可能不足以为您提供如此高的数据负载。那么您可能别无选择,只能使用脏补丁或使用合适的MCU从头开始重新设计产品。

答案 2 :(得分:0)

这可能不是告诉如何做到这一点,你描述的架构应该工作。你需要做的是发现看门狗没有服务的原因。

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

您是否可能在高负载下死锁,以致系统实际上失败了?看门狗射击完全有效的情况。如果它实际上检测到系统故障,您不希望停止它 - 您想要修复系统故障。

答案 3 :(得分:0)

如果处理网络数据包的任务耗费大量时间,则会阻止负责刷新监视程序的任务获得CPU时间;那么系统无法处理高网络负载。看门狗问题只是这种情况的一个症状,无法处理高网络负载。问题

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