历史上的今天
返回首页

历史上的今天

今天是:2025年07月10日(星期四)

正在发生

2018年07月10日 | STM32F030 中断太频繁导致死机

2018-07-10 来源:eefocus

最近在忙一个项目,使用了STM32F030的单片机,定时器用系统定时器,每10us中断一次。在程序少的时候,没有发现死机情况,但是随着功能的丰富,经常出现死机问题,具体表现为while(1)循环无法执行,但是中断函数正常或者按键不起作用,程序直接跑分。这时我认为是死机,即程序跑分,但是有时中断正常,这就证明程序依然正常运行,可能是其它原因造成。

首先,我怀疑是I2C读写DSP出错,于是屏蔽掉DSP初始化,刚开始正常,多开机几次就又不正常了,所以排除写DSP。

接着,我怀疑读Flash出错,也发现仿真时,有时读Flash,就假死在那儿,于是就又把读Flash屏蔽掉,发现程序又正常了许多,但是多开机几次就又出现假死,所以又排除写Flash。但是仿真时,却说发现程序假死在一些初始化时的延时函数里。于是我仔细检查延时函数是否出错,发现没有错误,这就导致很奇怪了。

然后,我把优化等级调到-O3,发现出现了局部变量没有初始化就被使用和数组越界的情况(程序是拷贝别人的,没有仔细检查),以为这次可以解决了,在修改掉Bug后,程序假死改善了许多,但是很不幸,多级开关机后,发现程序又假死了,问题还不在这里,不过顺便解决了两个Bug。

最后,在同事的帮助下,开始检查系统定时器的中断函数,发现中断是每10us触发一次,并且在10us的中断函数里有调用了好几个函数,并且还有对IO口的操作,所以很有可能是由于中断过于频繁,系统被拖死了,导致不停的进入中断(这次中断还没有执行完成,下一次中断事件就产生了),导致while(1)循环根本没有时间执行,就出现了之前的假死现象。于是,在把中断时间改为1ms后,并把函数的操作放在了50ms的中断函数里处理,假死问题得以解决。


总结:

1、单片机不能把中断设置的太频繁,否则可能会消耗掉过多的MCU资源,导致while(1)执行的很慢,系统运行出现问题。

      单片机会随着温度的升高,速度回稍微变慢,这也是为什么程序在中断太频繁时,有时运行正常,有时又不正常的原因。

      中断函数里最好不要放函数调用,比较耗费时间,如果确实要用,就快进快出,并且不能在低于1ms的中断函数里调用函数。

      中断函数里最好不要操作IO口,检测IO口的状态可以,但是最好不要写IO口,否则可能会消耗掉过多的MCU资源,导致系统假死。

      局部变量一定要记得在定义时初始化,否则可能会出现不初始化就使用,导致系统异常;数组一定要仔细检查是否可能会出现越界,如果越界了怎么处理,要有保护措施。

2、从发现问题,到解决问题,用了将近两天的时间,不能不说这是一种浪费。首先,在发现问题后,没有先做深入的分析,而是不停的怀疑这里有问题,而没有用“证据”来证明其一定有问题,这不说一种好的解决问题的思路。其次,在没有串口打印时,没有第一时间把串口焊好,又是自己独自摸索怀疑,增加了调试的难度。最后,对单片机的执行速度没有大致的概念,以为8M晶振倍频到48M,单片机速度非常快了,但是没有考虑到多周期指令和C代码翻译成汇编再翻译成机器码后,会增加20%~30%的代码量,综合考虑,跑一次while(1)循环大概需要几毫秒的时间(中等规模代码,且没有任何延时)。


推荐阅读

史海拾趣

Diode Laser Concepts公司的发展小趣事

为了拓展更广阔的市场,Diode Laser Concepts公司开始实施国际化战略。公司先是在亚洲和欧洲设立了办事处,随后又在美国等地建立了生产基地。通过与国际知名企业的合作,公司不仅将产品销售到了全球各地,还积累了丰富的国际经验,提升了品牌影响力。

GREATECS公司的发展小趣事

随着技术的不断成熟,Diode Laser Concepts公司开始将产品推向市场。公司凭借其卓越的性能和稳定性,在电子制造、半导体加工等领域迅速获得了客户的认可。同时,公司不断投入研发,推出了一系列创新的二极管激光产品,如超短脉冲激光器和高精度定位系统等,进一步巩固了市场地位。

AVX公司的发展小趣事

AVX公司的历史可以追溯到XXXX年,当时它由一群热衷于电子技术的工程师创立。在创立初期,AVX主要专注于电容器的研发与生产,凭借其独特的技术和卓越的品质,很快在市场中脱颖而出。随着业务的扩展,AVX逐渐在电感器、电阻器等领域也取得了显著进展,为公司的后续发展奠定了坚实的基础。

HCH Co公司的发展小趣事

背景:HCH Co公司自成立以来,始终将技术创新作为企业发展的核心驱动力。在电子行业快速发展的背景下,公司投入大量资源于研发领域,成功研发出一系列具有自主知识产权的核心技术。其中,一项关于高效能电源管理芯片的突破,不仅大幅提升了电子产品的续航能力,还显著降低了能耗,赢得了市场的广泛认可。

发展:随着技术的不断成熟和市场需求的增长,HCH Co公司的电源管理芯片迅速占领市场份额,成为众多知名电子产品制造商的首选供应商。公司的技术创新不仅推动了自身业务的快速增长,也为整个电子行业的节能减排和可持续发展做出了积极贡献。

Daito Communication Apparatus Co Ltd公司的发展小趣事

随着微电子学的快速发展,电子设备对元器件的要求也越来越高。Daito公司敏锐地捕捉到了这一市场趋势,决定对保险丝进行进一步的创新。在1995年,他们成功开发出了适用于电路板安装的高精度小型报警保险丝。这一产品的推出,不仅满足了市场对小型化、高精度保险丝的需求,也进一步巩固了Daito公司在电子行业中的领先地位。

随后,Daito公司又针对微电子学的进一步发展,推出了可以连续自动安装的方形微型保险丝。这一产品的推出,大大提高了生产效率,降低了成本,同时也为客户提供了更加便捷的使用体验。近年来,随着面安装技术的兴起,Daito公司又迅速推出了适用于面安装技术的片状保险丝,再次展示了他们在电子行业中的创新实力。

请注意,由于篇幅限制,以上仅为两个故事示例。如果需要更多故事,可以进一步深入研究和探索Daito公司在电子行业中的发展历程和创新实践。

FASTRAX公司的发展小趣事

随着公司业务的不断发展,FASTRAX开始积极拓展海外市场,并与多家国际知名企业建立了战略合作关系。通过与这些企业的合作,FASTRAX不仅获得了更多的市场份额,也学习到了先进的管理经验和技术知识。这些合作经验为FASTRAX的持续发展奠定了坚实的基础。

问答坊 | AI 解惑

超详细的Agilent InfiniiVision 7000B 示波器资料

InfiniiVision系列相信用过的人都非常的了解, 那么也就不多说了,大家可取所需吧。 …

查看全部问答>

决对值得收藏的PADS资料

决对值得收藏的PADS资料…

查看全部问答>

2440+CE5,ap中增加TIMER2定时中断,为何无法进入中断?? (冰天雪地跪求)

    主程序: : PLC2->DT[900]=Init_TIMER2_Interrupt(); : } static    UINT32     g_TIMER2Irq = IRQ_TIMER2; static    UINT32     g_TIMER2SysIntr = SYSIN ...…

查看全部问答>

ds18b20的诡异问题

可以读出ROM中固化的序列号,但是读取温度就是0x07ff。能读出ROM中的内容应该说明读写时序没问题,但是又读不出正确的温度。难道说是温度转化功能失效了? 注:连接为外部供电,4.7k上拉。单一元器件。温度转化时间绝对在750ms以上。…

查看全部问答>

ARM入门

我现在想学嵌入式系统,刚入门, 有没有什么好的书籍介绍给我??? 或者那边有资料下来看看???…

查看全部问答>

stm32103xx请教DMA(DMA_Mode)使用问题!

stm32手册上这样描述:循环模式:循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。在DMA_CCRx寄存器中的CIRC位用于开启这一功能。当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作 ...…

查看全部问答>

老问题-下载失败

下载程序失败,有以下一系列提示: FATAL ERROR Failed to write memory at 0xFFFE Session absorted! There were warnings during downlowd ,see log window A fatal error has occurred. The debugger will terminate 以前只是偶尔出现这 ...…

查看全部问答>

请问大侠,Lua如何移植到stm32上啊!

目前做个项目,想把Lua移植到stm32上,编译通过了,但是总是在调试时候进入到HardFault_Handler中,好像是堆栈设置太小,现在一头雾水,请求大侠帮忙啊!…

查看全部问答>