历史上的今天
返回首页

历史上的今天

今天是:2025年02月26日(星期三)

正在发生

2020年02月26日 | 记一次stm8l程序跑飞

2020-02-26 来源:eefocus

项目使用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]={0};//开辟32字节缓存

    unsigned char RecvLength;

    if(EXTI_GetITStatus(EXTI_IT_Pin6) != RESET)

    {

        EXTI_ClearITPendingBit(EXTI_IT_Pin6);

        DelayNms(1);//等待接收完成

        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字节缓存


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

推荐阅读

史海拾趣

EZchip Technologies Ltd公司的发展小趣事

在电子行业中,人才和研发实力是企业成功的关键。EZchip深知这一点,因此一直重视人才团队的建设和研发实力的提升。公司拥有一支由业内顶尖专家和学者组成的研发团队,他们具备丰富的行业经验和深厚的技术功底。同时,EZchip还注重人才培养和引进,通过提供良好的工作环境和福利待遇吸引了一批批优秀人才加入。正是这些优秀的人才和强大的研发实力,为EZchip的持续发展提供了有力保障。

绿宝石(BERYL)公司的发展小趣事

绿宝石公司自创立之初,便致力于电子材料领域的研发。某年,公司研发团队成功开发了一种具有优异性能的绿宝石电子材料,这种材料在高频、高温等极端环境下仍能保持稳定性能,为电子行业带来了革命性的变革。随着这一技术的广泛应用,绿宝石公司在行业内逐渐树立了技术领先的形象,市场份额稳步上升。

Chip Technologies Inc公司的发展小趣事

为了进一步扩大市场份额,Chip Technologies Inc积极寻求与国际知名企业的合作。通过与这些企业建立战略合作关系,公司不仅获得了更多的技术支持和市场资源,还成功将产品推向了全球市场。这些合作不仅提升了公司的品牌知名度,也为公司的长期发展奠定了坚实的基础。

Azoteq公司的发展小趣事

近年来,Azoteq在传感技术方面取得了重大突破。其最新产品系列——ProxFusion®,是世界上第一个单芯片集成多传感器功能的解决方案。这一创新产品将多种传感功能集成在一个芯片上,为客户提供了更加便捷、高效的解决方案。ProxFusion®的推出,再次展现了Azoteq在传感技术领域的领先地位。

GPD Optoelectronics Corp公司的发展小趣事

随着触控技术的兴起,Azoteq在2004年增加了第二条产品线,以应对新兴的电容式触摸和接近感应产品市场。这一举措使得Azoteq能够紧跟市场趋势,为客户提供更多样化的产品选择。通过不断的技术创新和市场拓展,Azoteq在这一领域逐渐取得了领先地位。

Global Connector Technology公司的发展小趣事
使用合适的工具检查电源电压是否稳定,是否存在电磁干扰等问题。

问答坊 | AI 解惑

用电阻做功率模拟

请教各位,我现在测一块散热板的散热效率,打算用铜壳线绕电阻做一个30W的发热源,电阻型号有以下几款 220Ω/5W;500Ω/8W;输入电压在60V左右,请问应该怎样排列电阻效果才好?谢谢!…

查看全部问答>

闪电击中世界最高建筑哈利法塔

上面这张令人震惊的照片展示了世界最高建筑哈利法塔遭闪电击中时的场面。 照片的拍摄者是一位23岁名叫穆罕默德·哈姆丹的学生,来自巴基斯坦,目前在阿联酋攻读建筑工程学。当时,迪拜正遭受暴风雨的袭击。雷电中,高达828米的哈利法塔在紫色的 ...…

查看全部问答>

今天参加mcu day赠送的一款开发板

参加TI mcu Day时,送的开发板,据说可以当做jtag仿真器使用,双重功能!!!…

查看全部问答>

U盘多盘符的问题

我在一个嵌入式系统中,主机在GET MAX LUN我已经返回01,但是主机并未显示2个盘符.仅仅出现了一个盘符 还需要做哪方面的工作…

查看全部问答>

关于桥式整流

这是在空闲之际模拟的几张桥式整流和接电容的图片,希望能对大家有点用处。    大家注意看波形随着电容的变化而变化。…

查看全部问答>

hmc5883的程序有人做过么?我的程序哪里出问题了?本人菜鸟,见笑了。

调了好几个小时了,就是不知道问题在哪里,请高手们指点。 测量先不说,就是怎么读寄存器都没弄清。 看了中文的pdf了,但是还是没搞懂,先看看我的程序吧。 程序部分(已近将无关部分删除): uchar code table[]=\"0123456789\"; //////////// ...…

查看全部问答>

有谁用了ADS8332,求程序!

最近用到团购买回来的ADS8332,但是调试了两天没成功,求助各位!谢谢!…

查看全部问答>

debug正常,51运算错误

已经用其他程序试验过了,不是xdata的问题,xdata里的数据能正常使用。我在用51做一个32点的fft。 部分代码如下: #include #include #define  uchar  unsigned  char #define  uint unsigned int ...…

查看全部问答>

谁用单片机驱动过PS2的数字小键盘?

我在网上买了一块PS2的数字小键盘,就是传统台式机键盘最右边的数字键部分。 学习了一下PS2及扫描编码相关内容,看懂了程序,但是,由于小键盘只有部分按键,有的键还是不能读取。 0—9数字键是可以输入的,小键盘的enter也能读取,但+、-、*、/ ...…

查看全部问答>