我的工作是一个定制的/专有的RTOS提供的我的客户。
RTOS采用优先抢占的循环调度方式。
情景是-
我已经生成了网络流量来模拟网络上的轰炸条件。问题在于以太网上的高数据速率(超过500个数据包/秒),ISR看门狗被触发,被配置为1秒。
看门狗被配置为由操作系统的低优先级任务提供服务,以检测OS功能中的任何问题。
我怀疑ISR的频率和更高优先级的任务不会让看门狗的任务被排定。为了证实我的怀疑,我在ISR本身为看门狗提供服务,直到2000包/秒才开始工作。
请您建议如何处理这种情况,以便看门狗即使在较高的数据/中断率下也不应该开火。
在以正常操作系统优先级运行的OS任务中,会刷新看门狗,这有助于捕捉无穷无尽的循环。
操作系统优先级最高的任务是以太网数据包读取任务。当以太网接收数据包时会产生一个硬件中断,在ISR中,我们安排等待以太网数据包读取任务。
另外,在我的系统中,操作系统没有使用计时器中断运行(就像其他操作系统运行的那样)。操作系统是循环的,并自愿放弃控制。因此,在正常情况下增加看门狗任务优先级是不可能的,否则操作系统总是会发现它处于较高的优先级和就绪状态(监视狗在无限循环中刷新,不等待任何事件),其他任务也不会有时间执行。只有等待某些事件的任务才能具有高度优先次序。
因此,由于频繁中断和高优先级任务的连续调度(以太网数据包读取),看门狗任务没有时间刷新。
发布于 2012-05-21 08:35:50
尽量给你的看门狗一个更高的优先级。
乍一看,这似乎是错误的。看门狗不应该获得高优先级,但这只适用于负载不重的系统。在负载较重的情况下,调度会将看门狗推后(毕竟它的prio很低),这会导致虚假的超时。
给予看门狗很高的优先级不应该对性能有很大的影响(这是一个小任务,不经常运行,由中断触发),但要确保它不能饿死。
缺点是你不能再捕获无穷无尽的循环了(因为这个循环现在可以被看门狗打断)。
您还应该考虑设计糟糕的硬件或错误的中断映射。也许你可以给看门狗IRQ一个比网卡更高的优先级。这将使看门狗能够及时处理其中断,而不必给予任务更高的优先级。
或者,您可以尝试在处理网络数据包时增加计数器。一个新的、高优先级的看门狗线程可以监视此计数器并重新配置低prio看门狗任务,以便只要计数器更改就不触发。
发布于 2012-05-22 06:45:21
在任何形式的实时应用程序中,根据定义,您都需要100%地了解正在发生的事情。您必须知道每个任务占用了多少时间。用示波器测量每项任务所需的时间,按下一个引脚。然后,这些时间为整个系统计算。如果高优先级的任务花费了太多的时间,那么狗显然会饿死。
如果由于非循环或非确定性行为太复杂而无法测量,则程序需要修复。如果看门狗处于高优先级任务中,那么对于任何具有较低prio的任务,几乎都禁用了它。那你最好把看门狗完全关了。
尝试和错误补丁,给予看门狗更高的prio,或增加CPU时钟,直到错误消失,根本不是一个专业的方法。
但是,当然,硬件可能不足以满足您预期的如此高的数据负载。然后,您可能没有其他选择,但要么使用脏补丁或重新设计的产品从零与适当的单片机。
发布于 2012-05-21 18:23:45
这可能不是告诉如何去做的问题,您所描述的体系结构应该能工作。您需要做的是发现为什么没有服务的看门狗。
如果您的RTOS没有用于调试和测试的仪器或工具,您可以在监视狗循环中添加I/O切换,并使用范围监视它--在所有停止切换的时间段中,较高优先级的任务或中断正在运行-if,运行时间超过1秒,看门狗将触发。然后,您可以将类似的工具添加到其他任务和ISRs中,以查看所花费的时间。
您是否可能在高负载下处于死锁状态,以致系统实际上正在失败?一种看门狗开火完全有效的情况。如果它实际上是检测到系统故障,那么您不想停止它的触发--您想要修复系统故障。
https://stackoverflow.com/questions/10680896
复制相似问题