(3)uboot详解——饿了么,我们来喂“狗”吧

(3)uboot详解——饿了么,我们来喂“狗”吧

uboot启动时,当将cpu运行模式设置为管理模式后,就要关闭看门狗了,那么看门狗是干什么的呢?

狗狗是我们的好朋友,有时候,一条好狗狗能够救主人的性命,”看门狗“是cpu的“好朋友”,它也能够在cpu出状况的时候把它救活。

看门狗其实就是一个可以在一定时间内被复位的计数器,当看门狗启动后,计数器开始自动计数,经过一定时间,cpu就会将这个计数器复位,如果没有被复位,计数器溢出就会对CPU产生一个复位信号使系统重启,这个复位的操作就是“喂狗”。

看门狗就这样兢兢业业的守着它的主人cpu,当cpu出状况的时候,就不能喂狗了,看门狗饿了就知道cpu不正常工作了,然后发送复位信号让cpu重新醒过来。

对于一些安装在户外的设备,可以很直接的体现它的价值,比如运营商在荒郊野岭安装了好多基站,如果这里的基站停止工作了,就需要派人去这个基站手动重启了,有了看门狗以后,只要过一段时间没有喂狗,看门狗就将系统重启,节省了不少人力。

看门狗主要分三种:

1、内置在cpu内部的看门狗

此类看门狗一般是将一个芯片中的定时器来作为看门狗,通过程序的初始化,写入初值,并启动定时器。程序按时对定时器赋初值(或复位),以免它饿了。这种看门狗是可以被禁用的(只要停止这个定时器即可),好比对那只要咬你的狗来个“葵花点穴手”。大部分CPU都内置看门狗,硬件原理可参考各芯片数据手册。

优点:可以通过程序改变初始时间,也可以随时禁用

缺点:需要初始化,如果程序在初始化、启动完成前跑飞或在禁用后跑飞,看门狗就无法复位系统,这样看门狗的作用就没有了,系统恢复能力降低。

2、独立的看门狗芯片

这种看门狗主要有一个用于喂狗的引脚(一般与CPU的GPIO相连)和一个复位引脚(与系统的RESET引脚相连),如果没有在一定时间内改变喂狗脚的电平,复位引脚就会改变状态复位CPU。此类看门狗一上电就开始工作,无法禁用。现在常用的芯片有:CAT705/CAT706、IMP706等等,溢出时间在1.6秒左右。 硬件原理可以参考各芯片数据手册和《基于Linux的嵌入式系统全程喂狗策略》。

优点:无须配置,上电即用。无法禁用,系统必须按时喂狗,系统恢复能力高。

缺点:无法灵活配置溢出时间,无法禁用,灵活性降低。

3、软件看门狗

这其实就是一个监控软件,对于硬件上出的问题它还是无能为力的,它主要对一些重要的软件进行监控。

一些重要的程序,必须让它一直跑着;而且还要时时关心它的状态——不能让它出现死锁现象。(当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误。首要做的事是Debug。)但如果时间紧迫可以用软件看门狗,暂时应急。

这种监控软件运行不出现界面窗口,具有一定的隐蔽性;它定时判断目标进程是否运行在当前系统中,如果没有则启动目标进程;判断目标进程是否“无响应”,如果是则终止目标进程;如果目标进程“无响应”的次数超过一定的数量,则重启整个系统。它的目的也是复位,但是它主要市复位进程,实在不行才复位CPU。

第二种和第三种看门狗,在这里不作讨论,下面将讨论怎么使用内置在cpu内部的看门狗。

因为是内置在cpu内部,所以从电路图中就找不到看门狗的连接方式了,下面是看门狗的工作原理图:

从图中可以看出一下几点:

1. 看门狗使用的输入时钟是PCLK,关于时钟的知识将在后面进行详细分析

2. 看门狗的配置涉及到三个寄存器:控制寄存器(WTCON),数据寄存器(WTDAT),计数寄存器(WTCNT)

3.看门狗先将PCLK时钟进行预分频 (prescaler),分频的精度为0~255 (2的8次方-1 ,由WTCON的8-15位进行设置),预分频后再除以一个分频因子(division factor,由WTCON的4:3两位进行设置,一共有4中选择——16,32,64,128),有PCLK、prescaler和division
factor三个变量以后,就可以计算出看门狗计数器递减时间间隔:

t_watchdog:看门狗计数器递减时间间隔,单位秒

PCLK:APB总线工作始终,单位HZ

prescaler value + 1:预分频大小,因为从0开始,所以需要加一

division_factor:分频因子,有4个档——16,32,64,128

当开发板一上电的时候,系统时钟是还没有初始化的,所以PCKL的时钟大小是和外部时钟一样的,cpu连接的外部晶振如下图:

所以刚上电时,PCKL的大小12MHz,WTCON[15:8]设置为74,除数因子选择16,通过上面公式可以计算出,看门狗控制器递减时间间隔0.1毫秒。将WTCNT里的值设置为0x2710(十进制10000),那么看门狗会每过一秒钟产生一次超时。

我们来看看控制寄存器(WTCON),数据寄存器(WTDAT),计数寄存器(WTCNT)芯片手册:

从上图可以看到WTCON的默认状态:

[0]=1 当看门狗计时器超时的时候,开启发送reset信号的功能

[2]=0 超时的时候不发送中断

[4:3]=00 默认分频因子是1/16, division_factor=16

[5]=1 开启看门狗计数器,看门狗会按照WTCNT中的初始值进行递减,直到超时

[15:8]=0x80 换成十进制是128, prescaler=128

因为刚开机的时候,PCLK=12M, prescaler=128, division_factor=16 , 所以可以计算出 t_watchdog=1/(12M/129/16)=(129*16)/(12000000)=0.000172s=0.172ms

上图是WTDAT寄存器的芯片手册,默认值是0x800, 十进制是2048

上图是计数器寄存器的芯片手册,默认值也是0x800,十进制是2048

所以刚上电的时候,看门狗的超时时间是:time_out=2048*0.000172=0.352252s

0.352252s是如此的短暂,所以在开机的时候如果没有关闭看门狗,它将每隔0.352252s就发送一次reset信号重启cpu,不管uboot运行到哪个阶段,都将被看门狗终止并重启。

从上面可以得出结论,板子重启时,必须尽早关闭看门狗,以便后面的代码顺利执行。

看门狗关闭以后,需要在什么时候开启呢?我们将会在后面分析uboot和内核代码的时候进行分析。

下面将使用一个例子演示对看门狗的操作。

Makefile

watch_dog.bin:watch_dog.S  
    arm-linux-gcc -g -c -o watch_dog.o watch_dog.S  
    arm-linux-ld -Ttext 0x000 -g watch_dog.o -o watch_dog_elf  
    arm-linux-objcopy -O binary -S watch_dog_elf watch_dog.bin  
 
clean:  
    rm -rf watch_dog.bin *.o watch_dog_elf

watch_dog.S

@ 关闭看门狗实验
.text
.global _start
_start:
  ldr r0, = 0x53000000                       @ WTCON寄存器地址加载到r0

  mov r1, #0                                 @ r1 = 0

  str r1, [r0]                               @ 将r1里的值存到r0里地址里

通过分析前面的寄存器的设置位可知,只要设置WTCON[5]为0即可,上述代码里,直接将整个WTCON寄存器里的位设置为0。

@开启看门狗实验:
@watch_dog.S

 .text
 .global _start
 _start:
        @ 设置看门狗控制寄存器

         ldr r0, =0x53000000                           @ 加载WTCON寄存器地址

         @ 0x4a21 = [15:8]=74, [5]=1, [0]=1

         ldr r1, =0x4a21                               @ 将0x4a21保存到r1里

         str r1, [r0]                                  @ 将r1里的值存入r0指向的地址

         @ 设置看门狗计数寄存器,该寄存器的值在上电后被加载, 1秒超时

         ldr r2, =0x53000008                           @ 加载WTCNT寄存器地址

         ldr r3, =0x2710                               @ 将0x2710保存到r1里

         str r3, [r2]                                  @ 将r3里的值存入r2指向的地址

         bl led_on                                     @ 调用led_on代码

 

loop:

         b loop                                        @ 死循环

led_on:
        ldr r0,=0x56000010  
    mov r1,#0x15400  
    str r1,[r0]  
            
    ldr r0,=0x56000014  
    mov r1,#0x100  
    str r1,[r0]  
    mov pc,lr  

程序开始定义两个常量地址,分别是WTCON,WTCNT的地址,ENRTY后面是程序的正文部分,首先通过ldr指令加载WTCON的地址到r0里,将0x4a21这个数加载到r1里,0x4a21是我们通过设置WTCON [15:8]=74 [7:6]=0,[5]=1,[4:1]=0, [0]=1得到的16进制数,将其值存入到r0地址里,这样WTCON里就是我们设置各位的值,然后同样道理再将0x2710存到WTCNT数据寄存器里,设置数据寄存器的值为0x2710。

为了看到看门狗的重启效果,我们加入了一个小程序,用来点亮led灯,将上述代码在linux下编译完后,烧写到NORFLASH里可以看到每过1秒钟,开发板的led灯就闪一下。

知识扩展

开启了看门狗之后,控制器会定时的复位,为了防止不停的复位,就要进行“喂狗”操作,喂狗操作相对比较简单,只要在WTCNT里的计数减为0之前,将其值重置一个非0的数值即可,看下面的函数:feed_dog(该代码仅供读者参考,光盘源码中没有给出具体例子)

@ 喂狗程序

.text
.global _start

feed_dog:

           ldr r0, =WTCNT

           ldr r1, =0x2710

           str r1, [r0]

           mov pc, lr

喂狗程序对喂狗的时机必须要合适,否则在定时器还没来得及发生中断调用watchdog已经超时了,也将引起系统复位重启,通常系统里会开启另外一个时钟来为整个系统服务,它会定时的“告知”系统,在看门狗定时器超时之前,自动的调用喂狗程序。

总结:这篇文章讲了看门狗的一些内容,包括看门狗的作用,看门狗的分类,看门狗的工作原理和在arm处理器中看门狗的配置手册,并根据手册计算了看门狗的计时间隔和计时周期,最后用了一些例子演示了看门狗的操作过程。后面我们将继续根据uboot启动流程讲解中断相关的知识。

转载请声明!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 16:05:54

(3)uboot详解——饿了么,我们来喂“狗”吧的相关文章

linux移植u-boot(一)——U-Boot详解+自定义命令实战

linux移植u-boot(一)--U-Boot详解+自定义命令实战 2015-02-07 一.Bootloader ????简单地说:Bootloader主要功能就是 在系统上电时开始执行,初始化硬件和设备,准备好软件环境,最后调用操作系统. ????具体的包含:关闭你看门狗WATCHDOG,改变系统时钟,初始化存储控制器 ,将操作系统内核代码复制到内存中去运行. ????为了开发方便,可以增加网络功能,从PC上通过串口或者网络下载文件,烧写文件,将flash上的内核代码解压后运行等. Boo

(5.2)uboot详解——省电模式(番外)

(5.2)uboot详解--省电模式(番外) 这篇文章将对uboot的省电模式进行分析,这里介绍的内容与uboot的启动其实关系不大,如果关心uboot的启动过程,可以跳过这节以及后面的小节,直接到第6章. 省电模式和cpu的工作模式(异常)其实关系也不大,省电模式主要是依靠时钟来分类的,因为外设的工作必须要时钟,当停止给外设提供时钟的时候,相应的外设也会停止工作,所以省电管理就是根据控制是否给相应的设备提供时钟或电源来达到节电的目的. ARM有四中节电模式: 普通模式:这种模式下,会给所有的外

(4.3)uboot详解——异常和异常向量

(4.3)uboot详解--异常和异常向量 中断是一个较难掌握知识,因为它是一个过程,而不是一个结果,其中的步骤都建立在理论的层面上,需要理解.比如按下按键1会使led1亮,这个"起因-结果"的操作我想小孩子也能掌握,因为它是一个现象,但是要掌握"起因-过程-结果"却需要花一些功夫,因为这个过程需要理解.如果你认真的了解了前面两节的内容,那么现在就该到了实现"过程"的时候了. 前面两节分析了外部中断和内部中断相关的内容,这篇文章将对处理器的异常情

Linux中Uboot详解

在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分. 2. Linux 内核.特定于嵌入式板子的定制内核以及内核的启动参数. 3. 文件系统.包括根文件系统和建立于 Flash 内存设备之上文件系统.通常用 ram disk 来作为 root fs. 4. 用户应用程序.特定于用户的应用程序.有

(1)uboot详解——板子刚上电时都干了些什么

电子产品如果没有了电,就跟废品没什么区别,是电赋予了他们生命,然而程序则是他们的灵魂. 小时候一直很好奇,一个个死板的电子产品为什么一上电以后就能够工作了呢?为什么一个小小芯片就能够运行我们编写的程序呢?一个开发板从刚上电到整个操作系统能够运行起来是怎么办到的呢?这些东西困扰了好久,参考了好多资料现在才慢慢弄明白其中一些原理. 我们现在接触的大多数电子产品都是使用数字电路设计出来的,数字电路的精髓就是两个数字:0和1,这两个数字千变万化的组合创造了计算机世界的缤纷多彩,不管是cpu.内存还是其他

uboot——详解各目录下的文件作用

uboot下载地址:http://ftp.denx.de/pub/u-boot/ 1.目录分布 2.目录结构变化: u-boot-2010.03及以前版本 ├── api                存放uboot提供的接口函数 ├── board              根据不同开发板定制的代码,代码也不少 ├── common             通用的代码,涵盖各个方面,已命令行处理为主 ├── cpu                与体系结构相关的代码,uboot的重头戏 ├──

【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boot 源码 : http://download.csdn.net/detail/han1202012/8342761 -- S3C2440 文档 : http://download.csdn.net/detail/han1202012/8342701 -- S5PV210_iROM_Applicati

uboot主Makefile分析(t配置和编译过程详解)

1.编译uboot前需要三次make make distcleanmake x210_sd_configmake -j4 make distclean为清楚dist文件. make x210_sd_config  跳转执行mkconfig用来配置并生成config.mk(board/samsung/x210目录下为指定链接地址的与主uboot目录的config.mk不同) autuconfig.mk 2.框图 3.uboot主Makefile分析 3.1.uboot version确定(Make

uboot mkimage使用详解

mkimage使用详解uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么[email protected]:/tftpboot# ./mkimageUsage: ./mkimag