打印

想到一个关于使用RTOS时,有没必要用看门狗的问题。

[复制链接]
10184|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yudie|  楼主 | 2013-6-2 23:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在单片机中用看门狗的原则是,整个主循环只有一条喂狗指令(前提是你的程序思想得入门)。
但在RTOS中,每个任务都是一个主循环,如果每个任务都喂狗,那么当CPU跑在其中一个任务时,PC指针跑飞,
那么这个任务就死掉了,当然其他任务仍然会继续正常运转。
问题就来了:这样喂狗是无效的,那么在RIOS中,怎样发挥看门狗的作用呢,以使当一个任务跑飞后能让系统复位。或者谁有更绝的招,能让这个任务恢复,而不用系统复位?

相关帖子

沙发
李富贵| | 2013-6-3 07:13 | 只看该作者
真搞笑,PC指针跑飞了其他tasks能正常运转???

使用特权

评论回复
板凳
yudie|  楼主 | 2013-6-3 08:20 | 只看该作者
李富贵 发表于 2013-6-3 07:13
真搞笑,PC指针跑飞了其他tasks能正常运转???

能的,前提是你每个人任务写的够独立。更多楼下的给他启蒙吧,上班没时间讲了。

使用特权

评论回复
地板
ayb_ice| | 2013-6-3 08:24 | 只看该作者
我认为没有必要用,即使用了,作用也大大打折,

使用特权

评论回复
5
李富贵| | 2013-6-3 08:36 | 只看该作者
yudie 发表于 2013-6-3 08:20
能的,前提是你每个人任务写的够独立。更多楼下的给他启蒙吧,上班没时间讲了。 ...

别作梦了,小童鞋。task再独立,PC只有一个,进入未知状态不依赖复位你怎么恢复?讲给我听听让我也乐一乐。

使用特权

评论回复
评论
logokfu 2013-6-3 12:54 回复TA
是这个道理 
6
ayb_ice| | 2013-6-3 09:32 | 只看该作者
pc跑飞,一般RTOS还是可以正常切换到其它任务的,只是切回时那个任务还是跑飞的
因为
每个任务都有独立堆栈

使用特权

评论回复
7
缥缈九哥| | 2013-6-3 09:51 | 只看该作者
有必要呀。某任务总是飞,总是没有做某件事。或者总是耗费了CPU,99%的资源 。像XP,你总是要重新启动吧?

使用特权

评论回复
8
holle| | 2013-6-3 10:14 | 只看该作者
做个监控任务,每个任务都定时向这个监控任务汇报心跳,监控任务控制是否触发看门狗。
如果监控任务本身死了,会立即被狗咬。

使用特权

评论回复
9
hexiaolong2008| | 2013-6-3 10:17 | 只看该作者
我只用过STM32,针对于STM32F103系列的微控制器,即使用上了RTOS,程序跑飞后,是不能进行任务切换的,即使每个任务都有自己独立的任务堆栈,但只要程序跑飞,就会进入系统异常状态,进入硬件FAULT或MEM FAULT之类的中断死循环,这类异常是优先级最高的,而RTOS是基于时钟中断的,这类中断的优先级是在异常优先级之下的,所以不能得到响应,自然也就不会进行任务切换了,所以死了就死了,不会在跑到其他任务中去。

使用特权

评论回复
10
缥缈九哥| | 2013-6-3 10:26 | 只看该作者
硬件异常通常 是PC跑到了不存在的,非法的地址上了。既然死在硬件异常中,那在硬件异常的死循环中放个狗就行了?

使用特权

评论回复
11
李富贵| | 2013-6-3 10:41 | 只看该作者
任务卡死是任务卡死,PC跑飞是PC跑飞,根本就是两个完全不同的概念,为什么要绞到一块乱说?
某个任务卡死其他任务可能正常执行,像ucos-ii比卡死任务优先级低的任务也会完全卡死,高的还可以执行。任务卡死找卡死的原因,正确设计的任务是不可能卡死的。

使用特权

评论回复
12
open_free| | 2013-6-3 11:54 | 只看该作者
咱们做的实时系统,据我所治,没有内存保护,如果pc指针跑飞,系统不出问题的概率很小的。。
不过看门狗和RTOS是应该分开考虑的。。不能把rtos的可靠性依赖看门狗,当然同样道理,你自己的程序其实也不应该依赖看门狗的。
实际上,很多公司怕把系统搞复杂,怕能维护的人很少,不是很喜欢用系统。其实现在懂这个人越来越多,根本就不用担心。

使用特权

评论回复
13
yudie|  楼主 | 2013-6-3 12:28 | 只看该作者
李富贵 发表于 2013-6-3 08:36
别作梦了,小童鞋。task再独立,PC只有一个,进入未知状态不依赖复位你怎么恢复?讲给我听听让我也乐一乐 ...

系统有一个SYSTICK,即使跑飞了也会在SYSTICK中断时进行任务调度,如果当前被跑飞的这个任务没有把任务调度给LOCK掉、是还可以进行调度,调度到其他任务当中。
PC是只有一个,那每个任务要堆栈是干什么的?作用之一不就是保存每个任务的PC指针么?你这么大的人了还让小童鞋给你普及基础知识。

使用特权

评论回复
14
yudie|  楼主 | 2013-6-3 12:29 | 只看该作者
holle 发表于 2013-6-3 10:14
做个监控任务,每个任务都定时向这个监控任务汇报心跳,监控任务控制是否触发看门狗。
如果监控任务本身死 ...

方法可行。还有更好的吗

使用特权

评论回复
15
ayb_ice| | 2013-6-3 14:28 | 只看该作者
基于RTOS的程序往往是消息驱动机制,定时报告不是浪费RTOS吗,而且监控任务的优先级必须最高,这不明显浪费资源吗

使用特权

评论回复
16
李富贵| | 2013-6-3 15:08 | 只看该作者
yudie 发表于 2013-6-3 12:28
系统有一个SYSTICK,即使跑飞了也会在SYSTICK中断时进行任务调度,如果当前被跑飞的这个任务没有把任务调 ...

不胡说八道会死吗你?原来你用的是STM32,前面已经有人说的很清楚了,跑飞直接进HardFault,根本不会像你做白日梦那样还会进Systick,顺便说下,UCOS也不是用Systick进行任务调度的,你把systick关了无非是OSTimeDly不能用了而已,其他任务调度依然正常。感觉你什么都不明白,Cortex-M3的异常处理没弄明白不说,连抢占式RTOS基本工作原理都不懂。

使用特权

评论回复
17
NE5532| | 2013-6-3 15:15 | 只看该作者
楼主把OS想得太神奇了,OS只是帮你切换了一下罢了,他自己就是主循环,你其它的"主循环“都是假的。
一个单片机PC指针只有1个,跑飞了整个都飞了。
打整狗的工作应该给OS本身。
(一些内核带有监控功能的另行讨论,比如ARM)

使用特权

评论回复
18
zoomone| | 2013-6-3 15:26 | 只看该作者
凑凑热闹,围观各位大神。:lol

使用特权

评论回复
19
z_no1| | 2013-6-3 15:53 | 只看该作者
我想的办法是建一个监控任务,其它任务分两种,一种是一直在运行的,比如指示灯闪烁,一种是遇到事件才运行,比如串口接收后的处理,
前者按时给监控发信息,没有就认为死了,后者监控隔一段时间查询一下进入的条件是否正常,比如中断使能位,波特率等寄存器是否正常。然后任务开始时发一个信息,结束后再发一个信息,间隔时间不正常就是有问题了,看具体情况是否复位。监控本身喂独立狗,和窗口狗。监控监控间隔不对就触发窗口狗。 没试过,参考别人的设计。
大家有什么意见么?

使用特权

评论回复
20
z_no1| | 2013-6-3 15:53 | 只看该作者
监控的优先级最高或较高。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

75

帖子

1

粉丝