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

    文章

    16977

    浏览量

    350215
收藏 人收藏

    评论

    相关推荐

    8bit DAC芯片设计和测试方案

    NIC公司最近正在竞争一个8bit DAC芯片设计的订单机会,需要按照甲方需求尽快提交芯片的设计和测试方案参加评审会。你们作为NIC公司的芯片研发和测试团队,承担了这个任务,需要在2021年8月31日以前完成芯片的设计和测试方案,方案的好坏直接决定了甲方是否会和NIC公司
    发表于 07-11 11:20 4422次阅读

    如何从主机将数据按8bit传入片上ITCM?

    需求:如何从主机将数据按8bit传入片上ITCM 我想在PC端(主机)通过8位IO每个周期传入8bit数据(一共大概32KB的数据,包括自定义指令和局部变量的数据,由.verilog文件读出来
    发表于 05-24 07:40

    什么原因会导致单片机程序

    ______________________________________ 什么原因会导致单片机程序
    发表于 10-16 22:31

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

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

    单片机程序原因是什么

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

    单片机程序的几种原因

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

    8bit PSoC 及回流焊机应用

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

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

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

    致单片机程序总是怎么办

    单片机中有看门狗,长时间不喂狗,程序就会复位。为什么长时间不喂狗呢?这是因为程序飞了,抛开外部因素不谈。今天就和大家分享一下,单片机程序
    的头像 发表于 09-26 10:45 6491次阅读

    单片机程序的三种现象、原因及解决方法

    在编写单片机程序的时候,由于中断服务程序写的不好,导致单片机程序总是,最后费了好长时间,花了很大功夫才找到问题
    发表于 02-08 15:47 8次下载
    单片机<b class='flag-5'>程序</b><b class='flag-5'>跑</b><b class='flag-5'>飞</b>的三种现象、<b class='flag-5'>原因</b>及解决方法

    8bit 8051/32bit Cortex-M0 Flash单片机产品选型手册

    8bit 8051/32bit Cortex-M0 Flash单片机产品选型手册免费下载。
    发表于 07-01 09:07 1次下载
    <b class='flag-5'>8bit</b> 8051/32<b class='flag-5'>bit</b> Cortex-M0 Flash单片机产品选型手册

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

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

    使用STM32C0轻松实现从8bit到32bit的平台升级

    电子发烧友网站提供《使用STM32C0轻松实现从8bit到32bit的平台升级.pdf》资料免费下载
    发表于 07-29 11:27 0次下载
    使用STM32C0轻松实现从<b class='flag-5'>8bit</b>到32<b class='flag-5'>bit</b>的平台升级

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

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

    单片机程序?从这6个方面查找原因

    单片机程序?从这6个方面查找原因
    的头像 发表于 10-26 16:43 988次阅读