OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7473|回复: 9

单片机跑着跑着,出现数据异常现在,该如何找到问题所在地?

[复制链接]

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
发表于 2022-8-19 14:42:13 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 chenyuan 于 2022-8-19 14:56 编辑

目前在搞的一个项目,出现跑着跑着数据异常的现象了

正常情况下,通过按不同的按键会输出不同的值,并且在屏幕上会显示进度条的状态(以百分比形式显示),
但是当跑着跑着,发现按按键,屏幕上显示的值很小,如之前按的话是显示 + -100的两种状态,现在按的话,只能显示 + -5的变化,
通过这个现象我猜测是output(用于显示器显示的数组变量)地址前定义的变量出现溢出操作,然后根据.map文件往前一直找了1000多字节,没发现哪个变量有特别明显的关于数组溢出的操作。

并且这个现象是随机出现的,没有啥规律,同一个代码,在好几块板子上跑,出现的次数 板子 时间都没有啥规律,跑了一天 有些板子一次都没出现,有些出现了一次

目前有些走进死胡同了,请教各位大佬,还有什么情况下会导致这种问题吗,???

谢谢啦!


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2022-8-19 15:07:26 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-8-24 00:21:17 | 显示全部楼层
加printf辅助查找
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2022-8-25 16:51:43 | 显示全部楼层
查找数组越界溢出,看看你的定义全局变量
1-1
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-8-26 09:53:11 | 显示全部楼层
本帖最后由 chenyuan 于 2022-8-26 09:55 编辑

大概率是这个的问题   Radio.GetPayload(rfRxBuf, &buffLen, 250);//读取收到的数据
这个是SX1280的接口函数  三个参数,
rfRxBuf是我定义的一个数组rfRxBuf[127],用来从RF芯片中读取数据,然后放到这个数组中;
buffLen是从RF芯片中读取收到的数据长度;
250 是限制最大长度
  1. /*
  2. 函数功能:得到收到数据、数据大小
  3. */
  4. uint8_t SX1280GetPayload( uint8_t *buffer, uint8_t *size , uint8_t maxSize )
  5. {
  6.     uint8_t offset;

  7.     SX1280GetRxBufferStatus( size, &offset );//得到数据大小 偏移量
  8.     if( *size > maxSize )
  9.     {
  10.         return 1;
  11.     }
  12.     SX1280HalReadBuffer( offset, buffer, *size );//根据数据大小,偏移量,得到数据
  13.     return 0;
  14. }
复制代码


正常情况下,收到的数据长度为9 ,
但是异常情况下,收到错误数据,虽说是错误数据(我这开了好几个收发端,造成的干扰更大),我后面解码是不用它,但是还是会执行上面那个读取数据的操作,这个时候获取的长度是未知的,可能大于127了,导致溢出操作了

实测在连上接收机后,偶尔出现数据异常的现象;在未连上接收机的时候,跑了一天没出现数据异常的现象

不过我测试在手动修改数组值,导致溢出时候,没复现出他这个“半死机”的现象,可能还有其他的一些地方还有问题

修改好这块,然后跑了一段时间还未出现“半死机”现象,看后续还有没有问题了


回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-8-29 15:36:20 | 显示全部楼层
哎 修改了  跑了一天了都没出现,还以为改好了,结果又出现这种现象了,.................

对照.map文件
rfRxBuf   0x0000000020011280       0x7f   rfRxBuf (这个变量就是5楼我那改的那)
...
g_eeGeneral  0x00000000200114fc       0x38            g_eeGeneral(已知该变量的值被改变了)

0x114fc - 0x11280 = 0x27c = 636字节 (这两个变量之间间隔636字节,照理应该不会影响到g_eeGeneral变量了)

然后对着map文件,在g_eeGeneral变量,往前一点找了些数组,未发现有溢出的操作........

然后猜测会不会是栈溢出导致的,我搜了下堆栈溢出的情况,和我这现象有点类似,也有是数据被改变的,然后进硬件中断的
但是我这又是好几十台机一起跑,然后出现异常现象的又没有固定触发条件,都是“随机”的,几十台跑一天可能就一台出现,要是堆栈溢出的话,应该是比较有规律性的出现异常情况吧?
请教各位大佬 要从哪方面判断,如何复现异常情况呢? 谢谢啦!
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-8-31 15:46:46 | 显示全部楼层
麻了.....  找好多天没找到具体问题了

【这个导致异常数据的情况是随机的.....】
目前就已知了 g_eeGeneral这个变量的值全被修改成了0xA5,(这个结构体大小是56个字节,因为这个参数会写到w25q64里,当出现异常的时候,将其写到W25Q64里去,然后我通过工具读出来,发现全是0xA5)

然后全局搜了下0xA5哪里用到了,没发现我在哪个地方对其他的一些变量赋值了0xA5,而且还是连续性的0xA5;

最后搜到了在创建任务时,会对栈进行填充0xA5(内存填充函数memset把pxStack整个堆栈全部填上 tskSTACK_FILL_BYTE(0XA5)(检测堆栈溢出用,当不等于0XA5时说明已经被使用):)
( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) );//tskSTACK_FILL_BYTE-----0xA5
这里会有一段连续性的0xA5出现,然后我就想着会不会是任务堆栈溢出了?

然后算了下,我三个任务配置的都是 512;512*4*3=6k,
在#define configTOTAL_HEAP_SIZE                    ((size_t)15360)//15K
即使加上Freertos自身的空闲任务,15K完全是够了的.....

那感觉也不像是任务堆栈问题了???

有遇到类似情况的吗 望各位大佬指点迷津啦 谢谢!


回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2021-12-12
在线时间
10 小时
发表于 2022-9-3 12:38:22 | 显示全部楼层
单步调试 看看程序在哪一步出现了问题
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
 楼主| 发表于 2022-9-5 09:14:36 | 显示全部楼层
999aaa111 发表于 2022-9-3 12:38
单步调试 看看程序在哪一步出现了问题

我那测试机一直没出现这问题.......

20多台 跑一天 可能就一台出现问题

回复

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
发表于 2022-9-6 15:01:20 | 显示全部楼层
家里多搞几台测试机 看看会不会出问题 如果不会 从抗干扰下面找工夫
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 04:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表