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

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

3天内不再提示

8bit MCU程序跑飞原因分析

jf_pJlTbmA9 来源:中颖电子 作者:中颖电子 2023-10-27 15:17 次阅读

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

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

1、看门狗复位

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

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

示例:

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

wKgZomUD5DqACoynAABScJB1KNg477.png

2、中断服务程序缺失

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

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

示例:

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

wKgaomUD5DuAORwkAABKKZ5iavQ184.png
wKgZomUD5DyAKMS7AABkGr1yFNE613.png

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

wKgZomUD5D6Ae7HJAAA38yEaYwU414.png

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

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

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

示例:

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

wKgaomUD5D-AHe2oAACWNl5rH8I095.png

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

wKgZomUD5ECAf4B_AAEhJTvH1rM826.png
wKgaomUD5EKASCsVAACOPWSYKqU269.png
wKgaomUD5EOAYFDtAAApOOWHLGU800.png

4、数组越界

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

示例:

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

wKgZomUD5ESAbjPAAADH6sEOAok184.png

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

wKgZomUD5EiARpeIAAA5acAoBlQ926.png
wKgaomUD5EmAaUUEAABdNfae0ow715.png

5、堆栈溢出

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

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

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

wKgZomUD5EqAFeI-AACD3vrk0Rs610.png
wKgaomUD5EyALBlbAABC7ULSvzc738.png

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

wKgaomUD5E6Aad2yAAClUgRZA5o094.png
wKgZomUD5E-AWtyTAABetdy2jaw889.png
wKgaomUD5FCAKiL4AAAiwn0-x2g109.png

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

wKgZomUD5FSAIcl4AADd2rBrEz8967.png
wKgZomUD5FaARrTfAAAVb1x7eRI548.png
wKgaomUD5FeATBFsAABKWxLqWns676.png
wKgaomUD5FiACTUvAACjv9t_UAM149.png

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

来源:中颖电子
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

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

    关注

    146

    文章

    16018

    浏览量

    343639
收藏 人收藏

    评论

    相关推荐

    程序经常跑原因

    程序经常跑原因1)程序没有结尾或不是循环的程序。 2)nmi管脚没有上拉。 3)在看门狗动作的时候
    发表于 04-07 09:09

    对什么对EEPROM进行连续写操作时程序

    我使用的是思卡尔的8位机,采用模拟时序对EEPROM(以前用的是AT24C256,现在用的是24LC0281 SN,据说厂家只是把型号换了,实质是一样的,不知道是真是假)连续写操作时,第一二次写还是可以的,第三次就会出现程序
    发表于 03-29 11:10

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

    DSP程序原因有很多,你遇到过吗?你解决了吗?能分享你的经验吗?谢谢。先说说我以前的项目经历。一般调试代码的步骤有两种方案方案一:先调试主程序
    发表于 02-17 22:27

    程序不知道原因

    大家好,我用两路 IIC 分别测出角加速度和陀螺仪的数据,每10ms进入一次中断,中断中对数据经行处理,并通过usart发送数据。但是程序总是原因可能是什么。下面是我中断的代码。
    发表于 04-23 23:22

    请问该如何正确增大8bit Tiler Size?

    Size 为384MB,8bit Tiler 为128MB,16bit Tiler 为256MB但是运行程序时,8bit Tiler 不够用,16
    发表于 05-31 05:50

    8bitbit7和bit6-0都是什么意思

    8bitbit7和bit6-0都是什么意思
    发表于 07-12 17:57

    STM32F030擦除FLASH时程序

    请教各位大神:使用STM32F030C8T6芯片,在擦除FLASH过程中,如果串口收到较多的数据(60字节左右),程序便会在擦除FLASH过程中导致看门狗复位。请问这是什么
    发表于 12-26 08:49

    是什么原因造成单片机程序为什么会死机或

    单片机程序为什么会死机或呢?有哪些原因
    发表于 11-09 06:01

    单片机程序原因是什么

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

    单片机程序的几种原因

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

    对于一个数组为什么越界使用会导致MCU程序呢?

    对于一个数组为什么越界使用会导致MCU程序
    发表于 10-13 06:01

    8bit PSoC 及回流焊机应用

    8bit PSoC 及回流焊机应用
    发表于 06-30 19:49 900次阅读

    怎么判断液晶面板是8bit还是6bit

    目前常用的液晶显示器中,高速的(12ms或以下)多用6bit驱动,低速的(20ms或以上)多用8bit驱动。因为6bit的处理速度要远高于8bit(64倍)。而标16.2M或者16M色
    发表于 05-18 15:08 1.2w次阅读

    PT8M2101A触控型 8Bit MTP MCU的产品概述

    PT8M2101A(触控型 8Bit MTP MCU
    发表于 06-23 15:29 609次阅读

    8bit 单片机I/O设置介绍

    中颖8bit 单片机I/O设置介绍
    的头像 发表于 10-27 15:41 392次阅读
    <b class='flag-5'>8bit</b> 单片机I/O设置介绍