看門狗的作用:在嵌入式領域,有些需要長期運營在無人看守的環境。在運營過程中,難免不出現系統死機的情況,這時就需要系統自身帶有一
種自動重啟的功能。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位數循環右移偶數位的取值。