硬汉嵌入式论坛

 找回密码
 立即注册
查看: 630|回复: 11
收起左侧

[有问必答] 如何定位看门狗复位前的位置

[复制链接]

8

主题

19

回帖

43

积分

新手上路

积分
43
发表于 2024-1-9 17:56:01 | 显示全部楼层 |阅读模式
现象:程序偶发会出现看门狗复位,触发的时间间隔可能几天也可能几分钟;
业务:单片机当PLC使用,外设连了TCP和多路串口
测试过的方案:
1. 使用了cm_backtrace库,想确认是看门狗导致的程序复位还是总线异常等错误,通过log和TCP重连的时间间隔,最终定位问题来源是喂狗不及时,有地方堵塞(看门狗超时时间设置为5秒)
2. 使用过窗口看门狗,想利用窗口看门狗的中断去捕获堵塞位置,但是因为跑了PLC,执行时间超过窗口看门狗的上限,所以该办法不适用(但不会超过1秒)

问题:
想知道如何定位看门狗复位前的位置,网上说Cortex M内核陷入异常中断时会将几个内核寄存器的值压入栈中,看门狗触发的异常也会吗,如何通过PC、LR确认当时执行的函数?
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-9 22:01:55 | 显示全部楼层
把狗门狗配置成中断(非复位), 在中断后从msp可以查看被中断时程式在哪儿跑的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106645
QQ
发表于 2024-1-10 08:54:58 | 显示全部楼层
Edmund1964 发表于 2024-1-9 22:01
把狗门狗配置成中断(非复位), 在中断后从msp可以查看被中断时程式在哪儿跑的

STM32的看门狗没有非复位模式。

他这个有必要模拟个看门狗中断时间
回复

使用道具 举报

75

主题

682

回帖

907

积分

金牌会员

积分
907
发表于 2024-1-10 09:16:00 | 显示全部楼层
eric2013 发表于 2024-1-10 08:54
STM32的看门狗没有非复位模式。

他这个有必要模拟个看门狗中断时间

好像看门狗快复位之前可以触发一个中断的
回复

使用道具 举报

8

主题

19

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-1-10 09:36:44 | 显示全部楼层
eric2013 发表于 2024-1-10 08:54
STM32的看门狗没有非复位模式。

他这个有必要模拟个看门狗中断时间

意思是我把硬件看门狗关掉,然后用软件模拟一个看门狗,自己去实现超时记录并复位系统是吗?那我应该如何实现,是在每一个会堵塞的地方都加上判断是否生产复位的函数吗?
回复

使用道具 举报

75

主题

682

回帖

907

积分

金牌会员

积分
907
发表于 2024-1-10 11:25:36 | 显示全部楼层
13450334834 发表于 2024-1-10 09:36
意思是我把硬件看门狗关掉,然后用软件模拟一个看门狗,自己去实现超时记录并复位系统是吗?那我应该如何 ...

窗口看门狗只剩下0x40的时候可以触发中断,在中断里面可以记录需要记录的信息。独立看门狗不支持,你可以开一个定时器,定时时间略小于喂狗时间,定时器中断里面去记录数据
回复

使用道具 举报

3

主题

119

回帖

128

积分

初级会员

积分
128
发表于 2024-1-10 11:29:57 | 显示全部楼层
13450334834 发表于 2024-1-10 09:36
意思是我把硬件看门狗关掉,然后用软件模拟一个看门狗,自己去实现超时记录并复位系统是吗?那我应该如何 ...

开个定时器,喂狗就是给定时器重新计数,计数为零时定时器中断触发,记录当前信息
回复

使用道具 举报

8

主题

19

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-1-10 16:18:39 | 显示全部楼层
庄永 发表于 2024-1-10 11:25
窗口看门狗只剩下0x40的时候可以触发中断,在中断里面可以记录需要记录的信息。独立看门狗不支持,你可以 ...

这涉及到中断嵌套的问题;如果我使用了定时器去模拟看门狗的操作,遇到在中断处理挂了的情况(在中断里不出来),那也就无法在定时器里喂狗和记录信息,如何避免这个隐患或者还有没有更好的方案?
回复

使用道具 举报

8

主题

19

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-1-10 16:20:21 | 显示全部楼层
skyshine 发表于 2024-1-10 11:29
开个定时器,喂狗就是给定时器重新计数,计数为零时定时器中断触发,记录当前信息

如果我有多余的定时器,是否应该考虑将看门狗改为定时器?我担心中断竞争或者在中断里执行的事件太久导致无法正常利用定时器复位
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2024-1-10 18:01:53 | 显示全部楼层
13450334834 发表于 2024-1-10 16:20
如果我有多余的定时器,是否应该考虑将看门狗改为定时器?我担心中断竞争或者在中断里执行的事件太久导致 ...

中断优先级设置高一些就好了
回复

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 2024-1-12 14:43:04 | 显示全部楼层
可以将当前运行的信息暂存起来 ,发现是看门狗复位就记录下来。
回复

使用道具 举报

8

主题

19

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-1-18 10:19:02 | 显示全部楼层
谢谢各位的回答,问题已经定位并解决了;
是因为串口的ORE中断引起,没有及时读SR和DR;顺便附上我的中断配置
图片1.png
微信截图_20240118101615.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 16:27 , Processed in 0.227735 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表