项目使用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. javascript 终极循环方法for... of ..推荐

    js目前有很多的循环方法,如for, forEach,  for .. in,  for of 等等,而在ES6里面,我们又增加了一些数据结构,比如set,map,Symbol等. 那么我们该选取哪一 ...

  2. 树组件——jstree使用

    本文记录的只是我自己当时的代码,每行的注释很清楚了,你自己可以做相应变通 一.使用前提: 1.下载jstree依赖包 2.相关页面引入样式["jstree/themes/default/st ...

  3. 洛谷 P1063 能量项链 题解

    P1063 能量项链 题目描述 在\(Mars\)星球上,每个\(Mars\)人都随身佩带着一串能量项链.在项链上有\(N\)颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并 ...

  4. shell 杀死80端口的所有进程

    netstat -lnp|grep |grep -v grep |awk

  5. mysql 获取学生个人科目平均分

    mysql> select * from test; +----+----------+-------+-----------+ | id | name | score | subject | ...

  6. nginx 平滑重启的实现方法

    一.背景 在服务器开发过程中,难免需要重启服务加载新的代码或配置,如果能够保证server重启的过程中服务不间断,那重启对于业务的影响可以降为0.最近调研了一下nginx平滑重启,觉得很有意思,记录下 ...

  7. 差分形式的牛顿插值法(c++)

    本程序对cosx函数进行插值,取步长为0.1,因此x的值为0.00,0.10,0.20,0.30,对应的y值为cos(0.00),cos(0.10),cos(0.20),cos(0.30),其实本程序 ...

  8. NIO 选择器 Selector

    选择器提供选择执行已经就绪的任务的能力,这使得多元 I/O 成为可能.就像在第一章中描述的那样,就绪选择和多元执行使得单线程能够有效率地同时管理多个 I/O 通道(Channels).C/C++代码的 ...

  9. 循环(for,while,until)与循环控制符(break,continue)

    一.for循环 第一种风格   for ((;;;))(类似C语言风格) do command done 例子:for ((i=0;i<10;i++)) do echo $i done 第二种风 ...

  10. css3实现水平垂直居中------(特别注意,里边的固定还是不固定)

    a,----定位方式(父元素宽高固定,子元素宽高固定) <div class="Father"> <div class="children"& ...