0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

芯片不定时跑飞和复位的五大原因

中颖电子 来源:中颖电子 作者:中颖电子 2022-06-09 16:24 次阅读

MCU程序开发调试过程中,总会发现很多的程序bug。有一些bug是逻辑问题,规格书理解问题,笔误问题等,以上列出的这些问题,通过断点,单步等调试手段,很容易发现并解决问题。但是有一些程序的bug就比较难通过常规手段定位出问题的地点和原因,例如:芯片不定时跑飞和复位。

以下总结了芯片不定时跑飞和复位的5大原因

1、看门狗复位

原因:程序中使用了看门狗,但是没有及时清看门狗,从而导致看门狗复位,使程序直接跳到复位位置。

解决方法:通过读或写RSTSTAT寄存器,在程序中清看门狗。

示例:

A.程序中写RSTSTAT寄存器清看门狗。

9e9dd592-e7cb-11ec-ba43-dac502259ad0.png

2、中断服务程序缺失

原因:程序中打开了某个中断,但是没有相应的中断服务程序,从而导致在中断发生后,找不到中断服务程序入口,从而导致程序跑飞。

解决方法:检查程序中是否存在打开了某个中断,但是没有相对应的中断服务程序。

示例:

A.使能外部中断0,并且屏蔽外部中断0服务程序。

9ef0d634-e7cb-11ec-ba43-dac502259ad0.png

9f8cfa64-e7cb-11ec-ba43-dac502259ad0.png

B.下降沿触发外部中断0后,程序跑到地址0x0003处(INT0向量地址为0x0003),由于没有中断服务程序,该地址的指令被编译器填充为初始化程序,因此导致程序跑飞。

9fb4fb90-e7cb-11ec-ba43-dac502259ad0.png

3、 中断服务程序没有对bank压栈和出栈

原因:主程序在操作bank1寄存器时,进入中断没有对bank1压栈,此时切换到bank0对寄存器操作,退出中断后由于没有保存bank1的状态,导致主程序在bank0中对bank1的寄存器操作,误改bank0寄存器的值,程序可能会运行异常。

解决方法:进入中断服务程序后,对bank进行压栈,退出中断之前对bank进行出栈,这样无论主程序在操作bank0还是bank1,中断里面都会保存进中断之前bank状态,退出中断后会还原bank状态,这样就不会因为切换bank导致寄存器的值被误改。

示例:

A.在主循环操作bank1寄存器,定时器Timer3中断里面不进行压栈和出栈操作,直接操作bank0寄存器。

9fe85d5a-e7cb-11ec-ba43-dac502259ad0.png

B.退出中断后此时程序状态为bank0,下一步返回主程序,本来应该改变的是P5_0的值,由于没有切换到bank1,所以在bank0中将相同地址的寄存器P0_0的值误改,同时导致P5_0的值修改无效。

a00c6cae-e7cb-11ec-ba43-dac502259ad0.png

a037c62e-e7cb-11ec-ba43-dac502259ad0.png

a0855a06-e7cb-11ec-ba43-dac502259ad0.png

4、数组越界

原因:程序中定义的数组元素的个数小于程序中实际使用的数组元素的个数,数组使用循环函数时,如果循环变量没控制好则会出现数组越界,意外修改其他变量值可能会导致程序异常。

解决方法:检查函数中调用的数组是否存在越界的情况。

示例:

A.定义SendBuffer和RecBuffer两个数组变量,数组长度为5,初值均为0。

a0ac7a82-e7cb-11ec-ba43-dac502259ad0.png

B.主程序中对数组SendBuffer[0]~ SendBuffer[4]赋值,此时SendBuffer[5]和SendBuffer[6]也被意外赋值,从watch窗口可以看出,这两个值改变了原来RecBuffer[0]和RecBuffer[1]的值,可能会造成程序异常。

a0fb8744-e7cb-11ec-ba43-dac502259ad0.png

a1206ee2-e7cb-11ec-ba43-dac502259ad0.png

5、堆栈溢出

原因:函数嵌套太深或者局部变量太多导致超出堆栈空间,正常数据被改写。

解决方法:尽量减少函数调用层级,局部变量不要使用太多,尤其是局部大数组,从而减少压栈的时候所需的空间。

示例:

A.定义4个全局变量和1个局部变量数组,总共占用RAM空间为249个字节

a146a724-e7cb-11ec-ba43-dac502259ad0.png

a1bdc34a-e7cb-11ec-ba43-dac502259ad0.png

B.计算程序中所需的堆栈大小,主程序中调用Delay()函数,占用2个字节,中断服务函数占用16个字节,中断嵌套调用leddisplay()函数,占用2个字节,总共需要20个字节堆栈空间,由A可知,系统只剩下6个字节堆栈空间,所以程序运行后,堆栈一定会溢出。

a20edcee-e7cb-11ec-ba43-dac502259ad0.png

a235424e-e7cb-11ec-ba43-dac502259ad0.png

a2a332ae-e7cb-11ec-ba43-dac502259ad0.png

C.运行程序,正常现象为P40端口一直翻转,TestData变量值始终为0,触发外部中断0,进入中断服务程序后,可以看到SP堆栈指针已经溢出,同时将R7寄存器的值压栈到0x08的地址上,通过.m51文件可以查到0x08正好是TestData变量地址,所以TestData的值被误改为0x01,导致主程序中条件判断出错,程序异常。

a2c4aa2e-e7cb-11ec-ba43-dac502259ad0.png

a2df18be-e7cb-11ec-ba43-dac502259ad0.png

a2f123ce-e7cb-11ec-ba43-dac502259ad0.png

a3142716-e7cb-11ec-ba43-dac502259ad0.png

在调试MCU程序过程中,由于程序书写的不规范产生程序漏洞,跑飞现象比较常见,如果我们提前了解程序可能跑飞的原因,对于快速定位问题有很大帮助,从而提高分析和解决问题的效率,减少产品的开发周期,加速产品的上市时间。

原文标题:中颖8bit MCU程序跑飞原因分析

文章出处:【微信公众号:中颖电子】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    446

    文章

    47706

    浏览量

    408897
  • mcu
    mcu
    +关注

    关注

    145

    文章

    15992

    浏览量

    343365
  • 复位
    +关注

    关注

    0

    文章

    159

    浏览量

    24033
  • 中颖电子
    +关注

    关注

    4

    文章

    168

    浏览量

    7212

原文标题:中颖8bit MCU程序跑飞原因分析

文章出处:【微信号:SINO_25181447,微信公众号:中颖电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    TC233使用QSPISPI程序单片机不定时复位原因

    使用TC233使用QSPI外设,SPI作为从机和其他单片机进行SPI通讯,不定时重启,如果数据收发比较快的话复位频率就比较高,如果延时一秒发送同样会复位,只是频率会低一些,另外我是用SPI3当从机
    发表于 02-02 07:58

    【每周论点】 DSP程序原因有哪些?你是如何解决的?.

    ,说来奇怪,名称完全相同,封装不同,加上管脚定义不同,造成了看门狗芯片复位电压总是低电压。终于找到问题了。那么你在开发过程是否也遇到了DSP程序的bug呢,你是如何解决的,欢迎大
    发表于 02-17 22:27

    五大原厂解决方案,下载即可赢取“豪礼”

    `五大原厂解决方案,下载即可赢取“豪礼”【活动时间】:2014年9月1日——2014年11月30日【活动介绍】:贸泽解决方案中心,重磅推出五大厂家解决方案。即日起下载即可赢取“豪礼”【资料下载
    发表于 09-16 10:12

    五大原厂解决方案,下载即可赢取“豪礼”

    `五大原厂解决方案,下载即可赢取“豪礼”【活动时间】:2014年9月1日——2014年11月30日【活动介绍】:贸泽解决方案中心,重磅推出五大厂家解决方案。即日起下载即可赢取“豪礼”【资料下载
    发表于 09-16 14:05

    五大原厂解决方案,下载即可赢取“豪礼”

    `五大原厂解决方案,下载即可赢取“豪礼”【活动时间】:2014年9月1日——2014年11月30日【活动介绍】:贸泽解决方案中心,重磅推出五大厂家解决方案。即日起下载即可赢取“豪礼”【资料下载
    发表于 09-16 14:08

    五大原厂解决方案,下载即可赢取“豪礼”

    五大原厂解决方案,下载即可赢取“豪礼”【活动时间】:2014年9月1日——2014年11月30日【活动介绍】:贸泽解决方案中心,重磅推出五大厂家解决方案。即日起下载即可赢取“豪礼”【资料下载
    发表于 09-16 14:10

    [转帖]单片机程序死机大原因

    单片机程序死机,飞了可以从以下几个方面查找原因:1.意外中断。是否打开了某个中断,但是没有响应和**中端标志,导致程序一直进入中断,造成死机假象。2. 中断变量处理不妥。若定义某些会在中断中修改
    发表于 04-06 13:25

    单片机程序死机原因

    转帖:单片机程序死机原因单片机程序死机,飞了可以从以下几个方面查找原因:1.意外中断。是否打开了某个中断,但是没有响应和清除中端标志,
    发表于 10-13 20:49

    单片机/ARM死机或的诊断疗法

    干扰的原因,在非预期的情况下,使得程序计数器PC 的值发生随机的变化,从而使得程序的流向指向不确定区域,这便是程序的。程序后或者会使
    发表于 08-26 16:16

    单片机/ARM死机或的诊断疗法

    经常出现的程序现象。 在单片机系统中,因为干扰的原因,在非预期的情况下,使得程序计数器PC 的值发生随机的变化,从而使得程序的流向指向不确定区域,这便是程序的
    发表于 05-06 15:10

    FPGA状态机原因是什么

    FPGA状态机为什么会呢?FPGA状态机原因是什么?
    发表于 11-01 07:52

    如何利用TIMx定时复位模式串口接收不定长数据呢

    TIMx定时器有哪几种模式呢?如何利用TIMx定时复位模式串口接收不定长数据呢?
    发表于 11-23 06:21

    单片机程序原因是什么

    中有看门狗,长时间不喂狗,程序就会复位。为什么长时间不喂狗呢?这是因为程序飞了,抛开外部因素不谈。今天就和大家分享一下,单片机程序的几个原因
    发表于 12-13 07:17

    单片机程序的几种原因

    几种可能的原因:1、 数组越界/溢出现象:程序在函数中运行时,总是在运行到函数末尾,要跳出函数时,程序。解决方法:如果在调试程序时,发现程序总是在函数执行完毕时
    发表于 11-30 12:57

    从LED光源的五大原物料浅析LED死灯的25种原因

    以失效分析大数据显示,LED死灯的原因可能过百种,限于时间,今天我们仅以LED光源为例,从LED光源的五大原物料(芯片、支架、荧光粉、固晶胶、封装胶和金线)的入手,介绍部分可能导致死灯的原因
    发表于 04-26 16:59 6169次阅读