项目使用stm8l051f3做主控,CC2500做数据接收,不发送。

跑飞的现象就是,刚开始能运行,经过一段未知长度的时间,有可能是3分钟,有可能是30分钟,指示灯不再闪烁,中断按键单片机无反应。

接入调试器发现跑到了一个非常大的地址,已经超过了mcu的内部flash空间。可以确定是程序跑飞。

经验是:

程序跑飞,查条件语句是否都有做处理。

程序跑飞,查内存溢出。

查了好久,查出是内存溢出导致。

因为发送端发送的数据固定是32字节,所以在接收端只开辟了一个32字节的buffer去读取收到的数据。

/*******************************************************************************  
* @brief GDO2中断处理函 
* @param None

* @retval None
****************************************************************Author:Liming**/
void GDO2_Int(void)
{
uint8_t temp;
unsigned char RecvBuffer[0x20]={};//开辟32字节缓存
unsigned char RecvLength;
if(EXTI_GetITStatus(EXTI_IT_Pin6) != RESET)
{
EXTI_ClearITPendingBit(EXTI_IT_Pin6);
DelayNms();//等待接收完成
RecvLength = CC2500Recv(RecvBuffer); //获取收到的数据长度 temp = ProPacketCheck(RecvBuffer,RecvLength,0x0001,0x0003);//数据完整性校验 if((temp == 0x04)||(temp==0xff)) // 本机和广播信息需要处理
{
       //数据处理
CC2500SetState(CC2500_STATUS_POWERDOWN_LEVEL2);
}
else
CC2500SetState(CC2500_STATUS_RECEIVE);
}
}
//接收数据
unsigned char CC2500Recv(unsigned char *Buffer,unsigned char Mode)
{
unsigned char Result=0x00,Status=0x00;
switch(CC2500State)
{
case 0x00:
case 0x01:
if(CC2500State) Delayms(0x07);
else Delayus(0x30);
Status=CC2500SpiReadStatus(RXBYTES);
if(Status&0x80)//如果数据长度超过64字节
{
CC2500SpiReadBuffer(FIFO,Buffer,0x40);//读取64字节
Result=0x40;
}
else if(Status&0x7F)
{
CC2500SpiReadBuffer(FIFO,Buffer,Status&0x7F);//读取收到的数据
Result=Status&0x7F;
}
CC2500SetState(Mode);
break;
}
return Result;//返回读取的数据长度
}

但由于无线信号的干扰,CC2500可能会收到大于32字节的数据(虽然不是本系统需要的),

导致在从cc2500取出的时候,存入buffer的长度超过开辟的buffer空间。

解决办法1:既然知道是32字节数据,可以在

    CC2500Recv接收函数里只接收32字节。
    if(Status&0x80)//如果数据长度超过64字节
{
CC2500SpiReadBuffer(FIFO,Buffer,0x20);//读取32字节
Result=0x20;
}
else if(Status&0x7F)
{
CC2500SpiReadBuffer(FIFO,Buffer,0x20);//读取收到的数据
Result=0x20;
}
 

解决办法2:

    GDO2_Int函数里开辟64字节空间即便是收到最多的数据也不会超出缓存空间。
    unsigned char RecvBuffer[0x40]={0};//开辟64字节缓存

有了这次的程序跑飞的处理经历,再次验证了程序跑飞大部分都是内存溢出导致的说法。

记一次stm8l程序跑飞的更多相关文章

  1. RK3288 st7703 mipi屏指令过长,程序跑飞

    本文为博主原创文章,转载请注明出处:https://www.cnblogs.com/lialong1st/p/11218433.html CPU:RK3288 系统:Android 5.1 调试 mi ...

  2. Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript.

    Atitit.线程 死锁 跑飞 的检测与自动解除 与手动解除死锁 java c# .net php javascript. 1. 现象::主程序卡住无反应,多行任务不往下执行 1 2. 原因::使用j ...

  3. 使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象

    如题(“使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象”). 今天使用ffmpeg进行宿放和颜色格式转换,很简单的代码,却折腾了我一天,这里说来就气啊 ...

  4. 痞子衡嵌入式:IVT里的不同entry设置可能会造成i.MXRT1xxx系列启动App后发生异常跑飞

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IVT里的不同entry设置可能会造成i.MXRT1xxx系列启动App后发生异常跑飞问题的分析解决经验. 事情缘起恩智浦官方论坛上的一 ...

  5. arm跑飞 分析

    当arm跑飞后,可以用ICE 追踪是哪边出错了: 1. 链接ICE, 修改Ice的mode,由 udf -> system. (因为跑飞了,在UDF) 2. 查看寄存器: LR对应callbac ...

  6. .Net程序跑在Linux上

    .Net越来越拥抱开源了,今天就试了如何让.Net程序跑在Linux上,果然再无人可以阻挡.Net的脚步了. Linux Disibutaion:Open Logic 7.2 1.Install .N ...

  7. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...

  8. 8天入门docker系列 —— 第八天 让程序跑在swarm集群上

    真正的落地部署都是希望程序跑在集群下,而不是单机版下测测玩玩,所以这篇就来聊一下怎么使用docker swarm进行部署,因为是swarm是docker自带的, 所以部署起来还是非常简单的. 一:前置 ...

  9. macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来

    macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来--2020年10月5日 国庆假期,陪老婆的同时也不能忘记给自己充充电,这不想搞个CMS系统,考虑自己的时间并不多,所以想找 ...

随机推荐

  1. [RN] React Native 使用 React-native-scrollable-tab-view 实现 类头条 新闻页头部 效果

    React Native 使用 React-native-scrollable-tab-view 实现 类头条 新闻页效果 效果如下: 一.安装依赖 npm install react-native- ...

  2. Promise链式调用 终止或取消

    Promise回调分两种方法,then成功,catch失败 let promise = new Promise(function(resolve, reject){ resolve('第一次成功') ...

  3. SQLSERVER教师学生成绩课程四表联合各种SQL考题

    --CREATE DATABASE EXAM_1 --GO USE EXAM_1 --判断并删除表 IF OBJECT_ID('Scores') IS NOT NULL DROP TABLE Scor ...

  4. 范仁义html+css课程---3、图片和超链接

    范仁义html+css课程---3.图片和超链接 一.总结 一句话总结: img标签是图片标签,定义 HTML 页面中的图像 a标签是超链接标签,用于从一个页面链接到另一个页面. 1.img标签要点? ...

  5. vue+websocket demo 实例

    vue+websocket demo: <!-- vue + websocket连接demo --> <template> <div class="" ...

  6. 方法名同类名相同如果没有__construct,会被当做构造函数。

    简介本文主要罗列些例子,看看当php类名和函数名重名时,php是如何处理的例子<?php class TestObject{ public $subject; private $message ...

  7. Java基础 三目运算符 在嵌套时,使用括号

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  8. iOS - 点击UIButton不变灰,button的image不变灰

    要想让uibutton点击不变灰 初始化的时候就不能 UIButton *button = [[UIButton alloc]init]; 初始化的时候酱紫,可以保证button点击时不变灰 UIBu ...

  9. copyProperties 忽略null值字段

    在做项目时遇到需要copy两个对象之间的属性值,但是有源对象有null值,在使用BeanUtils来copy时null值会覆盖目标对象的同名字段属性值,然后采用以下方法找到null值字段,然后忽略: ...

  10. [LeetCode] 651. 4 Keys Keyboard 四键的键盘

    Imagine you have a special keyboard with the following keys: Key 1: (A): Print one 'A' on screen. Ke ...