关闭看门狗

本文详细介绍了嵌入式系统中的看门狗机制及其工作原理。看门狗是一种硬件模块,用于监测系统运行状态并在系统死机时触发自动重启。文章还深入探讨了通过特定指令序列关闭看门狗的方法。

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

种自动重启的功能。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

<think>我们正在讨论如何关闭已经开启的看门狗。根据用户提供的信息,我们可以从几个方面来考虑:独立看门狗的特性、Redisson的看门狗机制以及STM32中独立看门狗在待机模式下的处理。但是,用户的核心需求是“看门狗开启后如何关闭”,因此我们需要针对不同类型的看门狗给出关闭方法。 根据引用[1]:独立看门狗一旦开启,只能由MCU复位后才清除。这意味着在嵌入式系统中(如STM32),独立看门狗一旦开启,在运行过程中无法通过软件直接关闭,只能通过系统复位来清除。但是,在系统复位后,如果程序不再初始化看门狗,那么看门狗就不会再运行。 然而,引用[3]提到了一种场景:在待机模式下不开启独立看门狗,在正常运行程序下开启独立看门狗。这提示我们,可以通过在程序运行的不同阶段控制看门狗的初始化来间接实现“关闭”效果。具体来说,在进入待机模式前,我们确保不初始化看门狗,这样在待机模式下看门狗就不会运行。但是,如果看门狗已经开启,我们无法在运行时将其关闭(除了复位)。 另外,引用[2]提到了Redisson的看门狗机制,这是一种在分布式锁中自动续期的机制。对于这种看门狗,我们可以通过释放锁来停止看门狗(即停止续期线程)。 因此,我们需要分情况讨论: 1. **嵌入式硬件独立看门狗(如STM32)**: - 由于独立看门狗一旦开启就不能通过软件关闭(只能复位),所以通常的做法是: - 在不需要看门狗的时候,不要启动它(例如,在程序初始化阶段根据条件决定是否初始化看门狗)。 - 如果已经开启,那么只能通过系统复位来关闭,但复位后程序重新运行,此时如果不再初始化看门狗,则看门狗不会运行。 2. **Redisson的看门狗(分布式锁续期线程)**: - 调用解锁方法(如`unlock()`)时,Redisson会自动停止看门狗线程。 3. **窗口看门狗或其他类型的看门狗**: - 窗口看门狗通常可以关闭,具体方法取决于芯片。例如,有些窗口看门狗可以通过写寄存器来禁用。 下面我们详细说明: ### 1. 嵌入式硬件独立看门狗关闭 根据引用[1]和[3],独立看门狗一旦开启,在运行中无法关闭。因此,关闭的唯一方法是系统复位。但是,我们可以通过程序设计避免在不需要的时候开启: **方法一:在初始化阶段有条件地开启** ```c // 在程序初始化部分 if (need_watchdog) { // 初始化并启动独立看门狗 IWDG_Enable(); } ``` **方法二:利用复位后不再开启** 如果之前已经开启,现在需要关闭,那么只能通过复位。复位后,在程序初始化时不执行看门狗的初始化代码,这样看门狗就不会开启。 **注意**:有些微控制器可能允许在运行中禁用看门狗,但这通常不符合独立看门狗的设计。因此,务必查阅具体芯片的数据手册。 ### 2. Redisson看门狗关闭 Redisson的看门狗机制用于锁的自动续期。要关闭这个看门狗,只需要释放锁: ```java RLock lock = redisson.getLock("myLock"); lock.lock(); // 开启看门狗(如果不指定leaseTime) // ... 业务逻辑 lock.unlock(); // 解锁,同时看门狗线程会停止 ``` 如果你在获取锁时指定了租约时间(leaseTime),那么看门狗就不会启动: ```java lock.lock(10, TimeUnit.SECONDS); // 指定租约时间,则不会启动看门狗 ``` ### 3. 窗口看门狗关闭 窗口看门狗(如果支持关闭)通常可以通过写控制寄存器来禁用。例如,在STM32中,窗口看门狗(WWDG)的使能位可以清除以禁用看门狗。示例代码: ```c // 禁用窗口看门狗 WWDG_Disable(); ``` 但是,具体操作需要参考芯片手册。有些窗口看门狗可能也像独立看门狗一样,一旦开启就不能关闭直到复位。 ### 总结 - **独立看门狗(如STM32的IWDG)**:无法在运行中关闭,只能复位。复位后不再初始化即可。 - **Redisson看门狗**:调用解锁方法自动停止。 - **窗口看门狗(如WWDG)**:可能可以通过寄存器操作禁用,需查阅手册。 ### 注意事项 - 在嵌入式系统中,看门狗用于提高系统可靠性,关闭看门狗可能导致系统死锁时无法恢复,因此请谨慎操作。 - 在分布式系统中,Redisson的看门狗机制是为了避免锁过期而业务未执行完的情况,正常情况下不要手动干预。 §§相关问题§§ 1. STM32中独立看门狗和窗口看门狗有什么区别? 2. 如何设计嵌入式系统以在需要时动态开启/关闭看门狗? 3. Redisson的看门狗机制是如何实现锁续期的? 4. 在STM32待机模式下如何避免看门狗复位?</think>### 看门狗开启后的关闭方法 根据看门狗类型和系统环境,关闭方法有所不同,以下是分类解决方案: #### 1. **嵌入式硬件独立看门狗关闭**(如STM32) 引用[1][3]指出独立看门狗(IWDG)由专用低速时钟驱动,开启后**只能通过系统复位完全关闭**。但可通过以下方式间接控制: ```c // 在初始化阶段有条件开启 if (system_mode != STANDBY_MODE) { // 非待机模式才开启 IWDG_Enable(); // 启动看门狗 } ``` **原理**:利用待机模式特性(引用[3]),在进入待机模式前不初始化看门狗,通过RTC备份寄存器保存状态标志[^3]。 > ⚠️ 注意:已开启的独立看门狗无法运行时关闭,只能复位后跳过初始化。 #### 2. **Redisson分布式看门狗关闭** 引用[2]指出Redisson的看门狗机制用于锁续期,关闭方法: ```java RLock lock = redisson.getLock("myLock"); lock.lock(30, TimeUnit.SECONDS); // 指定租约时间(≤0时启用看门狗) lock.unlock(); // 释放锁时自动停止看门狗线程 ``` **关键点**: - 显式设置`leaseTime`参数(>0)可避免看门狗启动[^2] - 调用`unlock()`会触发`WatchDog.cancel()`终止续期线程 #### 3. **窗口看门狗关闭**(如STM32的WWDG) 窗口看门狗可通过寄存器直接关闭: ```c #define WWDG_BASE 0x40002C00 #define WWDG_CR (*(volatile uint32_t*)(WWDG_BASE + 0x00)) void disable_wwdg() { WWDG_CR &= ~(1 << 7); // 清除WDGA位关闭看门狗 } ``` **特性**:窗口看门狗允许运行时关闭,但需在配置窗口期内操作[^1]。 --- ### 操作注意事项 1. **硬件看门狗关闭风险** - 独立看门狗关闭需复位系统,可能中断业务流程 - 窗口看门狗运行时关闭可能导致总线错误(需严格时序控制) 2. **分布式锁看门狗关闭建议** ```java // 安全关闭示例 if (lock.isLocked() && lock.isHeldByCurrentThread()) { lock.forceUnlock(); // 强制终止看门狗 } ``` 3. **替代方案**(避免关闭需求) - 嵌入式系统:使用低功耗模式自动暂停看门狗(如STM32的Stop模式) - 分布式系统:设置合理租约时间`lock.tryLock(100, 10, TimeUnit.MILLISECONDS)` > 📌 **核心原则**:多数硬件看门狗设计为"开启后不可关闭",建议通过**架构设计**(如状态机控制初始化)而非运行时关闭[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值