硬汉嵌入式论坛

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

[技术讨论] 关闭全局变量造成看门狗复位问题

[复制链接]

12

主题

63

回帖

99

积分

初级会员

积分
99
发表于 2024-8-27 10:11:16 | 显示全部楼层 |阅读模式
硬件:STM32F407

软件:裸机
环境:在SPI里面添加了开关全局中断后,并开启看门狗,看门狗设定为100ms
         SPI的更新间隔大概在7ms左右,一次SPI的操作时间在1ms以内
         看门狗在delay_ms 里面喂狗,并且在进入SPI和退出SPI也喂狗
         delay_ms使用的是bsp_timer上的函数
现象:SPI实时更新,频繁操作带有保存EEPROM设置,EEPROM里面带有DELAY_MS延时,会造成系统重启
尝试以下更改:
         1.SPI实时更新,系统不频繁操作,会减少系统的重启几率,不操作,重启几率更低
         2.把SPI的操作间隔由实时改为差异操作,会减少系统的重启几率
         3.加大喂狗时间为4S,现象一样
         4.关闭看门狗,频繁操作,重启几率很低,不像开了看门狗,没几下就重启(偶尔一台会当机,但不知道是否其他原因造成)
         5.删除加在SPI的全局中断后,暂未出现重启现象

因为涉及看门狗,不知道如何查看问题所在
初步分析是因为关闭了全局中断,造成与Delay_ms里面的s_ucTimeOutFlag读取冲突
一直死循环后造成重启(除了这个位置是WHILE的,其余地方几乎没有使用while死循环)        

不知道以上分析是否正确,请各位大神指点一下
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-8-27 11:55:20 | 显示全部楼层
关了全局中断,定时器里的全局变量计数就不更新了,像haldelay或者lldelay都依赖systick中断,关了中断是没法正常工作的,计数一直不更新就一直死等,hal库里很多都是依赖systick,关了systick也是无法正常工作的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-8-27 13:26:01 | 显示全部楼层
考虑不要关闭全局中断,仅关闭调用到这个全局变量的中断,看看是不是情况有所改善。
回复

使用道具 举报

12

主题

63

回帖

99

积分

初级会员

积分
99
 楼主| 发表于 2024-8-27 17:05:52 | 显示全部楼层
eric2013 发表于 2024-8-27 13:26
考虑不要关闭全局中断,仅关闭调用到这个全局变量的中断,看看是不是情况有所改善。

请问关闭全局中断是指SPI那里的呢,还是Delay_ms里面s_ucTimeOutFlag那里的关闭全局变量?
Delay_ms 是 例程里面的bsp_timer里面的程序,里面s_ucTimeOutFlag = 0那里也有关闭全局变量

原意想关闭全局中断,让SPI的时序不受其他的中断影响,保护好时序
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-8-28 09:20:25 | 显示全部楼层
flying1104 发表于 2024-8-27 17:05
请问关闭全局中断是指SPI那里的呢,还是Delay_ms里面s_ucTimeOutFlag那里的关闭全局变量?
Delay_ms 是  ...

如果你用的是硬件SPI,那不存在时序问题的。
回复

使用道具 举报

34

主题

206

回帖

308

积分

高级会员

积分
308
发表于 2024-8-28 11:02:41 | 显示全部楼层
看门狗开启就关不掉了
要有个地方定时喂狗,如果是在中断里面,中断全部关闭 你就得在开启中断前自己再手动喂狗
回复

使用道具 举报

12

主题

63

回帖

99

积分

初级会员

积分
99
 楼主| 发表于 2024-8-28 13:51:08 | 显示全部楼层
eric2013 发表于 2024-8-28 09:20
如果你用的是硬件SPI,那不存在时序问题的。

用的软件模拟,比较另类的协议,不能用硬件SPI
回复

使用道具 举报

12

主题

63

回帖

99

积分

初级会员

积分
99
 楼主| 发表于 2024-8-28 13:55:04 | 显示全部楼层
LinY 发表于 2024-8-28 11:02
看门狗开启就关不掉了
要有个地方定时喂狗,如果是在中断里面,中断全部关闭 你就得在开启中断前自己再手 ...

不是关闭看门狗
是关中断后保护SPI的时序,然后再开回来

SPI开始和SPI结束前都喂狗了
问题在于操作频率高了后,可能影响了延时那里,造成死循环,最后激发了看门狗重启复位系统
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-8-29 09:22:03 | 显示全部楼层
flying1104 发表于 2024-8-28 13:51
用的软件模拟,比较另类的协议,不能用硬件SPI

软件模拟的话,还是前面说的,别关闭全局中断,仅关闭可能影响的中断,不知道是否方便且是否可行。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 02:46 , Processed in 0.045565 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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