關閉看門狗


看門狗的作用:在嵌入式領域,有些需要長期運營在無人看守的環境。在運營過程中,難免不出現系統死機的情況,這時就需要系統自身帶有一

種自動重啟的功能。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位數循環右移偶數位的取值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM