关闭看门狗

看门狗的作用:在嵌入式领域,有些需要长期运营在无人看守的环境。在运营过程中,难免不出现系统死机的情况,这时就需要系统自身带有一

种自动重启的功能。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变量进行赋值

这set_svc和disable_watchdog之后,就需要加上 mov  pc  lr,这是把之前跳转的lr保存的pc地址给返回给pc。 

到这里就介绍完毕,但是有必要说一下Arm中的ldr指令:

比如想把数据从内存中某处读取到寄存器中,只能使用ldr
比如:
ldr r0, 0x12345678 ;就是把0x12345678这个地址中的值存放到r0中。

而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。

MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器。
从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的
这个立即数要符合一个8位数循环右移偶数位的取值。

原文地址:https://www.cnblogs.com/sanshijvshi/p/8335277.html