luxinsun 发表于 2010-6-26 06:34:24

请教rtt操作系统中如何使用看门狗?

请教rtt操作系统中如何使用看门狗?

seaman117 发表于 2010-6-26 08:02:16

同问!

shaolin 发表于 2010-6-26 12:14:23

如果是直接使用硬件看门狗应该是很简单的。
如果是软件看门狗,用来监控多个任务,可以参考这个帖子的讨论。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3477082&bbs_page_no=1&bbs_id=3004

luxinsun 发表于 2010-6-26 13:14:15

能不能明确一点,rtt操作系统中如何使用看门狗?

aozima 发表于 2010-6-26 13:33:29

while(1)
{
    喂狗();
    rt_thread_delay(100);
}

是否可以回答如何喂狗?

你发的贴子:
建议RTT做个看门狗模块 : http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4099137

狗得自己喂.让系统帮喂了,还不如不喂.
喂狗和用什么系统无直接关系.自己养的自己喂.

可能的情况.在进入可能出不来的程序的后面喂狗.如果程序一旦出不来,就可以被咬.
然后一般在低优先级的线程里面喂.如果一直不能运行到这个线程,则也可以被咬.

shaolin 发表于 2010-6-26 14:24:41

实现多任务系统喂狗是跟应用需求相关的,不同的应用需求可能会考虑不同的喂狗方案。
所以,RTT也很难做统一的喂狗方案。
如果你的应用需要实现多任务监控,又不考虑每个任务都喂狗的方式,那可以尝试使用空闲任务喂狗的方式,但是用这种方式需要考虑的东西比较多,需要合理安排系统中的所有任务以及喂狗时间。

luxinsun 发表于 2010-6-26 17:24:35

回复【4楼】aozima
while(1)
{
    喂狗();
    rt_thread_delay(100);
}
-----------------------------------------------------------------------
在前后台系统中可以。但多任务系统中,每个任务都独立占有CPU,不合适。如果rtt能做个看门狗模块,就好了。
最近一直为RTT如何喂狗的问题头痛。

shaolin 发表于 2010-6-26 18:03:10

如果是喂硬件狗,直接放到定时器任务中去喂狗,没那么麻烦的。

ningmeng7294 发表于 2010-6-26 22:13:26

定时器中断服务历程去喂狗是掩耳盗铃

ffxz 发表于 2010-6-26 22:13:55

就例如shaolin给的帖子中那样,可以实现多重喂狗。

单独在OS中做一个看门狗模块确实不太适合,最好的还是依照自身应用情况来进行喂狗。即使在OS中做了看门狗模块,那它也仅仅是对硬件的一个封装,如何去喂狗还是依赖于应用程序员。

luxinsun 发表于 2010-6-27 07:28:37

回复【9楼】ffxz
就例如shaolin给的帖子中那样,可以实现多重喂狗。
单独在os中做一个看门狗模块确实不太适合,最好的还是依照自身应用情况来进行喂狗。即使在os中做了看门狗模块,那它也仅仅是对硬件的一个封装,如何去喂狗还是依赖于应用程序员。
-----------------------------------------------------------------------

能不能说说有什么不合适?
djyos里面就有一个看门狗模块。我看了还不错,但就是不好移植到其他的系统中。

eworker 发表于 2010-6-27 07:41:05

回复【8楼】ningmeng7294
-----------------------------------------------------------------------

ffxz 发表于 2010-6-27 08:00:20

回复【10楼】luxinsun
能不能说说有什么不合适?
djyos里面就有一个看门狗模块。我看了还不错,但就是不好移植到其他的系统中。
-----------------------------------------------------------------------

关键一个,喂狗动作放在哪里。在RT-Thread中有可能的地方是可以放在每次线程切换的时候,但如果确实某个时候线程切换是很长很长时间才发生一次,所以这种方式也不太合适(并且因为这个在线程切换的时候挂接上,那么将人为延长系统的上下文切换时间)。

或者假设你的系统是这样的:
关键实时任务是A
系统中还存在idle任务

喂狗方式:
1. 优先级比任务A高的定时任务B中
2. 优先级比任务A低的定时任务C中
3. idle任务中
4. 线程切换钩子中

方式1
好处:线程B可能基本上就相当于系统中优先级最高的线程,只要系统不出现问题,那么就会被周期性地执行喂狗动作。
弊端:如果线程A进入一个死循环,喂狗动作将没什么意义。

方式2
好处:如果线程A因为错误而进入死循环,系统能够自动触发看门狗进行系统复位。
弊端:如果线程A执行的时间比较长,有可能线程C来不及执行。

方式3
类似于方式2,但优先级更低,受系统中其他任务的影响更大。

方式4
得不偿失且有方式1的弊端。

综合来看,方式2或方式3的方式更好,但这种方式必须要知道,线程A或其他线程(方式3中)的执行时间的影响情况。所以对于看门狗模块,OS能做的也仅仅是提供一个硬件资源的封装,如何喂狗还是由用户来抉择,OS不应做一些用户不明白的事情。

关于移植的问题,正规意义上,在移植或使用一个模块时需要特别注意它的许可证,不要做那种许可证不兼容的移植。

luxinsun 发表于 2010-6-27 08:08:01

受教。
页: [1]
查看完整版本: 请教rtt操作系统中如何使用看门狗?