0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Linux操作系统和IMP706芯片实现看门狗计数器清零电路的设计

电子设计 来源:单片机与嵌入式系统应用 作者:张长顺,黄建元, 2020-09-15 17:58 次阅读

来源:单片机嵌入式系统应用作者:张长顺,黄建元,赵新荣,陆永刚

引言

嵌入式系统中,为了使系统在异常情况下能自动恢复,一般都会引入看门狗电路。看门狗电路其实就是一个计数器。当看门狗启动后,计数器开始自动计数,经过一定时间计数器溢出就会对CPU产生一个复位信号使系统重启。系统正常运行时,需要在看门狗允许的时间间隔内对看门狗计数器清零也即喂狗,不让复位信号产生。

当前在带Linux操作系统的嵌入式系统中,由于Linux操作系统加载时间较长(如10~30 s),一般都超过看门狗的时间间隔(典型值为l.6 s);而如果不采取特殊措施,则系统在Linux操作系统加载过程中复位,Linux操作系统永远无法加载成功。为了解决这个问题,通常有两种方案 [1-2]:做一个看门狗的时间间隔更长的硬件电路;修改内核,在内核启动过程中将看门狗设成无效。以上方案无法解决嵌入式系统在操作系统启动阶段的失效问题,降低了系统可靠性。

本文提出了一种嵌入式系统全程喂狗策略及实现方法,从系统上电、引导程序(Bootloader)、操作系统内核直至应用阶段都启用看门狗。实验表明,该方法简单可行,成本较低,在嵌入式系统的全过程中都可以实现喂狗策略,提高了系统可靠性。

1 系统总体设计

采用IMP706芯片组成硬件看门狗电路(看门狗的时间间隔为1.6 s),在操作系统程序(包括Bootloader)和应用程序中插人喂狗程序,这些喂狗程序运行时问间隔小于看门狗的时间间隔(本设计选为1 s)。这样做可以保证:如果系统正常工作,系统可以在小于看门狗的时间间隔内不断进行喂狗动作,硬件看门狗的计数器不断清零,不产生复位信号;如果系统非正常工作,喂狗动作失效,硬件看门狗的计数器在1.6 s后溢出,对CPU产生复位信号使系统重启。

1.1 看门狗电路设计

图 1为看门狗电路原理,采用IMP706芯片组成硬件看门狗电路,通过电平转换器件74AVC1T45,硬件看门狗器件的ST脚与中央处理器(CPU)的 GPIO3脚相连。看门狗器件的PRST脚与IN脚接到复位开关,RST脚接到CPU的RESET脚,当复位开关被触动或看门狗器件的计数器溢出时,看门狗器件的RST脚输出复位信号给CPU的RESET脚,CPU复位重启。

1.2 喂狗策略及实现

1.2.1 Bootloader阶段

在 Bootloader阶段(本设计采用U-boot,但不限于此),喂狗策略是在Bootloader的程序中不同位置插入喂狗程序。具体做法是:由于 Bootoader第一阶段的启动不会超过1.6 s,因此只需在Bootoader的第二阶段,如Flash读写、CRC校验、循环等待等处,插入喂狗代码。喂狗代码采用直接置位中央处理器的GPlO3 状态寄存器的方式进行。

首先在特定平台的定义头文件include/condffigs/xxx.h中加入看门狗的宏定义:

1.2.2 Linux内核阶段

在Linux内核加载阶段(采用 MontaVista Linux操作系统,但不限于此),喂狗策略是在Linux内核程序的不同位置插入喂狗程序。具体做法是:首先在Linux内核阶段1的内核解压缩程序、 RTC驱动加载程序、GPIO驱动加载程序适当代码处插入喂狗代码,喂狗代码以直接取反中央处理器的GPlO3状态寄存器的方式进行;在Linux内核阶段2的Watchdog驱动加载程序适当代码处插入喂狗代码,喂狗代码调用GPIO驱动,GPIO驱动内含取反中央处理器的GPlO3状态寄存器的操作;在Linux内核阶段3的内核加载根文件系统程序、init程序的适当代码处调用Linux的Watchdog驱动,Watchdog驱动内含取反中央处理器的GPlO3状态寄存器的操作。

以上内核阶段的划分是以GPIO及Watchdog驱动的加载为标志的。GPIO驱动加载之前为内核阶段1,GPIO驱动加载之后至Watchdog驱动加载之前为内核阶段2,Watchdog驱动加载之后为内核阶段3。

下面示例说明内核解压缩asm/arch/boot/com—pressed.C中喂狗的实现代码:

从以上代码可以看出,它是内核阶段1喂狗的典型方法,是直接取反GPlO3状态寄存器的。

下面示例说明内核阶段2的喂狗方法(仅以加载RTC驱动为例):首先让RTC驱动中包含GPIO的头文件,然后在读取RTC当前值的函数中调用GPIO驱动进行喂狗。

为了能够在内核阶段3调用Watchdog驱动进行喂狗,需要在Watchdog驱动中导出喂狗函数以供内核阶段3使用。Watchdog驱动喂狗也是调用GPIO驱动实现的,但Watchdog驱动一旦加载完成,以后的喂狗都通过调用 Watchdog驱动完成。

1.2.3 程序运行阶段

图2为多线程应用程序运行阶段喂狗方法。在主程序中首先创建一个监控线程,它的优先级高于其他线程。监控线程在其他被监控的线程正常工作的情况下,一定时间内对看门狗进行喂狗操作,喂狗操作通过调用Watch—dog驱动来完成。如果某个线程出现故障,监控线程就不执行喂狗操作,也就达到这个线程出现故障时系统自动重启的目的。如果监控线程自身出现故障,不能及时执行喂狗操作,看门狗也自动复位重启。具体做法是,主程序首先启动监控线程,然后依次启动N个被监控的线程,每一线程内都设置一计数器。被监控的线程中首先对线程内的计数器初始化为0,在各个线程主循环中,对相应的计数器执行加1操作。监控任务首先启动看门狗,进入循环。每隔M秒对各线程内的计数器进行检验,在M秒内每隔1 s要对看门狗喂狗,否则系统就会复位重启。查询N个计数器值是否为O,如果全都大于O,则说明对应接受监控的线程正常运行,然后对看门狗喂狗,并将N个计数

器值清零。如果有任意一个计数器值为0,检测到对应接受监视的线程出现故障需要重启,这时不对看门狗喂狗,使得系统复位重启。

以下示例说明在应用中如何调用Watchdog驱动实现喂狗:

总之,在系统不同阶段,由于系统调用和封装程度不同,看门狗的喂狗实现方法也不同:在Bootloader阶段,直接取反中央处理器的GPIO3的状态寄存器;在Linux内核阶段1,采取取反中央处理器的GPlO3的状态寄存器的方法进行;在Linux内核阶段2,采取调用GPIO的驱动的方法进行;在Linux内核阶段3,采取调用Watchdog驱动的方法进行;在应用程序运行阶段,应用程序中的喂狗程序采取调用Watchdog驱动的方法进行,如图3所示。

2 实验结果

我们在公司研发的智能视频分析器项目中应用了本方法。该分析器采用TI DaVinci系列DSP芯片(TMS320DM6446)为CPU,用Monta Vista Linux作为操作系统。操作系统启动时间约为20~30 s。采用本方法是为了保证系统在全过程中都能得到有效的失效恢复。

在振荡波抗扰度、电压波动与闪烁、静电放电、电快速瞬变脉冲群等EMC兼容性测试中,当各强度指标超过设备EMC兼容性设计强度时,系统失效,利用这种方式可以测试本方法在硬件失效时的效果。以静电放电为例,设计放电等级为±6 kV(我们取±7 kV的强度等级),设备上电后,分别在1~30 s内每隔5 s及在120 s处进行静电放电测试,经观察设备都可以即时恢复。

对软件失效时本方法效果的测试,采用故障植入脚本的主动方式及系统长时间运行的被动方式进行测试。最终结果表明,设备在失效后可即时恢复。

综上所述,本全程喂狗的方法能确保系统在任一阶段出现软件或硬件故障时都能复位重启。

结语

本文提出了一种嵌入式系统全程喂狗策略,包括硬件电路设计和软件实现方法。该方法有如下特点:看门狗电路简单,硬件只需一块看门狗芯片,不需复杂的外围逻辑电路,成本较低;系统全过程启用看门狗,确保系统在任一阶段出现软件或硬件故障都能复位重启,系统可靠性得到提高。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    452

    文章

    50185

    浏览量

    420685
  • Linux
    +关注

    关注

    87

    文章

    11202

    浏览量

    208694
  • 操作系统
    +关注

    关注

    37

    文章

    6675

    浏览量

    123127
收藏 人收藏

    评论

    相关推荐

    看门狗多任务系统及喂狗方法详解

    看门狗分硬件看门狗和 软件看门狗。硬件看门狗是利用一个定时电路,其定时输出连接到
    的头像 发表于 07-05 09:21 1.9w次阅读
    <b class='flag-5'>看门狗</b>多任务<b class='flag-5'>系统</b>及喂狗方法详解

    如何利用看门狗电路改善系统可靠性

    看门狗电路基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗计数器正常工作时自动计数,程
    发表于 02-26 07:30

    嵌入式系统看门狗计数器怎么清零

    在嵌入式系统中,为了使系统在异常情况下能自动恢复,一般都会引入看门狗电路看门狗电路其实就是一个
    发表于 03-09 06:16

    基于递减计数器和预分频的独立看门狗

    –是一个定时,供能–计数。每隔一段时间就喂狗–计数清零,重新计时,程序出错不能喂狗,得复位。独立看门狗独立
    发表于 07-30 07:24

    WDT看门狗模块的相关资料分享

    工作时自动计数,程序流程定期将其复位清零,如果系统在某处卡死或跑飞,该定时将溢出,并将进入中断。在定时中断中执行一些复位
    发表于 11-04 06:16

    基于CPLD技术的看门狗电路的设计

    【摘 要】 介绍了一种基于CPLD器件设计看门狗电路的方法。  关键词:CPLD,看门狗计数器 1 引 言  随着现代电子技
    发表于 05-16 19:18 757次阅读
    基于CPLD技术的<b class='flag-5'>看门狗</b><b class='flag-5'>电路</b>的设计

    利用看门狗提高系统可靠性

    看门狗是一个计数器,它需要在一定的看门狗延时周期内被清零,如果没有清零动作,看门狗
    发表于 03-07 16:03 35次下载
    利用<b class='flag-5'>看门狗</b>提高<b class='flag-5'>系统</b>可靠性

    看门狗定时的设计、工作原理及看门狗定时操作

    看门狗定时(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗
    发表于 05-23 09:14 7609次阅读
    <b class='flag-5'>看门狗</b>定时<b class='flag-5'>器</b>的设计、工作原理及<b class='flag-5'>看门狗</b>定时<b class='flag-5'>器</b>的<b class='flag-5'>操作</b>

    看门狗喂狗时间及程序

    ,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。 看门狗分硬件
    发表于 10-16 09:19 1.7w次阅读

    一文读懂单片机看门狗电路

    看门狗定时是一个计数器,基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗计数器正常工
    的头像 发表于 10-31 17:29 3.7w次阅读
    一文读懂单片机<b class='flag-5'>看门狗</b><b class='flag-5'>电路</b>

    STM32看门狗配置(独立看门狗IWDG和窗口看门狗WWDG)

    stm32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG。看门狗主要作用是可用来检测和解决由软件错误引起的故障;当计数器达到给定
    发表于 11-09 17:17 8386次阅读
    STM32<b class='flag-5'>看门狗</b>配置(独立<b class='flag-5'>看门狗</b>IWDG和窗口<b class='flag-5'>看门狗</b>WWDG)

    看门狗定时的相关问题和实验说明

    看门狗的作用: 看门狗定时是一个计数器,基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗
    的头像 发表于 10-06 12:59 4454次阅读
    <b class='flag-5'>看门狗</b>定时<b class='flag-5'>器</b>的相关问题和实验说明

    如何实现模拟看门狗

    。 啥是看门狗? 一般来讲,单片机的看门狗可简单看成相对独立的两部分,即计时单元和监控单元。计时单元实现计数与重装。在计数过程中,软件可以适
    的头像 发表于 10-23 14:51 5249次阅读
    如何<b class='flag-5'>实现</b>模拟<b class='flag-5'>看门狗</b>?

    看门狗芯片工作原理

    时间,如果没有被复位,计数器溢出就会对CPU产生一个复位信号使系统重启(俗称“被狗咬”)。系统正常运行时,需要在看门狗允许的时间间隔内对看门狗
    的头像 发表于 08-09 23:48 1.4w次阅读

    计数器同步清零和异步清零的区别

    计数器清零就是将计数清零,那么计数器同步清零和异步清零
    的头像 发表于 01-29 16:45 3.2w次阅读