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程序跑飞原因分析

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

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

    关注

    452

    文章

    50117

    浏览量

    420338
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16840

    浏览量

    349735
  • 复位
    +关注

    关注

    0

    文章

    169

    浏览量

    24172
  • 中颖电子
    +关注

    关注

    4

    文章

    171

    浏览量

    7408

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

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

收藏 人收藏

    评论

    相关推荐

    智能手表2016年第三季度出货量下滑 五大原因分析

    根据Paste报导,根据市调机构IDC调查,2016年第3季全球智能型手表出货量较2015年同期下滑51.6%,即可看出此衰退情况,本文列举了苹果Apple Watch未能达到销售预期,智能型手表元老业者Pebble求出售等五大原因分析。
    发表于 12-19 14:59 2857次阅读

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

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

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

    `五大原厂解决方案,下载即可赢取“豪礼”【活动时间】: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

    单片机程序原因是什么

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

    单片机程序的几种原因

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

    智能手机为什么需要M2M的五大原因

    通过使用M2M SIM卡融入智能手机的方式,智能手机上的M2M技术能帮助用户超越“这里有一款应用可以供你使用”(there’s an app for that)的广告语,以下为下一代智能手机需要M2M的五大原因
    发表于 01-11 09:21 2726次阅读

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

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

    看门狗定时器防止溢出复位程序

    看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而的事故。程序中设置看TL=WDTPW+WDTCNTCL,当程序
    发表于 04-23 09:59 4659次阅读
    看门狗<b class='flag-5'>定时</b>器防止溢出<b class='flag-5'>复位</b>程序

    简述AMD INFINITY GUARD对安全至关重要的五大原因

    Guard 内置于芯片层面,可帮助客户保护重要的资产——数据。 AMD INFINITY GUARD对安全至关重要的五大原因: 现代方法 以多层
    的头像 发表于 05-29 11:03 2761次阅读

    开发人员使用Helix QAC实现静态代码测试合规性的五大原因

    30多年来,Helix QAC(以前称为PRQA)一直是值得信赖的静态分析工具,可满足严格监管和安全至上行业的严格合规要求。在这里,我们分享了开发人员选择Helix QAC的五大原因
    的头像 发表于 11-14 09:59 993次阅读
    开发人员使用Helix QAC实现静态代码测试合规性的<b class='flag-5'>五大原因</b>

    开发人员使用Klocwork进行软件安全的五大原因

    Klocwork 专为企业 DevOps 和 DevSecOps 而构建,是首选的静态分析和 SAST 工具,用于保持高开发速度,同时还强制实施安全性和质量的持续合规性。在这里,我们分享了开发人员选择Klocwork的五大原因
    的头像 发表于 11-17 10:37 558次阅读
    开发人员使用Klocwork进行软件安全的<b class='flag-5'>五大原因</b>

    8bit MCU程序原因分析

    中颖8bit MCU程序原因分析
    的头像 发表于 10-27 15:17 1067次阅读
    8bit MCU程序<b class='flag-5'>跑</b><b class='flag-5'>飞</b><b class='flag-5'>原因</b>分析