看门狗的作用:在嵌入式领域,有些需要长期运营在无人看守的环境。在运营过程中,难免不出现系统死机的情况,这时就需要系统自身带有一
种自动重启的功能。Watchdog一般是一个硬件模块,其作用就是在系统死机的时候,帮助系统实现自动重启。
看门狗的工作方式:Watchdog在硬件上实现了计时功能,启动计时后,用户(软件)必须在计时结束前重新开始计时,俗称喂狗,如果到超过
的时候还没有重新开始计时,那么他就认为是系统死机了,就自动重启系统。
1 .text 2 .global _start 3 _start: 4 b reset 5 ldr pc, _undefined_instruction 6 ldr pc, _software_interrupt 7 ldr pc, _prefetch_abort 8 ldr pc, _data_abort 9 ldr pc, _not_used 10 ldr pc, _irq 11 ldr pc, _fiq 12 13 _undefined_instruction: .word undefined_instruction 14 _software_interrupt:.word software_interrupt 15 _prefetch_abort:.word prefetch_abort 16 _data_abort:.word data_abort 17 _not_used:.word not_used 18 _irq:.word irq 19 _fiq:.word fiq 20 21 undefined_instruction: 22 nop 23 24 software_interrupt: 25 nop 26 27 prefetch_abort: 28 nop 29 30 data_abort: 31 nop 32 33 not_used: 34 nop 35 36 irq: 37 nop 38 39 fiq: 40 nop 41 42 reset: 43 bl set_svc 44 bl disable_watchdog 45 46 set_svc: 47 mrs r0, cpsr 48 bic r0, r0, #0x1f 49 orr r0, r0, #0xd3 50 msr cpsr, r0 51 52 #define pwTCON 0x53000000 53 disable_watchdog: 54 ldr r0, =pwTCON 55 mov r1, #0x0 56 str r1, [r0]
黄色部分就是关闭看门狗
LDR伪指令的形式是“LDR Rn,=expr”。作用是装在一个32bit常数和一个地址到寄存器。
MOV R0, #0x0是将立即数0放到R0中。
STR R1, [R0] 是一个典型的存储指令,将R1中的值放到以R0中的值为地址的存储单元去。
可见这三条指令是对pwTCON变量进行赋值
到这里就介绍完毕,但是有必要说一下Arm中的ldr指令:
比如想把数据从内存中某处读取到寄存器中,只能使用ldr
比如:
ldr r0, 0x12345678 ;就是把0x12345678这个地址中的值存放到r0中。
而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。
MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器。
从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的
这个立即数要符合一个8位数循环右移偶数位的取值。